J'avais aussi la même question que l'affiche originale et il a fallu regarder un peu autour et essayer différentes choses pour comprendre le mécanisme. Comme d'autres l'ont déjà souligné, le sel est concaténé au hachage final. Cela signifie donc plusieurs choses:
- L'algorithme doit connaître la longueur du sel
- Doit également connaître la position du sel dans la chaîne finale. par exemple, si compensé par un nombre spécifique de gauche ou de droite.
Ces deux choses sont généralement codées en dur dans l'implémentation, par exemple la source d'implémentation bcrypt pour bcryptjs définit la longueur du sel comme 16
/**
* @type {number}
* @const
* @private
*/
var BCRYPT_SALT_LEN = 16;
Donc, pour illustrer le concept de base derrière l'idée si l'on voulait le faire manuellement, cela ressemblerait à celui ci-dessous. Je ne recommande pas d'implémenter ce genre de choses vous-même quand il y a des bibliothèques que vous pouvez obtenir pour le faire.
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');
}
});
}