Javascript CryptoJS如何每次生成密钥?

Javascript CryptoJS如何每次生成密钥?,javascript,cordova,encryption,cryptojs,Javascript,Cordova,Encryption,Cryptojs,假设我有一个Phonegap移动应用程序,我想在本地索引数据库中存储一些用户数据(用户名/密码散列),以便离线登录到应用程序。 我当然想加密这些数据,我的应用程序已经使用了CryptoJS。 据我所知,首先我需要使用PBKDF2通过密码生成加密密钥,然后只加密CryptoJS.AES。 示例代码: function generateKey(p){ var salt = CryptoJS.lib.WordArray.random(128/8); return CryptoJS.PBKDF2(p,

假设我有一个Phonegap移动应用程序,我想在本地索引数据库中存储一些用户数据(用户名/密码散列),以便离线登录到应用程序。 我当然想加密这些数据,我的应用程序已经使用了CryptoJS。 据我所知,首先我需要使用PBKDF2通过密码生成加密密钥,然后只加密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为空) 所以我想问,加密会话之间应该存储什么, 盐和iv到?(但据我所知,它应该是动态的)
谢谢

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

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

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

如果使用salt进行加密,则需要使用完全相同的salt值来解密消息。谢谢!我还发现一篇好文章可能对某人有用。