Играть!хэш-пароль возвращает неверный результат - PullRequest
5 голосов
/ 08 июня 2011

Я использую Play 1.2.1. Я хочу хешировать пароль моего пользователя. Я думал, что Crypto.passwordHash будет хорошо, но это не так. В документации passwordHash говорится, что он возвращает хэш пароля MD5 Я создал несколько учетных записей в фикстуре, куда я положил хэш пароля md5:

  ...
User(admin):
  login: admin
  password: f1682b54de57d202ba947a0af26399fd
  fullName: Administrator
  ...

Проблема, когда я пытаюсь войти, что-то вроде этого:

user.password.equals(Crypto.passwordHash(password))

и это не работает. Поэтому я поместил запись в журнал в моем методе autentify:

Logger.info("\nUser hashed password is %s " +
                    "\nPassed password is %s " +
                    "\nHashed passed password is %s",
                    user.password, password, Crypto.passwordHash(password));

И хеши паролей действительно разные, но эй! Вывод метода passwordHash не является даже хешем MD5:

15:02:16,164 INFO  ~
User hashed password is f1682b54de57d202ba947a0af26399fd
Passed password is <you don't have to know this :P>
Hashed passed password is 8WgrVN5X0gK6lHoK8mOZ/Q==

Как насчет этого? Как это исправить? Или, может быть, мне нужно реализовать собственное решение?

Ответы [ 3 ]

5 голосов
/ 08 июня 2011

Crypto.passwordHash возвращает хэш-пароль в кодировке base64, тогда как вы сравниваете его с кодировкой в ​​шестнадцатеричном формате.

3 голосов
/ 08 июня 2011

MD5 выводит последовательность из 16 байтов , каждый байт имеет (потенциально) любое значение от 0 до 255 (включительно).Если вы хотите напечатать значение, вам необходимо преобразовать байты в последовательность «печатных символов».Существует несколько возможных соглашений, основными из которых являются шестнадцатеричный и Base64 .

В шестнадцатеричном формате каждое значение байта представляется в виде двух "шестнадцатеричных цифр":цифра - это либо десятичная цифра (от «0» до «9»), либо буква (от «а» до «f», регистр не имеет значения).Таким образом, 16 байтов становятся 32 символами.

В кодировке Base64 каждая группа из трех последовательных байтов кодируется как четыре символа, взятых в списке из 64 возможных символов (цифры, строчные буквы, заглавные буквы, '+'а также '/').Можно добавить один или два заключительных знака '=', чтобы закодированная строка состояла из нескольких символов, кратных 4.

Здесь '8WgrVN5X0gK6lHoK8mOZ / Q ==' - это кодировка Base64 последовательности16 байтов, первый со значением 241, второй 104, затем 43 и так далее.В шестнадцатеричной записи первый байт будет представлен как 'f1', второй - как '68', третий - как '2b' ... и шестнадцатеричная запись полной последовательности из 16 байтов будет равна 'f1682b54de57d202ba947a0af26399fd', значениечто вы ожидали.

Класс play.libs.Codec содержит методы для декодирования и кодирования Base64 и шестнадцатеричных обозначений.Он также содержит Codec.hexMD5(), который выполняет хеширование MD5 и возвращает значение в шестнадцатеричном формате вместо Base64.

2 голосов
/ 08 июня 2011

как сказал Николай, вы сравниваете строки Hex и Base-64.Кроме того, я бы рекомендовал использовать для этого BCrypt , а не инструмент Crypto в Play.

...