首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >节点中密码存储的密码学最佳实践

节点中密码存储的密码学最佳实践
EN

Stack Overflow用户
提问于 2014-10-22 23:45:37
回答 2查看 6K关注 0票数 9

我正在寻找一个简单、安全、使用Node存储用户密码的解决方案。我是一个密码学新手,但一直试图通过在线研究找到一个解决方案。我正在寻找验证,我想出的是一个可靠的解决方案的web应用程序的基本(而不是银行,医院等)的安全需要。下面是:

代码语言:javascript
运行
复制
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。所以,正如你所看到的,我把计时器放在函数上,我调整了迭代,让它在我的机器上的大概位置。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-10-23 00:04:49

NPM包凭据处理所有这些

你可以在“编写Javascript应用程序”一书中看到作者在上面写的文章

票数 6
EN

Stack Overflow用户

发布于 2016-01-28 20:43:15

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

这个答案所述

Bcrypt具有密码算法所能达到的最好的声誉:它已经存在了很长一段时间,使用非常广泛,“吸引了人们的注意”,但至今仍未被打破。

我写了一篇关于如何在节点/表达式以及其他框架中实现BCrypt的详细文章:http://davismj.me/blog/bcrypt

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26519031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档