我正在将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个散列使用不同数量的回合和变体(2b
与2y
),但是我认为该库可以从散列中的前缀读取它。
是否可以在不让用户重置密码的情况下迁移这些哈希?
答案 0 :(得分:0)
如@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