Anch'io avevo la stessa domanda del poster originale e ci è voluto un po 'guardandomi intorno e provando cose diverse per capire il meccanismo. Come è già stato sottolineato da altri, il sale viene concatenato all'hash finale. Quindi questo significa un paio di cose:
- L'algoritmo deve conoscere la lunghezza del sale
- Deve anche conoscere la posizione del sale nella stringa finale. es. se spostato da un numero specifico da sinistra o destra.
Queste due cose sono solitamente codificate in modo rigido nell'implementazione, ad esempio la fonte di implementazione di bcrypt per bcryptjs definisce la lunghezza del sale come 16
/**
* @type {number}
* @const
* @private
*/
var BCRYPT_SALT_LEN = 16;
Quindi, per illustrare il concetto di base dietro l'idea, se si volesse farlo manualmente, sarebbe simile al seguente. Non consiglio di implementare cose come questa da soli quando ci sono librerie che puoi ottenere per farlo.
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');
}
});
}