【发布时间】: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