Tôi cũng có câu hỏi tương tự như người đăng ban đầu và phải xem xét một chút xung quanh và thử những thứ khác nhau để hiểu cơ chế. Như đã được chỉ ra bởi những người khác, muối được nối với hàm băm cuối cùng. Vì vậy, điều này có nghĩa là một vài điều:
- Thuật toán phải biết độ dài của muối
- Cũng phải biết vị trí của muối trong chuỗi cuối cùng. ví dụ: nếu bù đắp bởi một số cụ thể từ trái hoặc phải.
Hai thứ này thường được mã hóa cứng trong quá trình triển khai, ví dụ như nguồn triển khai bcrypt cho bcryptjs định nghĩa độ dài muối là 16
/**
* @type {number}
* @const
* @private
*/
var BCRYPT_SALT_LEN = 16;
Vì vậy, để minh họa khái niệm cơ bản đằng sau ý tưởng nếu một người muốn thực hiện nó theo cách thủ công, Nó sẽ trông tương tự như bên dưới. Tôi không khuyên bạn nên tự mình thực hiện những thứ như thế này khi có các thư viện mà bạn có thể thực hiện.
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);
}
// cryptographic hash function of your choice e.g. shar2
// preferably included from an External Library (dont reinvent the wheel)
var shar2 = function(str) {
// shar2 logic here
// return hashed string;
}
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);
}
// sample usage
var encryptPassword = function(user)
{
// user is an object with fields like username, pass, email
hash(user.pass, function(err, passwordHash){
// use the hashed password here
user.pass = passwordHash;
});
return user;
}
var checkPassword = function(passwordText, user)
{
// user has been returned from database with a hashed password
compare(passwordText, user.pass, function(result){
// result will be true if the two are equal
if (result){
// succeeded
console.log('Correct Password');
}
else {
// failed
console.log('Incorrect Password');
}
});
}