Предположим, что у меня есть мобильное приложение Phonegap, и я хочу сохранить некоторые пользовательские данные (имя пользователя/pass_hash) в локальном индексированном db для обеспечения входа в приложение в автономном режиме. Я хочу зашифровать эти данные, конечно, и мое приложение уже использует CryptoJS. Как я понял, сначала мне нужно создать encryption_key по паролю с помощью PBKDF2, а затем просто зашифровать CryptoJS.AES. Пример кода:CryptoJS как генерировать ключ каждый раз?
function generateKey(p){
var salt = CryptoJS.lib.WordArray.random(128/8);
return CryptoJS.PBKDF2(p, salt, { keySize: 512/32, iterations: 1000 });
}
var pass = "test1";
var iv = CryptoJS.lib.WordArray.random(16);
key512Bits1000Iterations = generateKey(pass);
var encrypted = CryptoJS.AES.encrypt("Message", key512Bits1000Iterations, { iv: iv });
var decrypted = CryptoJS.AES.decrypt(encrypted, key512Bits1000Iterations, { iv: iv });
//decrypting with another key step
key512Bits1000Iterations2 = generateKey(pass);
var decrypted2 = CryptoJS.AES.decrypt(encrypted, key512Bits1000Iterations2, { iv: iv });
console.log("decrypted " + decrypted.toString(CryptoJS.enc.Utf8));
console.log("decrypted2 " + decrypted2.toString(CryptoJS.enc.Utf8));
Динамическая соль и IV используются. Но когда я второй раз создаю ключ для дешифрования по тому же паролю, я получаю неправильный результат. (Decrypted2 is empty) Итак, я хочу спросить, что я должен хранить между сеансами шифрования, salt и iv to? (Но как Я понял, что он должен быть динамичным) Спасибо!
Если вы используете соль для шифрования, вам нужно будет использовать такое же значение соли для дешифрования сообщения. –
Спасибо! Я также нашел хорошую статью https://crackstation.net/hashing-security.htm может быть кому-то полезен. – Maxim