También tuve la misma pregunta que en el póster original y tuve que mirar un poco a mi alrededor y probar diferentes cosas para entender el mecanismo. Como ya han señalado otros, la sal se concatena al picadillo final. Entonces esto significa un par de cosas:
- El algoritmo debe conocer la longitud de la sal.
- También debe conocer la posición de la sal en la cadena final. por ejemplo, si está compensado por un número específico de izquierda o derecha.
Estas dos cosas generalmente están codificadas en la implementación, por ejemplo, la fuente de implementación bcrypt para bcryptjs define la longitud de la sal como 16
/**
* @type {number}
* @const
* @private
*/
var BCRYPT_SALT_LEN = 16;
Entonces, para ilustrar el concepto básico detrás de la idea, si uno quisiera hacerlo manualmente, se vería similar al siguiente. No recomiendo implementar cosas como esta usted mismo cuando hay bibliotecas que puede hacer.
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');
}
});
}