【问题标题】:php password_hash and password_verify issuephp password_hash 和 password_verify 问题
【发布时间】:2016-10-29 17:59:34
【问题描述】:

我尝试了解 form、password_hash 和 verify 是如何工作的。这是我写的简单代码。 我得到的结果是“无效密码”

我错过了什么?

<!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>

【问题讨论】:

  • 你的 PHP 版本是什么? (echo PHP_VERSION;)

标签: php html password-hash


【解决方案1】:

让我解释一下这里发生了什么(和没有发生)。

下面是做什么的...

$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>"

是一个作业,您在其中尝试对密码进行哈希处理,该密码还将包含换行符、空格和&lt;BR&gt; 标记。

然后,尝试验证输入的密码是否与输入的密码匹配,以及换行符、空格和&lt;BR&gt;

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

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

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

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 &lt;BR&gt;" 的赋值产生的值与另一个不同。

  • 这与您的代码在此处发生的情况相同。

“我错过了什么?”

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

解决方法很简单,只需删除“什么太多”的. "\n &lt;BR&gt;"

【讨论】:

  • 谢谢。关于php如何解释这一行 echo
    ".$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n
    "; 我会记住
  • @Dragonet 不客气。如果您希望将问题标记为已解决,请勾选复选标记,直到答案旁边变为绿色。这告诉大家已经找到了问题的解决方案。
  • 完成我刚刚了解到 php 将这一行解释为 'code'
    ".$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n
    "; 'code' as 'code ' $hash = password_hash($passwd, PASSWORD_DEFAULT). "\n
    'code' 不是 'code' $hash = password_hash($passwd, PASSWORD_DEFAULT) 'code'
【解决方案2】:

$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.';
} 

【讨论】:

  • 这不是我的反对意见,但您可能因为不确定和/或“试试这个”而得到它。尽管您的回答确实解决了这里的问题(我知道为什么),但这对 OP 和其他所有人都有好处,如果您要解释答案,这样就不会有任何猜测,或者人们问您您做了什么修复他们的代码。
  • 谢谢@GentlemanMax。我刚刚了解到 php 将这一行解释为 'code'
    ".$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n
    "; 'code' as 'code' $hash = password_hash($passwd, PASSWORD_DEFAULT). "\n
    'code' 不是 'code' $hash = password_hash($passwd, PASSWORD_DEFAULT) 'code'
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 2016-04-13
  • 1970-01-01
  • 2022-07-02
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
相关资源
最近更新 更多