首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php password_hash和password_verify问题

php password_hash和password_verify问题
EN

Stack Overflow用户
提问于 2016-10-29 17:59:34
回答 2查看 516关注 0票数 1

我试着理解表单、password_hash和验证是如何工作的。下面是我编写的简单代码。我得到的结果是“无效密码”。

我遗漏了什么?

代码语言:javascript
复制
<!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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-29 20:36:36

让我解释一下这里正在进行的(和不进行的)事情。

下面这些是..。

代码语言:javascript
复制
$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>"

是一个赋值,您正在尝试散列密码,该密码还将包含一个分行符、一个空格和一个<BR>标记。

然后,尝试验证输入的密码是否与输入的密码、行中断、空格和<BR>匹配。

  • 很难做到,你不同意吗?

您还应该得到关于$passwd = $_POST['passwd'];的未定义索引通知,因此使用指定的submit输入将整个代码包装在一个条件语句中。

您需要将代码更改为以下内容,同时完全删除. "\n <BR>"

代码语言:javascript
复制
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生成相同的哈希值。

代码语言:javascript
复制
$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>"的赋值会产生与其他值不同的值。

  • 这是发生在您的代码中的相同的事情。

“我少了什么?”

  • 问题不在于缺少什么,而在于什么是太多。

修复就像移除. "\n <BR>"一样简单,这就是“什么是太多了”。

票数 1
EN

Stack Overflow用户

发布于 2016-10-29 18:05:07

$hash变量在echo内部不能正确设置。用这个:

代码语言:javascript
复制
$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.';
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40321996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档