Node中密码存储的加密最佳实践

时间:2014-10-22 23:45:37

标签: node.js cryptography passwords salt pbkdf2

我正在寻找一种简单,安全的解决方案,用于使用Node存储用户的密码。我是一名加密新手,但他一直试图通过在线研究将解决方案整合在一起。我正在寻找验证,我提出的是一个基本(不是银行,医院等)安全需求的Web应用程序的可靠解决方案。这是:

var crypto = require('crypto');
var SALT_LENGTH = 64;
var KEY_LENGTH = 64;
var ITERATIONS = 1000;

function createHashedPassword(plainTextPassword, cb) {
    crypto.randomBytes(SALT_LENGTH, function (err, salt) {
        console.time('password-hash');
        crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) {
            console.timeEnd('password-hash');
            return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS});
        });
    });
};

......以下是我做出的选择让我达到了这一点:

要使用哪种哈希算法?

基于this widely referenced article,看起来主要的竞争者是PBKDF2,bcrypt和scrypt。我选择了PBKDF2,因为它内置了Node。

使用什么样的盐?

This stack overflow answer似乎是我能找到的最直接的答案。我仍然不太清楚为什么64字节是正确的盐大小。当我google时,我得到了this之类的其他堆栈交换答案,但我不确定它是否适用于Node算法?在这里完全混淆,针对使用此节点功能的新手的解释将是非常棒的。

使用什么密钥长度?

再一次,我在很大程度上基于the same answer as above做出了选择,但我对“为什么'”的基本知识一模糊。答案说,生成小于输入的密钥是一种浪费,因此使用至少64字节'。咦?再一次,一个实际的解释会有所帮助。

要使用多少次迭代?

对于这个问题,我的选择是this stack exchange answer。我不太了解它,但我确实认为该算法大约需要8ms。所以,正如你所看到的那样,我将定时器放在函数上,并调整了我的迭代次数,以便在我的机器上进行调整。

谢谢!

2 个答案:

答案 0 :(得分:6)

NPM包credential处理所有这些

您可以在书籍Programming Javascript Applications

中看到作者的内容

答案 1 :(得分:2)

我强烈建议使用 BCrypt 。算法有很多优点,大多数实现都会为您处理所有这些问题。

this answer中所述:

  

Bcrypt拥有加密算法可以实现的最佳声誉:它已经存在了相当长的一段时间,使用相当广泛,并引起了人们的注意,并且迄今为止仍然没有中断。 / p>

我已经写了一篇关于如何在node / express以及其他框架中实现BCrypt的详细文章:http://davismj.me/blog/bcrypt