cryptojs: как создать парольную фразу AES
Я хочу создать 256-битный пароль для шифрования AES. Когда я проверяю пароль после шифрования, он отличается от моего первоначального пароля. Что я делаю не так? Или есть какой-то механизм безопасности, о котором я не знаю?
мой код:
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
это нормально или я делаю что-то неправильно здесь? Спасибо за помощь!
2 ответов
шифрование производится с помощью ключа, который представляет собой набор двоичных разрядов, а не пароль, который подразумевает читаемую строку.
чтобы перейти от пароля к ключу, можно использовать функцию вывода ключа на основе пароля, такую как 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.шифрование ("сообщение", ключ, { 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 });