yii password_verify在普通php中返回true,但在Laravel应用程序中对于相同的哈希返回false

9rygscc1  于 2023-02-19  发布在  PHP
关注(0)|答案(2)|浏览(215)

我的目标是制作新的Laravel应用程序,该应用程序将使用Yii创建的旧数据库。
数据库哈希为$2a$07$6c2eb62b00df224f3d20$.qzdiDRZejMnGytXWsA7Jid7RpWazDc6
当我在PHP 7.4中的test.php中运行password_verify('...','$2a$07$6c2eb62b00df224f3d20$.qzdiDRZejMnGytXWsA7Jid7RpWazDc6)时(通过php test.php),它返回true。
当我在PHP 8.2中运行Laravel内部的相同代码时(例如在php artisan tinker或web路由中),它返回false。
可能是什么原因,以及如何验证以前由PHP的旧版本(但它们在7.4中工作)生成的哈希值,而在最新的PHP版本中使用laravel?
在这两种情况下,算法都是未知的:

Array
(
    [algo] =>
    [algoName] => unknown
    [options] => Array
        (
        )

)
yzuktlbb

yzuktlbb1#

下面是哈希和验证的示例

> $pass = Hash::make("Test");
= "$2y$10$KG33at4q/Y65AHDqk6oFkOf6g7wYc2dQZPKhpOHENlIGZhiNf63FO"

> Hash::check("Test", $pass);
= true

> password_verify("Test", $pass)
= true
> $noPass = password_hash("NoTest", PASSWORD_BCRYPT);
= "$2y$10$tivpb31D4blWgldID7vjJuRXZ4wK3pf9o6A7M5ensIlF5UBmLenf6"

> Hash::check("NoTest", $noPass);
= true

>

这应该给你的想法,我猜,最有可能的是,你需要修复你的散列算法,它应该工作正常。
在config/hashing.php中你可以设置算法,目前只支持Bcrypt和Argon2(Argon2i和Argon2id变体)。
参考:www.example.comhttps://laravel.com/docs/10.x/hashing#configuration

8cdiaqws

8cdiaqws2#

在单独的PHP脚本中运行password_verify和在Laravel中运行它会得到不同的结果,这可能是由于PHP配置或环境的不同,例如Laravel可能使用了不同版本的bcrypt算法,与Yii创建的哈希不兼容,或者PHP配置设置有差异,如默认哈希算法或密钥长度。
您可以尝试在Yii中生成哈希值时显式指定算法和选项,然后在Laravel中使用相同的算法和选项来验证哈希值。例如,您可以使用以下代码在Yii中生成哈希值:

$options = [
    'cost' => 7, // the number of iterations for the algorithm
];
$hash = password_hash($password, PASSWORD_BCRYPT, $options);

然后在Laravel中,您可以在验证哈希时使用相同的选项:

$options = [
    'cost' => 7,
];
$verified = password_verify($password, $hash);

另一个选择是在Yii和Laravel中显式指定生成哈希值的算法,例如,你可以在Yii中使用下面的代码来生成哈希值:

$hash = crypt($password, '$2a$07$');

然后在Laravel中,您可以使用相同的算法来验证哈希:

$verified = hash_equals($hash, crypt($password, $hash));

通过显式指定生成哈希的算法和选项,您可以确保在Yii和Laravel中验证哈希时使用相同的算法和选项。

相关问题