2014-01-10 77 views
1

我有以下的密碼:password_hash和password_verify返回false

123 

現在我湊這一點,它返回以下重點:

$2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J 

現在我嘗試使用來驗證相同的密鑰:

return password_verify(123, $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J); 

但是,這將返回false。

有誰能告訴我爲什麼?

更新

這是我的全碼:

<?php 
/** 
* Created by JetBrains PhpStorm. 
* User: Marc 
* Date: 14-12-13 
* Time: 13:56 
* To change this template use File | Settings | File Templates. 
*/ 
class Security { 
    /** 
    * @param $string 
    * @return mixed 
    */ 
    public function encrypt($string) { 
     return password_hash($string, PASSWORD_DEFAULT); 
    } 

    /** 
    * @param $string 
    * @param $hash 
    * @return mixed 
    */ 
    public function validate($string, $hash) { 
     return password_verify($string, $hash); 
    } 
} 

    $hash = $this->db->template("SELECT password FROM User WHERE username = '".$username."'", READ_FROM_QUERY)['password']; 
$validate = $this->getSecurity()->validate($password, $hash); 

我嘗試插入下面的字符串:

Helloworld 

然而$validate = false;

密碼必須返回到$2y$10$VbicsFaGN9d3ggQTNYIto.Bp6x/rbjpsBe2kneEhJ9oP2KdPsZ7hy

如果我試圖和老調重彈,它返回相同的值洙,他們必須彼此相等,那麼爲什麼它返回假的?!??!

返回false以及

$validate = $this->getSecurity()->validate((string)$password, (string)$hash); 
+0

嘗試將密碼作爲字符串傳遞給password_verify() –

+0

您是如何生成該哈希的? 'password_verify()'只能運行在'password_hash()'哈希密碼?!? – loveNoHate

+0

好吧,讓我試着重新說明我的問題 –

回答

8

爲了您的第一個例子,與123密碼,問題是,你是截斷哈希值。

$settings = array('cost' => 10, 'salt' => 'rSq.2M7Ikc.QPhVtYlp1Nu');           
echo password_hash('123', PASSWORD_BCRYPT, $settings); 
// $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J/WWUma/RrNWKFay // What is echoed 
// $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J    // Your hash 

我會假設你的數據庫colum的最大長度爲45個字符,這就是爲什麼它會截斷它。

對於第二個字符串,問題在於沿着行的某處將密碼轉換爲小寫字母。

// Uppercase 'H' 
$settings = array('cost' => 10, 'salt' => 'VbicsFaGN9d3ggQTNYIto.'); 
echo password_hash('Helloworld', PASSWORD_BCRYPT, $settings); 
// $2y$10$VbicsFaGN9d3ggQTNYIto.qFAer7kUmKmcy6y9RCNzaaKD7fJraba 

// Lowercase 'h' 
$settings = array('cost' => 10, 'salt' => 'VbicsFaGN9d3ggQTNYIto.'); 
echo password_hash('helloworld', PASSWORD_BCRYPT, $settings); 
// $2y$10$VbicsFaGN9d3ggQTNYIto.Bp6x/rbjpsBe2kneEhJ9oP2KdPsZ7hy 

因此,當您嘗試使用Helloworld驗證,因爲哈希是helloworld它會返回false。

你真的需要更加小心,因爲這些都是非常粗心的錯誤。注意,你永遠不應該把密碼轉換成特定的情況(上限或下限),因爲這會顯着削弱它們。

+0

這可能是相關的,從http://php.net/crypt --- *「標準的基於DES的crypt()返回salt作爲輸出的前兩個字符。它也只使用str的前八個字符,所以以相同八個字符開頭的較長字符串將會生成相同的結果(當使用相同的鹽時)。「* –

+1

@ Fred-ii-有趣......但password_hash使用(注意字符串以'$ 2y $'開始) – Mike

+0

我認爲它可能是相同或類似的情況 –

相關問題