【发布时间】:2017-09-23 23:35:01
【问题描述】:
我相信因为传递给 AES.encrypt 的密钥是一个字符串,所以该函数会自动生成一个 IV。那么下面的代码是否会生成安全的 string_to_encrypt 加密版本?
pass = document.getElementById('pass').value; // user entered pwrd salt = 'some system determined salt';
its = 9000 + getKeyIterationModifier(pass); // iterations depend on pass
key = CryptoJS.PBKDF2(pass, salt, { keySize: 512/32, iterations: its });
encrypted = CryptoJS.AES.encrypt(string_to_encrypt, key.toString());
或者我应该添加“模式”和“填充”值来进一步强化它吗?如果有,目前的行业标准值是多少?
换句话说,我是否应该在理想情况下使用 以下的东西(如果是自动完成的,也许没有 iv),如果是这样的话,什么是理想的:
key = CryptoJS.enc.Base64.parse(key);
encrypted = CryptoJS.AES.encrypt(string_to_encrypt, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
【问题讨论】:
-
您确定用户输入的是“密钥”而不是“密码”吗?请参阅 point #6 并注意博客中的“基于 MD5 的糟糕算法”链接指向 @ArtjomB 撰写的 StackOverflow 帖子。 (回复您帖子的同一个人)。
-
编辑的代码示例。用户确实在输入密码 - 根据您链接到的博客中的第 6 点,我正在使用 PBKDF2 将其转换为正确意义上的“密钥”。我现在已经编辑了第二个 sn-p,这样它就可以工作了——注意我必须对“密钥”进行编码才能使其工作;否则 JS 会发脾气。
-
@Claud 看起来更好,因为您正在使用自己的 PBKDF2 来弥补 CryptoJS 问题。唯一我不知道的是你是如何选择盐的。盐不应该是静态的,需要每次随机选择。此外,盐也不是秘密。您需要在解密时检索与以前相同的盐。
-
目前我每次都使用相同的盐,从密码生成密钥。 (然后密钥被分成两部分,一半用于加密,一半用于 mac。加密过程每次都使用一个唯一的 iv,那么在这种情况下,这不是我的“盐”吗?(顺便说一句,TY 为您提供帮助! )
-
@Claud 不,很遗憾没有。密码的整个问题在于人们不善于选择密码,因此软件需要帮助确保如果两个人选择相同的密码(经常发生),那么他们不会得到相同的密钥。 salt 解决的问题与 IV 不同(salt 用于密钥安全,IV 用于加密安全)。请参阅crypto 101 的第 119 页。
标签: javascript aes padding cryptojs pbkdf2