每次使用AES时,Crypto-js都会返回不同的值

时间:2014-06-27 15:43:31

标签: javascript node.js encryption cryptojs

我正在尝试使用crypto-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());

enter image description here

2 个答案:

答案 0 :(得分:9)

检查AES.encrypt(secret, key)的内容 - 它是一个包含多个特定兴趣字段ivsalt的对象(jsFiddle)。

每次运行AES.encrypt加密-js选择新的IV和新盐(顺便提一下,你可以提供自己的值)。随机IV意味着即使使用相同的密钥,输出也会不同,随机盐意味着实际的加密密钥也不同,因为它来自密码和盐。

当加密密钥和IV都不同时,您可能(实际上应该)询问为什么前十个Base64输出字符是相同的?这是因为在ecnryption结果上调用toString()会将其转换为" OpenSSL兼容的字符串",这基本上是Base64("Salted__" + salt + ciphertext),其中"Salted__"是常量前缀,其中当然,在Base64输出中引导相同的前缀。

答案 1 :(得分:0)

我遇到了同样的问题。这仅仅是由于我们不知道算法的工作原理。简而言之,对于每次加密方法的调用,密钥和IV都不相同,如上面的答案所述。

要确保每次迭代的值完全相同-您可以参考此答案https://stackoverflow.com/a/47096284/4098272

或者,您可以使用SHA3函数并比较两个哈希值。