使用 Comeonin 将 bcrypt 密码哈希从 Laravel 应用程序迁移到 Elixir 应用程序

Migrating bcrypt password hashes from a Laravel App to an Elixir app using Comeonin

我正在将 Laravel 5 应用程序重新平台化到 Elixir Phoenix,并想评估使用密码迁移用户帐户的可行性。 laravel 应用程序使用默认的 Bcrypt 密码散列,散列示例如下所示:

Hash::make("secret");
> y$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2

我正在使用 Phoenix 应用程序的 Comeonin 库,它生成如下所示的散列:

iex(2)> Comeonin.Bcrypt.hashpwsalt("secret")
"b$yecF6WXv0hIlyTxe5bLz..ghASJRFafObDrPUVEj3UarDflvfflq6"

当我尝试使用 Comeonin 检查由 Laravel 生成的散列时,它失败了:

iex(2)> Comeonin.Bcrypt.checkpw("secret","y$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2")
false

这是为什么? Bcrypt 有不同的实现吗?我可以看到 2 个哈希使用不同的轮数和变体(2b vs 2y)但我假设库可以从哈希中的前缀中读取它。

是否可以在不让用户重置密码的情况下迁移这些哈希值?

正如@NicNilov 提到的,Comeonin 不支持 2y 前缀(创建它是为了解决 php 实现中的错误)。碰巧 2y2b 变体兼容,因此只需替换前缀即可验证哈希值。

Example:

Comeonin.Bcrypt.checkpw(password, fix_prefix(password_hash))

defp fix_prefix("y" <> rest), do: "b" <> rest
defp fix_prefix(password_hash), do: password_hash