Javascript Crypto js每次返回不同的值';在使用AES时运行
我正在尝试使用crypto js和AES类型的加密来加密某些东西 我遇到的问题是,每次加密时,我的加密值都不同 在这个简单的例子中,我运行相同的加密5次,得到5个不同的结果。世跆联在这里进行什么 task.jsJavascript 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
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函数比较两个散列值。可能每次都会生成一个随机初始化向量。