【问题标题】:Migrating bcrypt password hashes from a Laravel App to an Elixir app using Comeonin使用 Comeonin 将 bcrypt 密码哈希从 Laravel 应用程序迁移到 Elixir 应用程序
【发布时间】:2018-08-07 21:20:30
【问题描述】:

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

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

我正在为 Phoenix 应用程序使用 Comeonin 库,它会生成如下所示的哈希:

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

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

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

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

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

【问题讨论】:

标签: laravel hash elixir phoenix-framework bcrypt


【解决方案1】:

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

Example:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-02
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2013-08-16
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多