在Node / Express中哈希,盐和保存密码

我需要Node的标准库中的Crypto模块。 我有这个处理registry单的POST路由:

app.post('/superadmin/add-account', function(req, res) { // Shorthand variable var doc = req.body; crypto.randomBytes(32, function(err, buf) { if (err) throw err; // Sanitise and transform user input ... // Validate user input ... var errors = validator.getErrors(); // Generate new object data doc.salt = buf; doc.pass = doc.salt + 'justForNow'; console.log(doc); 

当我输出文档(req.body),现在我得到了一些值,似乎对我来说是奇怪的…在控制台输出buf大多由类似于一个问号框里面的charachter组成。 它是否正确? 但是当我保存buf到doc.salt并输出这个我完全得到了一些东西…“慢缓冲AE是C5 A3 E3 ….等等”

Q1:在使用string串联或保存之前,我是否需要使用crypto.randomBytes()生成的salt来做一些特殊的事情(parsing它?)?

Q2: crypto.randomBytes()函数存在于asynchronous和同步版本中。 即时通讯使用asynchronous版本,但我真的不知道为什么? = PI认为asynchronouscallbaks主要用于处理可能需要时间的I / O操作…或者我使用该函数的callback版本,因为它实际上是一个复杂的过程,可能需要一些时间,并locking系统的MS MS如果我使用同步版本?

问题3:我还没有,但是我将继续使用密码模块的散列函数散列salt +密码并将其保存到数据库。 我知道我必须创build一个这样的变种:

 var sha256 = crypto.createHash('sha256'); 

但我不明白我现在如何使用这个。

当你用crypto.randomBytes()生成随机字节时,parsing字节没有什么特别之处,因为它们是随机的。 随机字节由两个hex数字组成,所以如果使用buffer.toString() ,该字节可以映射到00FF之间的任何UTF-8数字。

当使用randomBytes()函数时,会得到一个SlowBuffer ,它是Buffer一个内部类。

 <SlowBuffer 76 46 14 02> // v F \u0014 \u0002 

如果两个hex数字的UTF-8表示不存在,则会得到一个乱码string:

 <Buffer 96> // � <SlowBuffer 9e 94> // �� 

对于第二个问题,是否要使用randomBytes()函数的同步版本的asynchronous,取决于您。 函数使用的CPU时间量也取决于您要求的随机字节数。 如果你想要一万亿个随机字节,你会阻塞事件循环一段相当长的时间,但是如果你想要十个随机字节,那只需要几毫秒。

大多数情况下,如果将操作放在HTTP处理程序中,则应该使用asynchronous版本,因为要避免不惜一切代价阻止事件循环。 这是不该做的一个例子:

 app.post('/', function(req, res) { crypto.randomBytes(1000000000); }); 

通过这样做,您将停止服务器处理任何其他传入的HTTP请求。

至于你的最后一个问题,你已经创build了哈希对象,但没有更新其数据或计算其摘要。 对散列的string表示分别使用hash.update()hash.digest()

 var crypto = require('crypto'); var hash = crypto.createHash('sha256').update(data).digest('hex'); 

hash.update()函数接受两个参数,一个数据块和一个编码,而hash.digest()接受一个编码。