我正在寻找一个简单、安全、使用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});
});
});
};...and,以下是我所做的选择,让我到了这一点:
使用什么散列算法?
基于这篇被广泛引用的文章,看起来领先的竞争者是PBKDF2、bcrypt和scrypt。我之所以选择PBKDF2,是因为它在Node中提供了支持。
使用什么盐大小?
此堆栈溢出响应似乎是我能找到的最直接的答案。我仍然不太清楚为什么64字节是正确的盐分大小。当我搜索时,我得到了其他堆栈交换答案,如这,但我不确定它是否适用于Node算法?在这里,一个针对新手使用这个Node函数的解释将是非常棒的。
使用什么密钥长度?
再一次,我在很大程度上是基于与上述相同的答案来选择的,但我还是对“为什么”的基本知识感到迷惑不解。答案是:“生成比输入小的键是一种浪费,所以至少要使用64个字节”。哈?再一次,一个实际的解释将是有益的。
要使用多少次迭代?
对于这个问题,我选择的基础是这个堆栈交换答案。我不太明白,但我确实明白,算法大约需要8ms。所以,正如你所看到的,我把计时器放在函数上,我调整了迭代,让它在我的机器上的大概位置。
谢谢!
发布于 2014-10-23 00:04:49
NPM包凭据处理所有这些
你可以在“编写Javascript应用程序”一书中看到作者在上面写的文章
发布于 2016-01-28 20:43:15
我强烈建议使用BCrypt。该算法有许多优点,而且大多数实现都为您处理所有这些问题。
如这个答案所述
Bcrypt具有密码算法所能达到的最好的声誉:它已经存在了很长一段时间,使用非常广泛,“吸引了人们的注意”,但至今仍未被打破。
我写了一篇关于如何在节点/表达式以及其他框架中实现BCrypt的详细文章:http://davismj.me/blog/bcrypt
https://stackoverflow.com/questions/26519031
复制相似问题