0
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;
4

1 回答 1

2

你使用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>";
}

PS我不确定您为什么要尝试获取$hashfrom的值$_GET。如果您让用户同时指定密码和哈希,他们可以欺骗您的应用程序授予访问权限。我假设这只是一个测试,您将在您的真实应用程序中使用数据库或其他安全存储。

于 2014-03-25T03:25:34.263 回答