2014-01-07 4 views
3

Мы немного привязаны, когда нам нужно использовать Ruby для пользователей с существующими db пользователей. Полные пароли пользователя были сгенерированы с использованием библиотеки PHP password_compat. Все хешированные пароли начинаются с $ 2y.

Я использую bcrypt-ruby для проверки подлинности пользователей, и я не нашел успеха.

#This user's password is "password" 
irb(main):041:0> g = BCrypt::Password.new("$2y$10$jD.PlMQwFSYSdu4imy8oCOdqKFq/FDlW./x9cMxoUmcLgdvKCDNd6") 
=> "$2y$10$jD.PlMQwFSYSdu4imy8oCOdqKFq/FDlW./x9cMxoUmcLgdvKCDNd6" 
irb(main):042:0> g == "password" 
=> false 
irb(main):044:0> g.version 
=> "2y" 
irb(main):045:0> g.cost 
=> 10 
irb(main):046:0> g.salt 
=> "$2y$10$jD.PlMQwFSYSdu4imy8oCO" 
irb(main):047:0> g.hash 
=> -219334950017117414 

Я не очень опытен с помощью bcrypt или шифрования в целом. Может ли bcrypt-ruby обрабатывать $ 2y? Я просмотрел источник, и я не думаю, что это возможно. Это ошибка базовой ОС (я использую OS X)?

+0

В настоящее время есть открытый запрос на растяжение, чтобы включить 2y: https://github.com/codahale/bcrypt-ruby/issues/80 – rizidoro

ответ

10

Да, bcrypt-ruby может обрабатывать пароли, хэшированные с 2y. Вам просто нужно заменить 2y на 2a:

irb(main):002:0> BCrypt::Password.new("$2a$10$jD.PlMQwFSYSdu4imy8oCOdqKFq/FDlW./x9cMxoUmcLgdvKCDNd6") == "password" 
=> true 

Это необходимо, поскольку Bcrypt-рубиновый, кажется, следует Solar Designer’s first suggestion to introduce just 2x for a backward-compatible support for the “sign extension bug”:

[...] Я рассматриваю сохранение поддержки для сломанных хэшей под другой prefix - скажем, «$ 2x $» (где «x» будет стоять за «знак eXtension») вместо обычного «$ 2a $».

Позже he proposed to also introduce the 2y prefix для более четкого различия между тремя версиями:

Одна идея заключается в том, чтобы выделить еще один префикс, который будет означать то же самое вещь как 2а, но «сертифицированных», как мимоходом определенный набор тестов (который будет включать 8-битные символы). Таким образом, мы будем иметь:

2a - неизвестную правильность (может быть правильным, может быть багги)
2x - знак расширения ошибка
2y - определенно правильный

Вновь установленные/измененные пароли будут получать новый префикс.

PHP supports 2a, 2x, and 2ybcrypt-ruby supports only 2a, and 2x. Но если вы знаете, что ваша реализация не имеет «ошибки расширения знака», вы можете просто заменить 2y на 2a, так как 2y означает то же самое, что и 2a.

+0

Фантастический. Благодаря! – gmoore

+0

Большое спасибо за это объяснение. '$ 2y $' был введен на PHP 5.3.7: http://php.net/security/crypt_blowfish.php – qsun

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