【问题标题】:CryptoJS PBKDF2 and salt hash method not workingCryptoJS PBKDF2 和盐哈希方法不起作用
【发布时间】:2017-09-16 15:58:47
【问题描述】:

我正在尝试使用 PBKDF2 和 CryptoJS 的盐哈希来存储我的密码。这是我从注册中散列用户密码的部分:

var passwordInput = document.getElementById("txtPasswordInput").value;
var salt = CryptoJS.lib.WordArray.random(128/8);
var key512Bits1000Iterations = CryptoJS.PBKDF2(passwordInput, salt, { keySize: 512/32, iterations: 1000 });

console.log(salt.toString());
console.log(key512Bits1000Iterations.toString());

使用 abcd1234 作为密码,我设法将这些存储到我的数据库中:

Salt: cec16a7e68e0f3e49f729dfd90b0893a
Password: d974b96a494f39aec7f1fa6c495b4783b43e579c070b695...

在我的登录页面,我试图根据用户输入再次计算哈希值以验证凭据:

var passwordInput = document.getElementById("txtPassword").value;
// retrieve from firebase
var password = accountData.password;
var salt = accountData.salt;
var key512Bits1000Iterations = CryptoJS.PBKDF2(passwordInput, salt, { keySize: 512/32, iterations: 1000 });
console.log(salt.toString());
console.log(key512Bits1000Iterations.toString());

if(password != key512Bits1000Iterations){
console.log('wrong');
}else{
console.log('correct');
}

但是,它一直让我“错误”。我打印了散列密码,但它们都不同。

此外,在我按下注册或登录按钮后,哈希算法实际上需要一段时间来计算,然后我的浏览器才会再次响应。该算法是否设计为计算速度慢?任何想法如何克服这个问题?

有什么想法吗?谢谢!

【问题讨论】:

    标签: javascript hash salt cryptojs


    【解决方案1】:

    在登录页面,盐需要被解析为十六进制。

    是的,PBKDF2 的设计速度很慢。您可以以安全为代价通过更少的迭代来加速它。

    【讨论】:

    • 有什么理由将盐解析为十六进制?抱歉,我对密码学领域有点陌生。另外,在这种情况下,就速度性能和安全目的而言,期望和可接受的迭代范围是多少?
    • @guest176969 1. 使用十六进制可能是一种处理二进制数据的Javascript方式。 2.合理的速度是100ms左右的CPU时间。
    • 您在将盐保存到数据库时将其序列化为十六进制字符串,所以现在您需要从十六进制字符串中对其进行反序列化。
    • @zaph 嗯,如果我将迭代次数减少到 500 次可以吗?就像期望的迭代次数一样
    • 普遍接受的时间是100ms左右的CPU时间。这是为了让攻击者花费足够的时间,暴力破解密码是不划算的。它还认为攻击者将拥有速度更快的定制硬件。关键是在某种程度的攻击时间,电力成本大于密码的价值。整个计划很弱,但我们能做到最好,我们需要尽最大努力保护我们的用户。
    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 2018-01-18
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2012-08-21
    相关资源
    最近更新 更多