我使用下面的函數來散列用戶的密碼,下面快速的例子進行身份驗證:如何在mongoDB中存儲crypto pbkdf2?
function hash(pwd, salt, fn) {
// Bytesize
var len = 128,
// Iterations. ~300ms
iterations = 12000;
if (3 == arguments.length) {
crypto.pbkdf2(pwd, salt, iterations, len, fn);
} else {
fn = salt;
crypto.randomBytes(len, function(err, salt){
if (err) return fn(err);
salt = salt.toString('base64');
crypto.pbkdf2(pwd, salt, iterations, len, function(err, hash){
if (err) return fn(err);
fn(null, salt, hash);
});
});
}
}
的salt
,你可以看到,返回爲Base64編碼的字符串。然而,hash
返回爲SlowBuffer
。在嘗試登錄用戶時,此相同函數也用於比較散列。
用戶的我的Mongoose架構指定hash
的類型應爲String
。這將儲存在陌生的路上散,造成這樣的內容肆虐我蒙戈主機上肆虐:
我的問題是,有沒有存儲這些hash
更好/更聰明的方法我數據庫?我試着用.toString('hex')
對它進行編碼,我也嘗試將用戶架構中的hash
類型更改爲buffer
,但這兩種方法在嘗試登錄用戶時都使所有比較都爲false。在我的authenticate
函數中進行比較,如下:
function authenticate(name, pass, fn) {
var findUser = function(username) {
var deferred = Q.defer(),
populateObj = [
// list of paths to populate objects normally goes here
];
User.findOne({ username: name }).populate(populateObj).exec(function (err, retrievedUser) {
if (err || !retrievedUser) {
console.log(err);
deferred.reject('Cannot find user.');
}
else {
deferred.resolve(retrievedUser);
}
});
return deferred.promise;
};
findUser(name).then(function(data) {
// apply the same algorithm to the POSTed password, applying
// the hash against the pass/salt, if there is a match we
// found the user
hash(pass, data.salt, function(err, hash){
if (err) return fn(err);
if (hash == data.hash) return fn(null, data);
return fn('Invalid password.');
});
}, function() {
return fn('Failed to retrieve user.');
});
}
你如何執行實際的比較?你可以展示這些代碼嗎? – robertklep
@robertklep編輯添加'authenticate'功能,做比較 – Jakemmarsh