CryptoJS每次如何生成密钥?

时间:2016-11-15 09:22:34

标签: javascript cordova encryption cryptojs

假设我有一个Phonegap移动应用程序,我想在本地索引数据库中存储一些用户数据(用户名/ pass_hash),以便在离线状态下提供对应用程序的登录。 我想加密那些数据当然,我的应用已经使用了CryptoJS。 据我所知,首先我需要使用PBKDF2通过密码生成encryption_key,然后只加密CryptoJS.AES。 示例代码:

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为空) 所以我想问一下,我应该在加密会话之间存储什么, 盐和静脉注射?(但据我所知它应该是动态的) 谢谢!

1 个答案:

答案 0 :(得分:0)

您正在generateKey(...)中生成新的盐。这使 PBKDF2 派生出一个新密钥。

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

您需要在会话之间存储 salt iv 。这两个值不需要保密。