我想为我的AES加密生成一个256位密码。当我在加密后检查密码时,它与我的初始密码不同。我做错了什么?还是有一些我不知道的安全机制?
我的代码:
password=Generate_key();
var encrypted = CryptoJS.AES.encrypt("Message", password);
//Those two should be the same
document.write(password+"<br>");
document.write(encrypted.key);
function Generate_key() {
var key = "";
var hex = "0123456789abcdef";
for (i = 0; i < 64; i++) {
key += hex.charAt(Math.floor(Math.random() * 16));
//Initially this was charAt(chance.integer({min: 0, max: 15}));
}
return key;
}
输出即
0b05308c9a00f07044416bad7a51bacd282fc5c0c999551a4ff15c302b268b20 4DF875993770411044FB35953166EE7833c32CA0741E9FEC091DFA10138039E8
这正常还是我在这里做错了什么?感谢您的帮助!
加密是用密钥完成的,密钥是一组二进制位,而不是密码,这意味着人类可读的字符串。
要从密码到密钥,可以使用基于密码的密钥派生函数,例如PBKDF2。 Crypto-JS已经内置了一个PBKDF2函数,即
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
<script>
var salt = CryptoJS.lib.WordArray.random(128/8);
var key128Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 128/32 });
var key256Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 });
var key512Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32 });
var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 });
</script>
通常,使用尽可能高的迭代计数。
Salt 应该是一个随机值,如上例所示;当然,您需要将该值与迭代计数一起存储,以便在给定相同密码短语的情况下获得相同的密钥。
我找到了解决方案。您可以使用以下方法定义自己的密钥var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });
所以我的源代码是:
key=CryptoJS.enc.Hex.parse(Generate_key());
iv=CryptoJS.enc.Hex.parse(Generate_key());
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });