我正在尝试使用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());
答案 0 :(得分:9)
检查AES.encrypt(secret, key)
的内容 - 它是一个包含多个特定兴趣字段iv
和salt
的对象(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函数并比较两个哈希值。