Как работает узел.осуществляется.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
});
сверху, как не может быть никаких значений соли, участвующих в сравнениях? Чего мне здесь не хватает?
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