ฉันมีคำถามเหมือนกันกับโปสเตอร์ต้นฉบับและต้องมองไปรอบ ๆ และลองทำสิ่งต่างๆเพื่อทำความเข้าใจกลไก ตามที่ผู้อื่นชี้ให้เห็นแล้วเกลือจะถูกต่อเข้ากับแฮชสุดท้าย ดังนั้นนี่หมายถึงสองสิ่ง:
- อัลกอริทึมต้องทราบความยาวของเกลือ
- ต้องทราบตำแหน่งของเกลือในสตริงสุดท้ายด้วย เช่นถ้าหักล้างด้วยจำนวนเฉพาะจากซ้ายหรือขวา
สองสิ่งนี้มักจะถูกเข้ารหัสอย่างหนักในการใช้งานเช่นแหล่งที่มาของการใช้งานbcryptสำหรับbcryptjsกำหนดความยาวของเกลือเป็น 16
var BCRYPT_SALT_LEN = 16;
ดังนั้นเพื่อแสดงให้เห็นถึงแนวคิดพื้นฐานที่อยู่เบื้องหลังแนวคิดหากใครต้องการทำด้วยตนเองก็จะมีลักษณะคล้ายกับด้านล่าง ฉันไม่แนะนำให้ใช้สิ่งนี้ด้วยตัวเองเมื่อมีไลบรารีที่คุณสามารถทำได้
var salt_length = 16;
var salt_offset = 0;
var genSalt = function(callback)
{
var alphaNum = '0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ';
var salt = '';
for (var i = 0; i < salt_length; i++) {
var j = Math.floor(Math.random() * alphaNum.length);
salt += alphaNum[j];
}
callback(salt);
}
var shar2 = function(str) {
}
var hash = function(passwordText, callback)
{
var passwordHash = null;
genSalt(function(salt){
passwordHash = salt + shar2(passwordText + salt);
});
callback(null, passwordHash);
}
var compare = function(passwordText, passwordHash, callback)
{
var salt = passwordHash.substr(salt_offset, salt_length);
validatedHash = salt + shar2(passwordText + salt);
callback(passwordHash === validatedHash);
}
var encryptPassword = function(user)
{
hash(user.pass, function(err, passwordHash){
user.pass = passwordHash;
});
return user;
}
var checkPassword = function(passwordText, user)
{
compare(passwordText, user.pass, function(result){
if (result){
console.log('Correct Password');
}
else {
console.log('Incorrect Password');
}
});
}