nodejs - как сравнить два хэша пароля bcrypt - PullRequest
0 голосов
/ 23 апреля 2019

Здравствуйте. Мне нужна помощь в решении этой проблемы после поиска решения, но я еще не нашел,

Я хочу сравнить 2 хеш-пароля с bcrypt того же пароля, как мне это сделать?

например:

У меня есть 2 хеш-пароля, которые пришли из того же пароля в bcrypt:

var password = E@Js#07Do=U$
var hash1 = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
var hash2 = $2a$10$mgApOcRIp7RSK3lRIIlQ5e/GjVFbxAFytGAEc0Bo17..r8v2pPR22
// that's not working for me
bcrypt.compare(passwordHash, userPasswordLoginHash, function(err, isMatch) {
   if (err) throw err;
   if(isMatch){
      console.log('correct password!')
   }
   callback(null, isMatch);
});

как мне сравнить их, чтобы определить, что они пришли с одного и того же пароля, используя пакет bcryptjs npm?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

По замыслу это невозможно - в качестве основного свойства безопасности хеширования истинного пароля.

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

Например, если пароли хранились с использованием хеш-кода, неприемлемого для хранения паролей (например, MD5), то все пароли будут иметь одинаковые хеши MD5 и взломодин взламывает их все.

Вы не можете сделать это с современным хэшем пароля, таким как bcrypt.Единственный способ «сравнить» два современных хэша паролей - это заранее знать открытый текст, а затем применить алгоритм, используя соль в каждом хэше.И даже если два пользователя имеют один и тот же пароль, злоумышленник должен выполнить одни и те же дорогостоящие вычисления, чтобы взломать каждого из них независимо.

В более общем плане - и это может показаться немного смелым - но законного варианта использования нетдля любой системы или администратора когда-либо сравните пароли двух пользователей.Пароли пользователей должны быть на 100% независимыми и на 100% непрозрачными для системы после ее сохранения.Если системное или экономическое обоснование требует такого сравнения, его следует переработать, чтобы устранить это требование.

0 голосов
/ 23 апреля 2019

С bcrypt lib вы сравниваете простой текстовый пароль с хэшем, используя ту же библиотеку.

Скажем, вы хешировали пароль

const myPlaintextPassword = 'E@Js#07Do=U$'
bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
  // Store hash in your password DB.
  // example output, taking your hash
  // hash = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
});

Вы сравниваете как:

// db query, get hashed password, found hash
// hash = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
// User input again:
const myPlaintextPassword = 'E@Js#07Do=U$'
bcrypt.compare(myPlaintextPassword, hash, function(err, res) {
  // res is true as the original password is the same
  // res == true
});
...