You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel加密内容在React Native中解密失败,无法还原原内容

解决Laravel加密后React Native用CryptoJS解密失败的问题

问题根源分析

你的代码存在三个关键错误:

  1. 密钥不匹配:Laravel的Crypt组件依赖.env中的APP_KEY作为加密密钥,该密钥是Base64编码的256位(32字节)字符串,而你使用的keylah = "test_saja"长度不足且不符合Laravel的密钥格式。
  2. 加密数据解析错误:Laravel的Crypt::encryptString()返回的是Base64编码的JSON字符串,你需要先解码Base64再解析JSON,而非直接处理json.data。
  3. 解密后冗余处理:解密后的decrypted本身就是WordArray类型,无需手动创建CipherParams,直接转字符串即可。

修正后的代码

步骤1:获取Laravel的有效密钥

从Laravel项目的.env文件中复制APP_KEY(格式类似base64:xxxxxx...),去掉前缀base64:,剩余部分就是前端需要的Base64密钥。

步骤2:React Native端修正后的解密代码

// 替换为你的Laravel APP_KEY(去掉base64:前缀)
const laravelAppKey = "你的APP_KEY内容";
// Laravel接口返回的加密字符串
const encryptedString = json.data;

try {
    // 1. 解码Base64得到Laravel加密的JSON结构
    const decodedBase64 = CryptoJS.enc.Base64.parse(encryptedString).toString(CryptoJS.enc.Utf8);
    const encryptedData = JSON.parse(decodedBase64);

    // 2. 解析IV和密文
    const iv = CryptoJS.enc.Base64.parse(encryptedData.iv);
    const ciphertext = CryptoJS.enc.Base64.parse(encryptedData.value);

    // 3. 解析Laravel的Base64密钥
    const key = CryptoJS.enc.Base64.parse(laravelAppKey);

    // 4. AES解密(匹配Laravel默认的AES-256-CBC、PKCS7填充)
    const decrypted = CryptoJS.AES.decrypt(
        { ciphertext: ciphertext },
        key,
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    );

    // 5. 转换为明文字符串
    const decryptedString = decrypted.toString(CryptoJS.enc.Utf8);
    console.log("解密结果:", decryptedString); // 输出hello world
} catch (error) {
    console.error("解密失败:", error);
}

关键注意事项

  • Laravel默认加密算法为AES-256-CBC,前端必须保持算法、填充方式一致。
  • 确保前后端使用的密钥完全匹配(即Laravel APP_KEY去掉base64:前缀后的值)。
  • Laravel加密数据包含iv、value、mac三个字段,解密仅需iv和value,mac可用于前端验证数据完整性(可选)。

内容的提问来源于stack exchange,提问作者oken riupassa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:45:38