【问题标题】:CryptoJS how to generate a key every time?CryptoJS如何每次都生成一个密钥?
【发布时间】:2016-11-15 18:44:06
【问题描述】:

假设我有一个 Phonegap 移动应用程序,我想在本地索引数据库中存储一些用户数据(用户名/pass_hash),以便离线登录到应用程序。 我当然想加密这些数据,而且我的应用程序已经使用 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 为空) 所以我想问一下,我应该在加密会话之间存储什么, salt 和 iv 到?(但据我所知,它应该是动态的) 谢谢!

【问题讨论】:

  • 如果您使用 salt 进行加密,那么您需要使用相同的 salt 值来解密消息。
  • 谢谢!我还发现了一篇好文章crackstation.net/hashing-security.htm可能对某人有用。

标签: javascript cordova encryption cryptojs


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 2016-05-20
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2020-08-17
    • 2020-05-01
    • 2019-08-21
    相关资源
    最近更新 更多