You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Crypto-JS加解密异常:解密返回十六进制而非明文求助

问题排查与解决:Crypto-JS解密返回十六进制而非明文

我一眼就看出问题出在你调用toString()时用错了参数!你写的是CryptoAES.Utf8,但实际上Utf8编码器属于Crypto-JS的核心模块,并不是AES子模块的属性。

问题根源

你导入的CryptoAES只是Crypto-JS的AES加密解密子模块,Utf8并不在这个子模块里——换句话说,CryptoAES.Utf8的值其实是undefined。当toString()方法接收到undefined参数时,会默认以十六进制格式输出结果,这就是你看到6d79206d657373616765(恰好是'my message'的十六进制编码)的原因。

修正方案

你需要导入Crypto-JS的核心模块(或者直接使用全局CryptoJS对象,如果你是通过script标签引入库的话),然后用CryptoJS.Utf8作为toString()的参数。

修正后的ES模块代码:

import CryptoJS from 'crypto-js';
import CryptoAES from 'crypto-js/aes';

componentDidMount(){
 var ciphertext = CryptoAES.encrypt('my message', 'secret key 123');
 var _ciphertext = CryptoAES.decrypt(ciphertext, 'secret key 123');
 // 改用核心模块的Utf8编码器
 console.log(_ciphertext.toString(CryptoJS.Utf8));
}

传统script引入场景的简化代码:

componentDidMount(){
 var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123');
 var _ciphertext = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');
 console.log(_ciphertext.toString(CryptoJS.Utf8));
}

额外提醒

Crypto-JS的encrypt方法默认使用PBKDF2进行密钥派生,如果你的加密场景有更高的安全性要求,建议手动指定密钥派生算法、IV(初始化向量)等参数,避免依赖默认配置带来的潜在风险。

内容的提问来源于stack exchange,提问作者S.M_Emamian

火山引擎 最新活动