PHPass拒绝检查哈希值


PHPass refuses to check hashes

include 'lib/php/PasswordHash.php';
$hash = $_GET['hash'];
$pass = $_GET['pass'];
$hasher = new PasswordHash(8, false);
$pass = $hasher->HashPassword($pass);
echo "Original:<br>" . $pass . "<br>";
$checked = $hasher->CheckPassword($pass, $hash);
echo "Hashed:<br>" . $checked . "<br>";
echo "<br>";
echo "Are they equal? <b>"; 
if($pass == $checked){ echo "Yep!</b>";} else{
    echo "Nope. </b>";
}

上面那段极其简单的代码根本没有按预期工作。是的,pass变量得到了散列并正确输出,但是CheckPassword()根本无法输出任何内容。我已经测试了一个简单的单词"hello",并将它们直接插入函数(例如CheckPassword('$2…"、"2美元…");它仍然没有输出。

我正在XAMPP Windows上运行,我刚刚被迫得出结论,这一定是问题所在。我使用此代码而不是实际项目来删除数据库作为一个因素,并发现了此问题。

尽量克制自己不要因为代码的丑陋而呕吐,但这是让它工作的绝望尝试。

如果你自己运行这段代码,你需要在URL中放置一个'pass'和'hash' GET变量来测试这一点。很可能我在某个地方犯了一个严重的错误,所以我一点也不自信去责怪我的环境。

编辑:

我使用下面的代码来生成在URL

中使用的初始变量
    $hash = $_GET['hash'];
$hasher = new PasswordHash(8, false);
$hash = $hasher->HashPassword($pass);
echo $hash;

您使用CheckPassword不正确。第一个参数应该是纯文本;第二个是哈希值,根据文档 。您将$pass设置为散列值,然后将其用作CheckPassword中的第一个参数。

更正代码(未经测试):

include 'lib/php/PasswordHash.php';
$hash = $_GET['hash'];
$pass = $_GET['pass'];
$hasher = new PasswordHash(8, false);
// Just delete this line: $pass = $hasher->HashPassword($pass);
echo "Original:<br>" . $pass . "<br>";
$checked = $hasher->CheckPassword($pass, $hash);
echo "Hashed:<br>" . $checked . "<br>";
echo "<br>";
echo "Are they equal? <b>"; 
if($pass == $checked){ echo "Yep!</b>";} else{
    echo "Nope. </b>";
}

注:我不知道你为什么要从$_GET中得到$hash的值。如果您让用户同时指定密码和散列,那么它们可能会欺骗您的应用程序授予访问权限。我假设这只是一个测试,您将在实际应用程序中使用数据库或其他安全存储。