我正在使用CryptoJS来加密一些用户名和密码,我认为它运行良好。
但我对加密数据明文有一些疑问。
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加密站点上,我得到了非常不同的结果,加密数据不会一直变化。
答案 0 :(得分:2)
那是对的。 CryptoJS使用OpenSSL专有格式。如果它使用盐渍密码来获取密钥,则它在前面具有魔术值。例如。您的第一个base64转换为
53616C7465645F5F C1B21326DAFFC3700E9F9014063ECB3AC4A6BD053C82F20D
以十六进制表示。鉴赏家会立即将前8个字节识别为ASCII,
Salted__ | C1B21326DAFFC370 0E9F9014063ECB3AC4A6BD053C82F20D
所以你拥有的是8字节的魔法,然后是8字节的盐,然后是密文。
实际的密钥和IV来自代码中的key
(实际上被解释为密码)。由于盐总是随机的,因此派生密钥和IV也是如此。这是它应该如何,否则你可以区分以(或完全相同)开头的明文与其他明文。