【问题标题】:Node.js: crypto.pbkdf2 password to hexNode.js:crypto.pbkdf2 密码为十六进制
【发布时间】:2012-07-19 09:07:41
【问题描述】:

我目前使用以下设置注册新用户:

// creates a new user
app.post('/users', function(req, res) {
    // create new user
    var user = new User();
    // assign post
    user.username = req.body.username;
    user.email = req.body.email;

    crypto.randomBytes(32, function(err, buf) {
        if (err) throw err;
        user.salt = buf.toString('hex');
        crypto.pbkdf2(req.body.password, user.salt, 25000, 512, function(err, encodedPassword) {
            if (err) throw err;
            user.password = (encodedPassword.toString('hex')); // this line
            user.save(function(err, user) {
                if (!err) return res.send(err, 500);
                return res.json(user);
            });
        }.bind(this));
    });
});

仔细看看这一行:

user.password = (encodedPassword.toString('hex'));

这应该将密码字符串(看起来像二进制)编码为十六进制字符串。 由于某种原因,这不起作用。

为什么不呢?

旁边: salt和密码存储推荐什么编码(十六进制、二进制、base64)?

【问题讨论】:

  • 对于旁注,我发现一个线程建议 base64 超过十六进制,因为它更短(2.2 到 1.3 相对于 buff,二进制)
  • 我得到了一堆陷阱作为该函数的输出。由于我也不知道如何处理它,我理解为什么toString('hex') 会失败。祝你好运!
  • 注意:您似乎返回了一个包含各种字符的字符串。尝试先转换为字节数组(检查stackoverflow),然后再转换为十六进制。我讨厌那些不理解字符串和字节之间区别的语言,而 JavaScript 无疑在耻辱列表中名列前茅。
  • @owlstead 你能给我一个代码 sn-p 如何将缓冲区、字节转换为字符串?我也可以将此标记为答案
  • 我希望我能找到一个好的实现,但我在默认的 javascript 函数中没有找到任何东西。也许试试this,虽然我不知道这是否适用于 Node.js 运行时。

标签: javascript node.js encoding cryptography


【解决方案1】:

看来,如果它已经是一个字符串,那么 toString('hex') 将不起作用。

我所做的类似于Buffer(encodedPassword, 'binary').toString('hex')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2020-06-15
    • 2014-07-10
    • 2014-12-23
    • 1970-01-01
    • 2017-05-07
    • 2014-04-16
    • 2013-06-10
    相关资源
    最近更新 更多