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

使用Comeonin将bcrypt密码哈希从Laravel应用迁移到Elixir应用,laravel,hash,elixir,phoenix-framework,bcrypt,Laravel,Hash,Elixir,Phoenix Framework,Bcrypt,我正在为Elixir Phoenix重新构建一个Laravel 5应用程序,并希望评估使用密码迁移用户帐户的可行性。laravel应用程序使用默认的Bcrypt密码哈希,示例哈希如下所示: Hash::make("secret"); > $2y$10$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2 iex(2)> Comeonin.Bcrypt.hashpwsalt("secret") "$2b$12$yecF6WXv0h

我正在为Elixir Phoenix重新构建一个Laravel 5应用程序,并希望评估使用密码迁移用户帐户的可行性。laravel应用程序使用默认的Bcrypt密码哈希,示例哈希如下所示:

Hash::make("secret");
> $2y$10$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2
iex(2)> Comeonin.Bcrypt.hashpwsalt("secret")
"$2b$12$yecF6WXv0hIlyTxe5bLz..ghASJRFafObDrPUVEj3UarDflvfflq6"
我正在使用Phoenix应用程序库,该库生成如下哈希:

Hash::make("secret");
> $2y$10$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2
iex(2)> Comeonin.Bcrypt.hashpwsalt("secret")
"$2b$12$yecF6WXv0hIlyTxe5bLz..ghASJRFafObDrPUVEj3UarDflvfflq6"
当我尝试检查Laravel使用Comeonin生成的哈希时,它失败了:

iex(2)> Comeonin.Bcrypt.checkpw("secret","$2y$10$gLbeMfXDRnQc9VHxuVAhke3yd4L69LQBeTqBOjw6TqQNca1nrW5E2")
false
为什么会这样?是否有不同的Bcrypt实现?我可以看到这两个散列使用了不同的轮数和变量(
2b
vs
2y
),但我假设库可以从散列中的前缀中读取


有没有可能在不让用户重置密码的情况下迁移这些散列?

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

Comeonin.Bcrypt.checkpw(密码,固定前缀(密码\u散列))
defp fix_前缀($2y”rest),do:$2b”rest
defp fix_前缀(密码_散列),do:password_散列

有关(直接不受支持的)
2y的格式解决方法,请参阅。bcrypt是否将其颁发者存储在密钥中?因为jwt确实如此,但它永远不会匹配