CryptoJS AES模式始终以=结尾

时间:2014-08-13 14:05:34

标签: javascript encryption cryptography aes cryptojs

我正在使用CryptoJS来加密一些用户名和密码,我认为它运行良好。

但我对加密数据明文有一些疑问。

  1. 无论密钥或数据是什么,它始终以“U2FsdGVkX1 ......”开头。
  2. 即使输入数据保持不变,加密数据也会不断变化,如下所示:
  3.   

    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加密站点上,我得到了非常不同的结果,加密数据不会一直变化。

1 个答案:

答案 0 :(得分:2)

那是对的。 CryptoJS使用OpenSSL专有格式。如果它使用盐渍密码来获取密钥,则它在前面具有魔术值。例如。您的第一个base64转换为

 53616C7465645F5F C1B21326DAFFC3700E9F9014063ECB3AC4A6BD053C82F20D

以十六进制表示。鉴赏家会立即将前8个字节识别为ASCII,

 Salted__ | C1B21326DAFFC370 0E9F9014063ECB3AC4A6BD053C82F20D

所以你拥有的是8字节的魔法,然后是8字节的盐,然后是密文。

实际的密钥和IV来自代码中的key(实际上被解释为密码)。由于盐总是随机的,因此派生密钥和IV也是如此。这是它应该如何,否则你可以区分以(或完全相同)开头的明文与其他明文。