2

我需要 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:我还没有到那里,但我将继续使用 The Crypto 模块的哈希函数对 salt + 密码进行哈希处理并将其保存到 DB 中。我知道我必须创建一个这样的变量:

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

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

4

1 回答 1

1

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

使用该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()接受一个编码。

于 2013-10-08T14:49:40.687 回答