node.js - Node 中密码存储的密码学最佳实践

标签 node.js cryptography passwords salt pbkdf2

我正在寻找一种使用 Node.js 存储用户密码的简单、安全的解决方案。我是密码学新手,但一直试图通过在线研究拼凑出一个解决方案。我正在寻找验证,我想出的是一个可靠的解决方案,适用于具有基本(而不是银行、医院等)安全需求的 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 字节是正确的盐大小。当我四处搜索时,我得到了其他堆栈交换答案,例如 this ,但我不确定它是否适用于 Node 算法?在这里完全混淆了,针对使用此 Node 功能的新手的解释会很棒。

使用什么 key 长度?

再一次,我的选择主要基于 the same answer as above ,但我对“为什么”的基本知识一无所知。答案是“生成小于输入的 key 是一种浪费,因此至少使用 64 个字节”。嗯?再一次,一个实用的解释会很有帮助。

要使用多少次迭代?

对于这个问题,我的选择基于 this stack exchange answer .我不太了解,但我确实知道该算法应该花费大约 8 毫秒。因此,如您所见,我在函数上设置了计时器,并调整了迭代以使其在我的机器上处于该范围内。

谢谢!

最佳答案

NPM 包credential处理所有这些

您可以在本书Programming Javascript Applications 中看到作者对此的描述。

关于node.js - Node 中密码存储的密码学最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26519031/

相关文章:

Android 上的 Android WebView 登录

ruby-on-rails - Rails-无法保存用户密码 bcrypt

javascript - 如何在Node JS中使用Redis session 设置Heroku Redis

javascript - 将 MATLAB 连接到 Firebase 数据库

Java解密加密兼容SJCL?

java - BlowFish 解密 - nCFB 模式

c# - 加密配置文件段(Settings.settings)

node.js - 如何从 Mongoose 对象内嵌套的数组中提取数组元素?

javascript - PHP转JS密码加密算法抛异常

c# - 尝试实现 Speck32/64 分组密码