使用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




