php password_hash 和 password_verify 问题
php password_hash and password_verify issue
我试图了解表单、password_hash 和验证是如何工作的。这是我写的简单代码。
我得到的结果是 "invalid Password"
我错过了什么?
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="pwd">
Password:
<table>
<tr>
<td><input name="passwd" type="text"/></td>
</tr>
<tr>
<td align="center"><br/>
<input type="submit" name="submit_pwd" value="hash"/>
</td>
</tr>
</table>
</form>
<?php
$passwd = $_POST['passwd'];
echo "Password : <BR>".$passwd."\n <BR>" ;
echo "Hash : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>";
if (password_verify($passwd, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>
</body>
</html>
$hash
变量在 echo
中时不会正确设置。使用这个:
$passwd = $_POST['passwd'];
$hash = password_hash($passwd, PASSWORD_DEFAULT);
echo "Password : <BR>".$passwd."\n <BR>" ;
echo "Hash : <BR>".$hash. "\n <BR>";
if (password_verify($passwd, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
让我解释一下这里发生了什么(以及没有发生什么)。
以下是做什么的...
$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>"
是一项作业,您在其中尝试散列密码,其中还将包含一个换行符、一个 space 和一个 <BR>
标记。
然后,尝试验证输入的密码是否与输入的密码匹配,换行符,space和<BR>
。
- 这很难做到,你同意吗?
您还应该收到关于 $passwd = $_POST['passwd'];
的未定义索引通知,因此使用指定的提交输入将整个代码包装在条件语句中。
您需要将代码更改为以下内容,同时完全删除 . "\n <BR>"
。
if(isset($_POST['submit_pwd'])){
$passwd = $_POST['passwd'];
echo "Password : <BR>".$passwd."\n <BR>" ;
echo "Hash : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT);
if (password_verify($passwd, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
}
这里有一个使用 MD5 作为例子的简单测试来证明这一点,(注意我在这里没有使用 password_hash()
,因为它会产生不同的散列并且很难真正证明差异) ;代码部分借自 http://php.net/manual/en/function.md5.php
请记住,MD5 产生相同的散列值。
$str_good = 'apple';
$str_bad = 'apple'. "\n <BR>";
echo md5($str_good); // produces 1f3870be274f6c49b3e31a0c6728957f
echo "<br>";
echo md5($str_bad); // produces cb2a3d3161fcc99dcf5e4ccd3bfbb14c
echo "<br>";
if (md5($str_good) === '1f3870be274f6c49b3e31a0c6728957f') {
echo "Would you like a green or red apple?";
}
您会注意到没有添加 . "\n <BR>"
的赋值产生与另一个不同的值。
- 这与您此处的代码所发生的相同。
"What am I missing?"
- 问题不是缺少什么,而是太多了。
修复非常简单,只需删除 . "\n <BR>"
即 "what is too much"。
我试图了解表单、password_hash 和验证是如何工作的。这是我写的简单代码。 我得到的结果是 "invalid Password"
我错过了什么?
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="pwd">
Password:
<table>
<tr>
<td><input name="passwd" type="text"/></td>
</tr>
<tr>
<td align="center"><br/>
<input type="submit" name="submit_pwd" value="hash"/>
</td>
</tr>
</table>
</form>
<?php
$passwd = $_POST['passwd'];
echo "Password : <BR>".$passwd."\n <BR>" ;
echo "Hash : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>";
if (password_verify($passwd, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>
</body>
</html>
$hash
变量在 echo
中时不会正确设置。使用这个:
$passwd = $_POST['passwd'];
$hash = password_hash($passwd, PASSWORD_DEFAULT);
echo "Password : <BR>".$passwd."\n <BR>" ;
echo "Hash : <BR>".$hash. "\n <BR>";
if (password_verify($passwd, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
让我解释一下这里发生了什么(以及没有发生什么)。
以下是做什么的...
$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>"
是一项作业,您在其中尝试散列密码,其中还将包含一个换行符、一个 space 和一个 <BR>
标记。
然后,尝试验证输入的密码是否与输入的密码匹配,换行符,space和<BR>
。
- 这很难做到,你同意吗?
您还应该收到关于 $passwd = $_POST['passwd'];
的未定义索引通知,因此使用指定的提交输入将整个代码包装在条件语句中。
您需要将代码更改为以下内容,同时完全删除 . "\n <BR>"
。
if(isset($_POST['submit_pwd'])){
$passwd = $_POST['passwd'];
echo "Password : <BR>".$passwd."\n <BR>" ;
echo "Hash : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT);
if (password_verify($passwd, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
}
这里有一个使用 MD5 作为例子的简单测试来证明这一点,(注意我在这里没有使用 password_hash()
,因为它会产生不同的散列并且很难真正证明差异) ;代码部分借自 http://php.net/manual/en/function.md5.php
请记住,MD5 产生相同的散列值。
$str_good = 'apple';
$str_bad = 'apple'. "\n <BR>";
echo md5($str_good); // produces 1f3870be274f6c49b3e31a0c6728957f
echo "<br>";
echo md5($str_bad); // produces cb2a3d3161fcc99dcf5e4ccd3bfbb14c
echo "<br>";
if (md5($str_good) === '1f3870be274f6c49b3e31a0c6728957f') {
echo "Would you like a green or red apple?";
}
您会注意到没有添加 . "\n <BR>"
的赋值产生与另一个不同的值。
- 这与您此处的代码所发生的相同。
"What am I missing?"
- 问题不是缺少什么,而是太多了。
修复非常简单,只需删除 . "\n <BR>"
即 "what is too much"。