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

Cat*_*ish 8 javascript encryption node.js 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());
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Ole*_*hin 12

检查内容AES.encrypt(secret, key)- 它是一个具有许多字段ivsalt特别感兴趣的对象(jsFiddle).

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

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