Ich hatte auch die gleiche Frage wie das Originalplakat und es dauerte ein bisschen, bis ich mich umgesehen und verschiedene Dinge ausprobiert hatte, um den Mechanismus zu verstehen. Wie bereits von anderen erwähnt, wird das Salz zum endgültigen Hash verkettet. Das bedeutet also ein paar Dinge:
- Der Algorithmus muss die Länge des Salzes kennen
- Muss auch die Position des Salzes in der letzten Saite kennen. zB wenn durch eine bestimmte Zahl von links oder rechts versetzt.
Diese beiden Dinge sind in der Implementierung normalerweise fest codiert, z. B. definiert die bcrypt-Implementierungsquelle für bcryptjs die Salt-Länge als 16
/**
* @type {number}
* @const
* @private
*/
var BCRYPT_SALT_LEN = 16;
Um das Grundkonzept hinter der Idee zu veranschaulichen, wenn man es manuell machen möchte, würde es ähnlich wie das folgende aussehen. Ich empfehle nicht, solche Dinge selbst zu implementieren, wenn es Bibliotheken gibt, die Sie dazu bekommen können.
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');
}
});
}