我對nodeJS相當陌生,而且我的任務是創建一個樣本註冊頁面,並且使用它,我嘗試加密用戶的密碼。NodeJs - 回調未定義 - 如何使用異步密碼散列?
這就是我想出了,通過傳遞用戶的密碼使用:
function hashPassword(password) {
var salt = crypto.randomBytes(128).toString('base64')
var iterations = 1000;
var hash = crypto.pbkdf2Sync(password, salt, iterations, 512, 'sha512');
return {
salt: salt,
hash: hash.toString('base64'),
iterations: iterations
};
}
現在,我聽說這是使用異步的,可能需要一段時間功能的最佳實踐,但不幸的是我,而新的異步JS。
下面是我通過谷歌搜索(specifically, here)想出的,但我都不完全理解它,也不能讓它工作。口口聲聲ReferenceError: callback is not defined
:
function hashPassword(password, callback) {
var saltBytes = 128;
var iterations = 1000;
var hashBytes = 512
crypto.randomBytes(saltBytes, (err, salt) => {
if (err) {
return callback(err);
}
crypto.pbkdf2(password, salt, iterations, hashBytes, 'sha512', (err, hash) => {
if (err) {
return callback(err);
}
var combined = new Buffer(hash.length + salt.length + 8);
combined.writeUInt32BE(salt.length, 0, true);
combined.writeUInt32BE(iterations, 4, true);
salt.copy(combined, 8);
hash.copy(combined, salt.length + 8);
callback(null, combined);
});
});
}
據我有限的異步的知識去,這是在回調函數我應該做其他要求(在我的情況下,保存到DB)。
我做錯了什麼,或者我沒有得到什麼?
嘛,你怎麼稱呼你的'hashPassword'功能,你有沒有傳遞迴調? – Bergi
*「現在,我聽說最好的做法是在可能需要一段時間的函數上使用異步。」*只有當他們需要一段時間的原因是他們正在等待其他事情(如I/O事件)時。如果他們需要一段時間,因爲他們正在JavaScript代碼中工作,那麼使用「async」函數根本無濟於事。在你的情況下,** yes **,使用'pbkdf2'而不是'pbkdf2Sync'是最好的做法,因爲'crypto'減輕了JavaScript線程的負擔。 –
*「一直說'ReferenceError:回調沒有定義'」*它明確**是**在你正在使用的代碼中定義。請用[mcve]更新您的問題以證明問題。 –