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

时间:2018-08-07 21:20:31

标签: laravel hash elixir phoenix-framework bcrypt

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

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

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

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

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

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

这是为什么? Bcrypt是否有不同的实现?我可以看到2个散列使用不同数量的回合和变体(2b2y),但是我认为该库可以从散列中的前缀读取它。

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

1 个答案:

答案 0 :(得分:0)

如@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