Laravel加密内容在React Native中解密失败,无法还原原内容
解决Laravel加密后React Native用CryptoJS解密失败的问题
问题根源分析
你的代码存在三个关键错误:
- 密钥不匹配:Laravel的
Crypt组件依赖.env中的APP_KEY作为加密密钥,该密钥是Base64编码的256位(32字节)字符串,而你使用的keylah = "test_saja"长度不足且不符合Laravel的密钥格式。 - 加密数据解析错误:Laravel的
Crypt::encryptString()返回的是Base64编码的JSON字符串,你需要先解码Base64再解析JSON,而非直接处理json.data。 - 解密后冗余处理:解密后的
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
相关产品推荐
相关产品推荐

