Javascript Crypto js每次返回不同的值';在使用AES时运行

Javascript Crypto js每次返回不同的值';在使用AES时运行,javascript,node.js,encryption,cryptojs,Javascript,Node.js,Encryption,Cryptojs,我正在尝试使用crypto js和AES类型的加密来加密某些东西 我遇到的问题是,每次加密时,我的加密值都不同 在这个简单的例子中,我运行相同的加密5次,得到5个不同的结果。世跆联在这里进行什么 task.js var AES = require('crypto-js/aes'); var key = "abc123"; var secret = "encryptThisWord"; console.log(AES.encrypt(secret, key).toString()); conso

我正在尝试使用crypto js和AES类型的加密来加密某些东西

我遇到的问题是,每次加密时,我的加密值都不同

在这个简单的例子中,我运行相同的加密5次,得到5个不同的结果。世跆联在这里进行什么

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());

检查AES.encrypt(secret,key)的内容-它是一个具有多个字段的对象,
iv
salt
,具有特殊的兴趣()

每次运行AES.encrypt时,crypto js都会选择new IV和new salt(顺便说一下,您可以提供自己的值)。Random IV意味着即使使用相同的密钥,输出也会不同,而Random salt意味着实际的加密密钥也不同,因为它是从密码短语和salt派生的


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

我面临同样的问题。这仅仅是因为我们不知道算法的工作原理。简单地说,密钥和IV对于加密方法的每次调用都是不同的,如上面的回答所述

为了确保每次迭代的值完全相同,您可以参考这个答案


或者,您可以使用SHA3函数比较两个散列值。

可能每次都会生成一个随机初始化向量。