【问题标题】:Crypt in laravel Decrypt in react native Error在 laravel 中加密解密反应本机错误
【发布时间】:2021-12-09 17:40:01
【问题描述】:

我正在用 reactnative 和 laravel 创建一个应用,

所以我在 laravel 中的代码正在创建一个带有加密数据的二维码并将其发送到我的前端 (Reactjs),

当我尝试使用 Crypto js 在本机反应中解密时,它会添加一些我没有在后端添加的字符,

我将展示所有功能和示例,

//laravel 中的代码加密我的二维码信息

 $unix =time();     
 $unix_hashed =  Crypt::encrypt($unix);
 return  QrCode::size(100)->generate($unix_hashed);

// 与cryptojs反应本机代码用于解密

var key = '6AhFLqwlExB9tn2Twql62EtbFDqBEv+S7tXW3h6a/0o=';
let  encrypted = atob(data);
encrypted = JSON.parse(encrypted);
const iv = CryptoJS.enc.Base64.parse(encrypted.iv);
const value = encrypted.value;
key = CryptoJS.enc.Base64.parse(key);
var decrypted = CryptoJS.AES.decrypt(value, key, {
    iv: iv
  });
decrypted = decrypted.toString(CryptoJS.enc.Utf8);

// 控制台输出示例:

this is my output

但问题应该是这样的:

我:1634986874;

"" & i & : & ;是多余的

谁能帮帮我

谢谢

【问题讨论】:

    标签: javascript reactjs laravel react-native cryptojs


    【解决方案1】:

    Crypt::encrypt() 默认在 CBC 模式下使用 AES-256,s。 here.

    在加密之前,通过调用 PHP 函数serialize() 对明文进行序列化,生成值的可存储表示。例如,serialize(1635015182) 返回i:1635015182;serialize('Hello world') 返回s:11: "Hello world";。序列化数据中,i表示整数,s:11表示11个字符的字符串。

    如果使用Crypt::decrypt()进行解密,则在解密后调用unserialize(),将数据反序列化并恢复为原始明文。

    使用其他库解密时,例如 CryptoJS,不进行反序列化,因此返回序列化后的明文。因此,必须在此处手动进行反序列化。

    幸运的是,有 locutus 库为 JavaScript 提供 PHP 功能的端口,所以 unserialize() 也可以在 JavaScript/NodeJS 下毫不费力地执行:

    var CryptoJS = require('crypto-js');
    var atob = require('atob');
    var unserialize = require('locutus/php/var/unserialize')
    
    // ciphertext from Crypt::encrypt()
    var data = "eyJpdiI6IkYyaDhxenFJM0FjaW56TW83NkpuNHc9PSIsInZhbHVlIjoiNzhSeUs5em1WblpaRWk2OVBWVURnUT09IiwibWFjIjoiODg1NGFkOTk0MGVjMjIxODAyNzExOTgxYjhiMDM4YjliMmM5NzE5Mjc0YzFmNDVlMWU1MWRkMTQ2N2Q5ODdmNCJ9"
    
    var key = '6AhFLqwlExB9tn2Twql62EtbFDqBEv+S7tXW3h6a/0o=';
    let  encrypted = atob(data);
    encrypted = JSON.parse(encrypted);
    const iv = CryptoJS.enc.Base64.parse(encrypted.iv);
    const value = encrypted.value;
    key = CryptoJS.enc.Base64.parse(key);
    var decrypted = CryptoJS.AES.decrypt(value, key, {
        iv: iv
      });
    decrypted = decrypted.toString(CryptoJS.enc.Utf8);
    
    // unserialize
    console.log(decrypted); // i:1635015182;
    console.log(unserialize(decrypted)); // 1635015182 
    

    最后一行的unserialize()调用恢复了原来的明文。


    请注意encrypted.mac 包含一个用于检查数据完整性的 MAC。 Here 你可以找到 Crypt::encrypt() 的 PHP 实现。

    【讨论】:

    • 非常感谢您的回答,它 100% 正确,我的代码现在已正确解密,非常感谢您,先生!
    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2017-08-30
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多