Node中密码存储的密码学最佳实践

我正在寻找一个简单,安全的解决scheme来存储用户的密码,使用节点。 我是一个密码学新手,但一直试图从网上调查一起解决scheme。 我正在寻找validation,我想出的是一个具有基本(而不是银行,医院等)安全需求的Web应用程序的可靠解决scheme。 这里是:

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}); }); }); }; 

…以下是我所做的select,

什么哈希algorithm使用?

基于这篇广泛引用的文章 ,它看起来像领先的竞争者是PBKDF2,bcrypt和scrypt。 我select了PBKDF2,因为它已经在Node中build立了支持。

什么盐大小使用?

这个堆栈溢出的答案似乎是我能find的最直接的答案。 我仍然不清楚为什么64字节是合适的salt大小。 当我谷歌周围,我得到这样的其他堆栈交换的答案,但我不知道它适用于节点algorithm? 完全困惑在这里,针对新手使用这个节点function的解释是非常棒的。

什么关键长度使用?

再一次,我主要根据上面的同样的答案来select我的select,但是我对“为什么”的基础知识有点模糊。 答案是:“生成小于你的input的密钥是很浪费的,所以至less使用64个字节”。 咦? 再次,一个实际的解释将是有益的。

多less次迭代使用?

对于这个问题,我根据这个堆栈交换答案来select我的select。 我不太了解它,但是我确实知道该algorithm需要大约8ms。 所以,正如你所看到的,我把定时器放在函数上,并且调整了我的迭代,以便在我的机器上find它。

谢谢!

NPM包凭证处理所有这些

您可以在编写Javascript应用程序的书中看到作者的写作

我强烈build议使用BCrypt 。 algorithm有很多优点,大多数实现都是为你处理所有这些问题。

正如在这个答案中所述 :

Bcrypt的密码algorithm具有最好的声誉:它已经存在了相当长的一段时间,被广泛使用,引起了人们的关注,但至今仍然没有中断。

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