Как проверить, совпадают ли два хэшированных пароля? - PullRequest
2 голосов
/ 13 января 2010

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 13 января 2010

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

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


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

0 голосов
/ 13 января 2010

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

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

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

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

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

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

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

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

...