Я нахожусь в процессе перенастройки приложения Laravel 5 на Elixir Phoenix и хочу оценить возможность переноса учетных записей пользователей с их паролями. Приложение laravel использует хеширование паролей Bcrypt по умолчанию, и пример хеша выглядит так:
Hash::make("secret");
> $2y$10$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2
Я использую библиотеку Заходи для приложения Phoenix, которое создает такой хеш:
iex(2)> Comeonin.Bcrypt.hashpwsalt("secret")
"$2b$12$yecF6WXv0hIlyTxe5bLz..ghASJRFafObDrPUVEj3UarDflvfflq6"
Когда я пытаюсь проверить хэш, сгенерированный Laravel с помощью Comeonin, он терпит неудачу:
iex(2)> Comeonin.Bcrypt.checkpw("secret","$2y$10$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2")
false
Почему это? Существуют ли разные реализации Bcrypt? Я вижу, что два хэша используют разное количество раундов и вариантов (2b
против 2y
), но я предполагаю, что библиотека может прочитать это из префиксов в хеше.
Можно ли будет перенести эти хэши, не заставляя пользователей сбрасывать свои пароли?
Хранит ли bcrypt в ключе своего эмитента? потому что jwt делает, и тогда он никогда не будет соответствовать
Как упоминал @NicNilov, Comeonin не поддерживает префикс 2y
(который был создан для обхода ошибки в реализации php). Бывает, что 2y
совместим с вариантом 2b
, поэтому простая замена префикса позволит проверить хэши.
Comeonin.Bcrypt.checkpw(password, fix_prefix(password_hash))
defp fix_prefix("$2y" <> rest), do: "$2b" <> rest
defp fix_prefix(password_hash), do: password_hash
См. Comeonin Bcrypt не поддерживает префикс 2y? для обхода (напрямую не поддерживаемого) формата
2y
.