Javascript Node.js:crypto.pbkdf2十六进制密码

Javascript Node.js:crypto.pbkdf2十六进制密码,javascript,node.js,encoding,cryptography,Javascript,Node.js,Encoding,Cryptography,我目前使用以下设置来注册新用户: // 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, fu

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

// 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)建议使用什么编码?

如果它已经是一个字符串,那么toString('hex')将无法工作


我所做的是类似于
缓冲区(encodedPassword,'binary')。toString('hex')

对于byside注释,我发现一个线程建议使用base64而不是hex,因为它较短(相对于buff,binary为2.2到1.3),我从该函数得到了一堆陷阱作为输出。由于我也不知道如何处理这个问题,我理解为什么
toString('hex')
会失败。祝你好运注意:似乎返回了一个包含各种字符的字符串。首先尝试转换为字节数组(检查stackoverflow),然后转换为十六进制。我讨厌那些不理解字符串和字节之间区别的语言,而JavaScript无疑是最令人羞愧的语言。@owlstead你能给我一个代码片段,告诉我如何将缓冲区从字节转换为字符串吗?我也可以将此标记为answerI,我希望我能找到一个好的实现,但我在默认javascript函数中没有找到任何东西。也许可以试试,不过我不知道这是否适用于Node.js运行时。