我正在寻找一种简单,安全的解决方案,用于使用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。所以,正如你所看到的那样,我将定时器放在函数上,并调整了我的迭代次数,以便在我的机器上进行调整。
谢谢!
答案 0 :(得分:6)
NPM包credential处理所有这些
中看到作者的内容答案 1 :(得分:2)
我强烈建议使用 BCrypt 。算法有很多优点,大多数实现都会为您处理所有这些问题。
如this answer中所述:
Bcrypt拥有加密算法可以实现的最佳声誉:它已经存在了相当长的一段时间,使用相当广泛,并引起了人们的注意,并且迄今为止仍然没有中断。 / p>
我已经写了一篇关于如何在node / express以及其他框架中实现BCrypt的详细文章:http://davismj.me/blog/bcrypt