2016-11-15 52 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会话之间。这两个值不需要保密。