我非常沮丧地浪费了很多时间试图使用CryptoJS加密某些东西,过了一段时间后,我意识到每次加密结果都是不同的输入!怎么可能呢?
这是我的代码,您可以检查是否为真: https://jsfiddle.net/z5dg623q/1/
.lastIndexOf()
有人能帮助我吗?
答案 0 :(得分:4)
当您将两个字符串传递到CryptoJS.<Cipher>.encrypt()
时,您告诉CryptoJS使用基于密码的加密。它将假设第一个字符串是UTF-8编码数据,第二个字符串是密码,它将通过MD5发送以获得256位密钥和128位IV。这是由所谓的EvpKDF(参见1和2)和随机盐完成的(参见here)。
这意味着在每次调用时,代码都会生成一个新的随机盐,然后每次使用它来导出不同的密钥和IV,每次都会产生不同的密文。此属性称为语义安全性,可防止例如攻击者仅通过查看密文来确定明文是否相等。这有时是一个重要的安全属性。
当您在toString()
结果上调用encrypt()
时,它会将密文序列化为包含salt的OpenSSL兼容格式。所以你只需要密码和这个字符串来解密它。
当您尝试解密时,密文中的salt和密码用于派生与用于加密的密钥和IV相同的密钥。因此它可以恢复原始明文。如果使用了错误的密码,结果将为空或者是乱码。
答案 1 :(得分:0)
我遇到了同样的问题。这仅仅是由于我们不知道算法的工作原理。简而言之,每次调用加密方法时,密钥和IV都是不同的,正如上述Artjom B的回答中所述。
要确保每次迭代的值完全相同-您可以参考此答案 https://stackoverflow.com/a/47096284/4098272
或者,您可以使用SHA3函数并比较两个哈希值。