我正在寻找一个简单、安全的解决方案来存储使用节点的用户密码。我是一个密码初学者,但一直在尝试从网上的研究中拼凑出一个解决方案。我正在寻找一个验证,我所提出的是一个具有基本(而不是银行、医院等)安全需求的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是因为它在节点中有内置的支持。
要用多大的盐?
似乎是我能找到的最直接的答案。但我仍然不太清楚为什么64字节是正确的salt大小。当我在谷歌周围搜索时,我会得到其他堆栈交换答案,如This stack overflow answer,但我不确定它是否适用于节点算法?这里完全混淆了,一个针对初学者使用这个节点函数的解释是非常棒的。
要使用的密钥长度是多少?
再一次,我的选择很大程度上是基于“为什么”,但我对“为什么”的基本概念也很模糊。答案是“生成小于输入的密钥是浪费,所以至少使用64字节”。呵呵?再一次,一个实际的解释是有帮助的。
要使用多少次迭代?
对于这个问题,我的选择基于this。我不太明白,但我确实知道算法大概需要8毫秒。所以,正如你所看到的,我把计时器放在函数上,我调整了我的迭代,把它放在我的机器上。
谢谢!
最佳答案
NPM包处理所有这些
你可以在书中看到作者对它的描述credential