Как работает узел.осуществляется.JS сравнивает хэшированные и текстовые пароли без соли?



С github:



чтобы хэшировать пароль:



var bcrypt = require('bcrypt');
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash("B4c0//", salt, function(err, hash) {
// Store hash in your password DB.
});
});


чтобы проверить пароль:



// Load hash from your password DB.
bcrypt.compare("B4c0//", hash, function(err, res) {
// res == true
});
bcrypt.compare("not_bacon", hash, function(err, res) {
// res = false
});


сверху, как не может быть никаких значений соли, участвующих в сравнениях? Чего мне здесь не хватает?

703   2  

2 ответов:

соль включена в хэш (как открытый текст). Функция сравнения просто извлекает соль из хэша, а затем использует ее для хэширования пароля и выполнения сравнения.

у меня тоже был тот же вопрос, что и у оригинального плаката, и он немного огляделся и попробовал разные вещи, чтобы понять механизм. Как уже указывалось другими, соль сцепляется с конечным хэшем. Так что это означает пару вещей:

  1. алгоритм должен знать длину соль
  2. необходимо также знать положение соли в последней строке. например, если смещено на определенное число слева или право.

эти две вещи обычно жестко закодированы в реализации, например, источник реализации bcrypt для bcryptjs определяет длину соли как 16

/**
* @type {number}
* @const
* @private
*/

var BCRYPT_SALT_LEN = 16;

поэтому, чтобы проиллюстрировать основную концепцию идеи, если бы кто-то хотел сделать это вручную, это выглядело бы так же, как показано ниже. Я не рекомендую реализовывать такие вещи самостоятельно, когда есть библиотеки, которые вы можете сделать это.

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');
        }
    });
}

Comments

    Ничего не найдено.