我试图用密码-js和AES类型的加密来加密一些东西。
我遇到的问题是,每次加密时,我的加密值都是不同的。
使用这个简单的例子,我运行相同的加密5次不同的时间,我得到了5个不同的结果。Wtf要来这里吗?
task.js
var AES = require('crypto-js/aes');
var key = "abc123";
var secret = "encryptThisWord";
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());

发布于 2014-06-27 16:55:48
检查AES.encrypt(secret, key)的内容--它是一个有许多字段的对象,iv和salt表示特别感兴趣的内容(jsFiddle)。
每次运行AES.encrypt密码js时,都会选择新的IV和新的salt (顺便说一句,您可以提供自己的值)。随机IV意味着即使使用相同的密钥输出也会有所不同,而随机salt意味着实际的加密密钥也是不同的,因为它是从密码和salt派生的。
您可能(实际上应该)问,当加密密钥和IV都不同时,前十个Base64输出字符为什么是相同的?这是因为对加密结果调用toString()会将其转换为“OpenSSL兼容的字符串”,这基本上是Base64("Salted__" + salt + ciphertext),其中"Salted__"是常量前缀,当然,它在Base64输出中引导相同的前缀。
发布于 2020-01-28 18:57:36
我也面临着同样的问题。这仅仅是因为我们不知道算法的工作原理。简单地说,密钥和IV对于加密方法的每个调用都是不同的,如上面的答案所提到的。
要确保每次迭代的值完全相同,可以参考以下答案https://stackoverflow.com/a/47096284/4098272
或者,您可以使用SHA3函数并比较这两个哈希值。
https://stackoverflow.com/questions/24455810
复制相似问题