Как проверить, совпадают ли два хешированных пароля?
Я пишу программу, в которой я использую MD5 для хеширования данных входа в систему, прежде чем отправлять их на сервер, но там я должен сравнить ее с хешированным паролем blowfish (jBCrypt), полученным из базы данных.
jBCrypt использует:
if (BCrypt.checkpw("candidatePassword", hashedPwd)) {
// they are the same
}
Проблема в том, что у меня нет пароля-кандидата для тестирования. Как я могу иметь как безопасную передачу моих данных для входа в систему, так и безопасное хранение этих данных в базе данных. Каков наилучший способ приблизиться к этому?
Я использую имя пользователя, метку времени, случайные байты и пароль для создания моего значения дайджеста md5.
Спасибо Владимир
2 ответа
Учитывая только два хэша, вы не можете 1. Хэши разработаны, чтобы быть односторонним; Вы не можете восстановить исходные данные из хэша, поэтому хранение хешированных паролей считается более безопасным, чем хранение зашифрованных паролей.
Таким образом, единственный способ проверить данные по хешу - это хешировать данные и посмотреть, соответствует ли результат.
1 Конечно, такие слова не могут и действительно действительно означают "если вы не используете грубую силу...". Теории этих алгоритмов доказывают, что они "достаточно" безопасны, но всегда следует помнить разницу между теорией и практикой. Теоретически нет никакой разницы.
Адам прав: если вы хэшируете несколько значений вместе, вы не можете получить их обратно из хэша.
Похоже, что вам действительно нужно шифрование: зашифрованное сообщение не имеет смысла для злоумышленника, который его перехватывает, но его ценность (и) может быть извлечена дружественной стороной на другом конце.*
Безопасность для веб-приложений - это отдельная специальная область со множеством ресурсов, о которых вы можете узнать, как это сделать.
Предлагаемый подход будет следующим:
Со стороны клиента создайте хэш случайных байтов и пароль. Упакуйте имя пользователя, временную метку и хэшированное значение и надежно отправьте его на сервер (используя SSL или шифрование).
С сервера расшифруйте или иным образом "распакуйте" значения и проверьте хешированный пароль и имя пользователя по значениям в базе данных. Если совпадения, разрешить доступ, если нет, отказать.
(это предполагает, что вы используете случайные байты в качестве "соли" для хеша. Если нет, просто хешируйте пароль, а не случайные байты).
* = Это очень общее представление о том, как работает шифрование, и подразумевает, что все сделано правильно, и никакой промежуточный шаг не скомпрометирован и т. Д. И т. Д.