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

Laravel Crypt加密数据在React Native用CryptoJS解密出现多余字符问题

问题原因与解决方案

问题根源

  • Laravel 内置的Crypt::encrypt()方法加密数据时,会默认对输入数据执行PHP序列化操作:你加密的是整型时间戳,序列化后会生成i:1634986874;格式的字符串;如果加密的是字符串类型时间戳,序列化结果为s:10:"1634986874;",这就是你解密后出现额外的i、冒号、分号、引号的核心原因。
  • 你前端直接解密拿到的是序列化后的原始内容,没有执行反序列化操作,所以会出现多余字符。

注意:请确认你前端使用的key和Laravel项目.env里的APP_KEY值完全一致,APP_KEY开头的base64:前缀需要去掉后再给前端使用,否则会出现解密错误。

解决方案

方案1(推荐,仅修改后端代码)

Laravel 7及以上版本提供了Crypt::encryptString()方法,专门用于加密字符串,不会触发PHP序列化逻辑,直接加密原始内容。
把后端加密代码修改为:

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

修改后前端现有解密逻辑不需要调整,解密结果直接就是纯数字时间戳字符串,无多余字符。

方案2(不修改后端,仅调整前端代码)

如果无法修改后端代码,可以在前端解密后对序列化字符串做内容提取:

// 原有解密逻辑不变
decrypted = decrypted.toString(CryptoJS.enc.Utf8);
// 新增:提取序列化内容中的实际值
// 匹配整型序列化格式
const timestamp = decrypted.match(/^i:(\d+);$/)?.[1];
// 如果是字符串序列化格式用这个:const timestamp = decrypted.match(/^s:\d+:"(\d+)";$/)?.[1];

提取后得到的timestamp就是你需要的纯时间戳内容。

内容的提问来源于stack exchange,提问作者hamza arhandouri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:45:07