【问题标题】:CryptoJS AES pattern always ends with =CryptoJS AES 模式总是以 = 结尾
【发布时间】:2014-08-13 14:05:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • davidebarranca.com/2012/10/… 看看这篇文章。行为的解释在密码部分给出,我将其作为评论发布,因为我不是专家,可能有人会更好地描述它。
  • This 看起来可能相关?

标签: javascript encryption cryptography aes cryptojs


【解决方案1】:

没错。 CryptoJS 使用 OpenSSL 专有格式。如果它使用加盐密码来派生密钥,那么它前面有一个神奇的值。例如。你的第一个 base64 翻译成

 53616C7465645F5F C1B21326DAFFC3700E9F9014063ECB3AC4A6BD053C82F20D

十六进制。行家会立即认出前 8 个字节为 ASCII,

 Salted__ | C1B21326DAFFC370 0E9F9014063ECB3AC4A6BD053C82F20D

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

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

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2014-01-30
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多