2016-11-15 51 views
0

假設我有一個PhoneGap移動應用程序,並且我想在本地索引數據庫中存儲一些用戶數據(username/pass_hash),以提供離線應用程序登錄。 我想加密那些數據當然,我的應用程序已經使用CryptoJS。 據我所知,首先我需要通過使用PBKDF2的密碼來生成encryption_key,然後只是加密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。 (解密2是空的) 所以我想問一下,我應該在加密會話之間存儲什麼, salt和iv之間的關係嗎?(但是作爲第二次生成密鑰的解密是通過相同的密碼進行的我理解它應該是動態的) 謝謝!

+0

如果您使用salt進行加密,則需要使用相同的salt值來解密郵件。 –

+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會話之間。這兩個值不需要保密。