2010-01-13 2 views
2

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

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

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

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

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

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

ответ

3

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

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


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

0

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

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

безопасности для webapps это свое собственное специальное поле со многими ресурсами, на которые вы могли бы посмотреть, как это сделать.

Предложенный подход был такой:

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

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

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

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

+0

Я думаю, что проблема заключается в том, что различные алгоритмы хэширования являются используемые на клиенте и сервере, поэтому хеши не совпадают, даже если пароли одинаковы. О, и «не будет» на самом деле означает «с исчезающе малой вероятностью». Интересно, требует ли какая-либо другая техническая область больше отказов от криптографии. :-) –

Смежные вопросы