我试图弄清楚如何使用crypto模块对nodejs中的密码进行加盐和哈希处理。我可以这样做来创建哈希密码:
UserSchema.pre('save', function(next) { var user = this; var salt = crypto.randomBytes(128).toString('base64'); crypto.pbkdf2(user.password, salt, 10000, 512, function(err, derivedKey) { user.password = derivedKey; next(); }); });
但是我对以后如何验证密码感到困惑。
UserSchema.methods.validPassword = function(password) { // need to salt and hash this password I think to compare // how to I get the salt? }
在您使用的任何持久性机制(数据库)中,您都将在哈希值和迭代次数之间存储结果哈希,这两者都是纯文本。如果每个密码使用不同的盐(您应该这样做),则还必须保存该信息。
然后,您将比较新的纯文本密码,使用相同的盐(和迭代次数)对其进行哈希处理,然后将字节序列与存储的密码进行比较。
生成密码(伪)
function hashPassword(password) { var salt = crypto.randomBytes(128).toString('base64'); var iterations = 10000; var hash = pbkdf2(password, salt, iterations); return { salt: salt, hash: hash, iterations: iterations }; }
验证密码(伪)
function isPasswordCorrect(savedHash, savedSalt, savedIterations, passwordAttempt) { return savedHash == pbkdf2(passwordAttempt, savedSalt, savedIterations); }