2016-11-15 2 views
0

Предположим, что у меня есть мобильное приложение 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? (Но как Я понял, что он должен быть динамичным) Спасибо!

+0

Если вы используете соль для шифрования, вам нужно будет использовать такое же значение соли для дешифрования сообщения. –

+1

Спасибо! Я также нашел хорошую статью https://crackstation.net/hashing-security.htm может быть кому-то полезен. – Maxim

ответ

0

Вы создаете новую соль в generateKey(...). Это делает PBKDF2 получил новый ключ.

function generateKey(p){ 
    var salt = CryptoJS.lib.WordArray.random(128/8); 
    return CryptoJS.PBKDF2(p, salt, { keySize: 512/32, iterations: 1000 });  
} 

Вы должны хранить соли и IV между сессиями. Эти два значения не обязательно должны быть секретными.

Смежные вопросы