Как проверить, совпадают ли два хешированных пароля?

Я пишу программу, в которой я использую MD5 для хеширования данных входа в систему, прежде чем отправлять их на сервер, но там я должен сравнить ее с хешированным паролем blowfish (jBCrypt), полученным из базы данных.

jBCrypt использует:

if (BCrypt.checkpw("candidatePassword", hashedPwd)) {
// they are the same
}

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

Я использую имя пользователя, метку времени, случайные байты и пароль для создания моего значения дайджеста md5.

Спасибо Владимир

2 ответа

Решение

Учитывая только два хэша, вы не можете 1. Хэши разработаны, чтобы быть односторонним; Вы не можете восстановить исходные данные из хэша, поэтому хранение хешированных паролей считается более безопасным, чем хранение зашифрованных паролей.

Таким образом, единственный способ проверить данные по хешу - это хешировать данные и посмотреть, соответствует ли результат.


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

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

Похоже, что вам действительно нужно шифрование: зашифрованное сообщение не имеет смысла для злоумышленника, который его перехватывает, но его ценность (и) может быть извлечена дружественной стороной на другом конце.*

Безопасность для веб-приложений - это отдельная специальная область со множеством ресурсов, о которых вы можете узнать, как это сделать.

Предлагаемый подход будет следующим:

  • Со стороны клиента создайте хэш случайных байтов и пароль. Упакуйте имя пользователя, временную метку и хэшированное значение и надежно отправьте его на сервер (используя SSL или шифрование).

  • С сервера расшифруйте или иным образом "распакуйте" значения и проверьте хешированный пароль и имя пользователя по значениям в базе данных. Если совпадения, разрешить доступ, если нет, отказать.

(это предполагает, что вы используете случайные байты в качестве "соли" для хеша. Если нет, просто хешируйте пароль, а не случайные байты).

* = Это очень общее представление о том, как работает шифрование, и подразумевает, что все сделано правильно, и никакой промежуточный шаг не скомпрометирован и т. Д. И т. Д.

Другие вопросы по тегам