-1

据我目前的理解(至少我认为),password_hash() 函数根据使用的算法、成本和盐生成哈希。而password_verify 使用eg 提供的信息password_hash($pass, PASSWORD_BCRYPT, array('cost'=>10))来检查返回的值是真还是假,因为它包含验证所需的所有信息。

我以前用过

$SQL_Query = "SELECT * FROM DB_Table WHERE userName = '".$username."'" AND password = $ID;

这将起作用,因为它们以纯文本形式存储并且可以返回 true,而从逻辑上讲,这一次它不会起作用。

我遇到过类似的问题,他们在解释中使用静态密码,例如

<?php

$to_verify = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $to_verify)) 
{
    echo 'Password is valid!';

} else 
{
    echo 'Wrong password.';
}

我难以理解的概念是,如果密码输入存储在数据库中,而不是在那个时间点被页面知道,如何检查密码输入与哈希值?我最近得到了有关存储值的帮助,这对我来说是一个愚蠢的错误,但我想这并没有像我现在希望的那样点击我。

4

2 回答 2

1

一起看 和 的password_hash()例子password_verify()

生成的哈希字符串password_hash是自描述的:它包含算法和使用的随机盐的指示。 password_verify知道这一切。它知道如何为最近和老式的密码“做正确的事”。

因此,只需查询数据库以获取该用户的(散列 ...)密码。然后,用于password_verify()查看此哈希值是否与此密码值匹配。

您不能同时查询用户名AND password。仅查询用户名,获取哈希值,并用于password_verify()检查。

于 2015-05-04T21:58:49.743 回答
0

每次随机生成哈希

不,对于给定的输入、盐值和运行哈希算法的迭代(由成本参数控制),哈希总是相同的。

我难以理解的概念是,如果密码输入存储在数据库中,而不是在那个时间点被页面知道,如何检查密码输入与哈希值?

您将在登录时检查密码输入,使用用户提供的密码、盐和潜在的次数来应用与该用户关联的哈希算法。一旦密码检查成功,使用会话或其他机制保持用户登录。

于 2015-05-04T21:50:06.470 回答