【问题标题】:Hash, salt and save password in Node/Express在 Node/Express 中散列、加盐和保存密码
【发布时间】:2013-10-15 04:37:43
【问题描述】:

我需要 Node 标准库中的 Crypto 模块。 我有这个处理注册表单的 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主要由字符组成,类似于一个盒子,里面有一个问号。它是否正确?但是当我将 buf 保存到 doc.salt 并输出这个时,我得到了一些完全不同的东西......“Slowbuffer ae be C5 A3 E3....等等”

Q1: 在将其与字符串连接或保存之前,我是否必须对 crypto.randomBytes() 生成的盐做一些特殊的事情(将其解析成什么?)?

Q2: crypto.randomBytes() 函数存在于异步和同步版本中。我使用的是异步版本,但我真的不知道为什么? =PI 认为异步 callbaks 主要用于处理可能需要时间的 I/O 操作......或者我是否使用此函数的回调版本,因为它实际上是一个复杂的过程,可能需要一些时间并为 som MS 锁定系统如果我使用同步版本?

Q3:我还没到那里,但我将继续使用 Crypto 模块的散列函数对盐 + 密码进行散列并将其保存到数据库中。我知道我必须创建一个这样的变量:

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

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

【问题讨论】:

  • 好的,我只是尝试在 buf 上使用 toString()。这似乎给了我一个对用户更友好的变量......但是如果crypto.randomBytes() 不生成字符串?它生成什么样的数据类型?

标签: javascript node.js hash express passwords


【解决方案1】:

当您使用crypto.randomBytes() 生成随机字节时,解析字节并没有什么特别之处,因为它们是随机的。一个随机字节由两个十六进制数字组成,因此如果您使用buffer.toString(),该字节可以映射到00FF 之间的任何UTF-8 数字。

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

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

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

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

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

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

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

通过执行上述操作,您将停止服务器处理任何其他传入的 HTTP 请求。

关于您的最后一个问题,您已经创建了哈希对象,但尚未更新其数据或计算其摘要。分别使用hash.update()hash.digest() 表示哈希的字符串:

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

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

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 2012-03-24
    • 2015-08-20
    • 2014-06-10
    • 2011-06-02
    • 2011-10-29
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多