PHP password_hash检查两个哈希值
作者:互联网
如果我使用password_hash
函数创建了两个密码哈希,如何判断它们是否来自相同的基本密码?我知道每次使用不同的盐.我没有明文.
例如:
$2y $10 $M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re和$2y $10 $ZSlQNIbsLWfj7JLCSkvFLeS / adH.KnGZTgA1BcvyPXl7BEn7GhREO都来自哈希测试.如果将这两个哈希值作为参数,我该如何编写一个返回true的函数?
这可能吗?
所以:
<?php
function check_hashes($hash1, $hash2) {
(some code)
}
echo strval(check_hashes('$2y$10$M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re', '$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO'));
echo strval(check_hashes('$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO', '$2y$10$LoUOu3kt7zm1YZI1PtAsD.yzWF0b9jqOaAH64lK51VtgqRJZBgtO6'));
?>
输出:
TRUE
FALSE
解决方法:
不,除非您已经知道密码,否则无法检查这两个哈希值是否属于同一密码.如果可以,这基本上无法使用password_hash函数.
如果您知道密码,可以使用方法:password_verify
来验证密码:
$res1 = "$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO";
$res2 = "$2y$10$M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re";
var_dump(password_verify("test", $res1)); // returns true
var_dump(password_verify("test", $res2)); // returns true
因此,正如您所看到的,两个哈希都会使用password_verify()方法为您提供,因此,您无需检查两个哈希值是否属于同一密码.并且,如果这样做,上面的逻辑可用于构造这样的函数:
function belongs_to_password() {
$args = func_get_args();
$str = array_shift($args);
foreach ($args as $hash) {
if (!password_verify($str, $hash)) return false;
}
return true;
}
上述函数可用于检查传递给此函数的哈希值是否全部用于相同的密码.并且,可以像这样使用:
$res1 = "$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO";
$res2 = "$2y$10$M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re";
var_dump(belong_to_password("test", $res1, $res2)); // returns true
标签:password-hash,php-password-hash,php,passwords,encryption 来源: https://codeday.me/bug/20190831/1773942.html