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运行时。