我正在使用CryptoJS加密一些用户名和密码,我认为它已经足够好了。
但是我对加密的数据纯文本有一些疑问。
无论键或数据是什么,它始终以“ U2FsdGVkX1 ...”开头。
即使输入数据保持不变,加密的数据也会不断变化,如下所示:
U2FsdGVkX1 / BshMm2v / DcA6fkBQGPss6xKa9BTyC8g0 =
U2FsdGVkX1 / uc5OTSD7CfumdgqK1vN2LU4ISwaQsTQE =
U2FsdGVkX1 / 8OOLOTZlfunN4snEVUdF2ugiL7SeAluE =
U2FsdGVkX1 + c8j3l1NRBJDb1byHwOmmNSmbTci22vsA =
username_encrypted = CryptoJS.AES.encrypt(username, key);
password_encrypted = CryptoJS.AES.encrypt(password, key);
console.log(username_encrypted.toString());
console.log(password_encrypted.toString());
console.log(CryptoJS.AES.decrypt(username_encrypted, key).toString(CryptoJS.enc.Utf8));
console.log(CryptoJS.AES.decrypt(password_encrypted, key).toString(CryptoJS.enc.Utf8));
这是应该工作的方式还是我做错了什么?因为在某些在线AES加密站点上我得到的结果截然不同,所以加密的数据不会一直保持不变。
最佳答案
没错CryptoJS使用OpenSSL专有格式。如果它使用加密的密码来派生密钥,则其前面具有魔术值。例如。您的第一个base64转换为
53616C7465645F5F C1B21326DAFFC3700E9F9014063ECB3AC4A6BD053C82F20D
十六进制。鉴赏家会立即将前8个字节识别为ASCII,
Salted__ | C1B21326DAFFC370 0E9F9014063ECB3AC4A6BD053C82F20D
因此,您首先拥有的是8字节魔术,然后是8字节盐,然后是密文。
实际的密钥和IV源自代码中的
key
(实际上被解释为密码短语)。由于盐总是随机的,因此派生的密钥和IV也是如此。这就是应该这样的方式,否则您就可以区别以其他明文开头(或完全相同)的明文。