Ben de orijinal posterle aynı soruyu sormuştum ve etrafa bakıp mekanizmayı anlamak için farklı şeyler denemek gerekti. Başkaları tarafından daha önce belirtildiği gibi, tuz son hash ile birleştirilir. Yani bu birkaç anlama geliyor:
- Algoritma tuzun uzunluğunu bilmelidir
- Ayrıca son dizideki tuzun konumunu da bilmelidir. örneğin, soldan veya sağdan belirli bir sayı ile kaymışsa.
Bu iki şey genellikle uygulamada sabit kodlanmıştır, örneğin bcryptjs için bcrypt uygulama kaynağı tuz uzunluğunu 16 olarak tanımlar.
var BCRYPT_SALT_LEN = 16;
Dolayısıyla, fikrin arkasındaki temel kavramı göstermek için, eğer biri bunu manuel olarak yapmak isterse, aşağıdakine benzer görünecektir. Bunu yapabileceğiniz kütüphaneler varken, bu tür şeyleri kendiniz uygulamanızı önermiyorum.
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');
}
});
}