2016-10-29 36 views
1

我嘗試瞭解form和password_hash的工作方式。這是我寫的簡單代碼。 我得到的結果是「無效密碼」php password_hash和password_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> 
+0

什麼是您的Php版本?('echo PHP_VERSION;') – Progrock

回答

2

讓我解釋一下這裏發生了什麼(而不是)。

下面能做什麼......

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

是一個賦值,你想哈希密碼,這也將包含一個換行符,空格和<BR>標籤。

然後,試圖驗證輸入的密碼是否與輸入的密碼匹配,並且換行符和空格以及<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>"分配產生比其他不同的值。

  • 這與您的代碼在這裏發生的情況相同。

「我缺少什麼?」

  • 的問題不是缺少什麼,但什麼是太多了。

修復就像刪除. "\n <BR>"那樣簡單,即「太多了」。

+0

謝謝。它關於PHP如何詮釋這一行 呼應
\ n
「 「$哈希= password_hash($ passwd文件,PASSWORD_DEFAULT)。」; 我會銘記在心 – Dragonet

+0

@Dragonet不客氣如果您希望標記。這個問題已經解決了,勾選勾號,直到它在答案旁邊變成綠色,這告訴大家問題的解決方案已經找到了 –

+0

done 我剛剛得知php解釋這行'code'
「。$ hash = password_hash($ passwd,PASSWORD_DEFAULT)。 「\ n
」; 'code'as'code'$ hash = password_hash($ passwd,PASSWORD_DEFAULT)。 「\ n
'code'not'code'$ hash = password_hash($ passwd,PASSWORD_DEFAULT)'code' – Dragonet

0

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

這不是我在這裏倒下的,但你可能是因爲你不確定它和/或「試試這個」而得到它的。儘管你的答案確實解決了這個問題(我知道爲什麼),但如果你要解釋答案,這對OP和其他人都會有好處,這樣就不會有任何猜測,或者人們問你你做了什麼修復他們的代碼。 –

+0

謝謝@GentlemanMax。 我剛剛得知,PHP解釋此行 '代碼'
「$哈希= password_hash($ passwd文件,PASSWORD_DEFAULT)。」 \ n
「; '代碼' 爲 '代碼' $哈希= password_hash( $ passwd,PASSWORD_DEFAULT)。\ n
'code' 不是 'code'$ hash = password_hash($ passwd,PASSWORD_DEFAULT)'code' – Dragonet

相關問題