【发布时间】:2012-07-17 09:58:00
【问题描述】:
我想使用 node.js 加密库创建盐哈希,而无需解析任何硬编码数据。
硬编码是什么意思?
var salt, hardcodedString = "8397dhdjhjh";
crypto.createHmac('sha512', hardcodedString).update(salt).digest("base64");
难道没有其他方法可以在不使用原始 javascript、随机函数或硬编码的情况下创建随机字符串吗?
问候
更新
var Crypto = require('crypto')
, mongoose = require('mongoose');
module.exports = mongoose.model('User', new mongoose.Schema({
username: {
type: String
, required: true
, index: { unique: true, sparse: true }
, set: toLower
},
email: {
type: String
, required: true
, index: { unique: true, sparse: true }
, set: toLower
},
salt: {
type: String
, set: generateSalt
},
password: {
type: String
, set: encodePassword
}
}),'Users');
function toLower(string) {
return string.toLowerCase();
}
function generateSalt() {
//return Math.round((new Date().valueOf() * Math.random())) + '';
Crypto.randomBytes('256', function(err, buf) {
if (err) throw err;
return buf;
});
// return Crypto.randomBytes('256'); // fails to
}
function encodePassword(password) {
return password;
// TODO: setter has no access to this.salt
//return Crypto.createHmac('sha512', salt).update(password).digest("base64");
}
function authenticate(plainPassword) {
return encodePassword(plainPassword) === this.password;
}
【问题讨论】:
-
顺便说一句,普通 HMAC 不是安全密码哈希。
crypto.pbkdf2> 50000 次迭代是一个不错的选择。 -
^- 那叫'stretching' 给不知道的人。
-
很好的链接。很高兴找到一篇包含有关该主题的大量信息并有很好解释的帖子。
-
为什么要通过在处理器上施加实际负载来进行“拉伸”,而不是仅仅将响应延迟选择的时间量?
-
@MikaelGrön 目标是减缓在自己的计算机上(通常在 GPU 上)计算哈希的攻击者。它会减慢您自己的服务器速度是一个不幸的副作用。
标签: javascript node.js cryptography node-crypto