Saya juga memiliki pertanyaan yang sama seperti poster asli dan perlu melihat-lihat dan mencoba berbagai hal untuk memahami mekanismenya. Seperti yang telah ditunjukkan oleh orang lain, garam digabungkan ke hash terakhir. Jadi ini berarti beberapa hal:
- Algoritma harus mengetahui panjang garam
- Harus juga mengetahui posisi garam di string terakhir. misal jika diimbangi dengan angka tertentu dari kiri atau kanan.
Kedua hal ini biasanya dikodekan dengan keras dalam implementasinya, misalnya sumber implementasi bcrypt untuk bcryptjs mendefinisikan panjang garam sebagai 16
var BCRYPT_SALT_LEN = 16;
Jadi untuk mengilustrasikan konsep dasar di balik ide jika seseorang ingin melakukannya secara manual, akan terlihat seperti di bawah ini. Saya tidak menyarankan menerapkan hal-hal seperti ini sendiri ketika ada perpustakaan yang bisa Anda lakukan.
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');
}
});
}