使用 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 实现中的错误)。碰巧 2y
与 2b
变体兼容,因此只需替换前缀即可验证哈希值。
Comeonin.Bcrypt.checkpw(password, fix_prefix(password_hash))
defp fix_prefix("y" <> rest), do: "b" <> rest
defp fix_prefix(password_hash), do: password_hash
我正在将 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 实现中的错误)。碰巧 2y
与 2b
变体兼容,因此只需替换前缀即可验证哈希值。
Comeonin.Bcrypt.checkpw(password, fix_prefix(password_hash))
defp fix_prefix("y" <> rest), do: "b" <> rest
defp fix_prefix(password_hash), do: password_hash