2016-02-18 27 views
0

我有一個腳本代碼來登錄。將sha1更改爲password_hash不工作

不幸的是,這個使用sha1不再推薦。我試圖將其更改爲password_hash(),但它失敗了。

原始

public static function create($username, $password) 
{ 
    $q = self::$db->prepare('INSERT INTO user(username, password, email) VALUES (:username, :password, :email)'); 

    return $q->execute(array(
     ':username' => $username, 
     ':password' => sha1($password), 
     ':email' => $email, 
    )); 
} 

編輯

public static function create($username, $password) 
{ 
    $q = self::$db->prepare('INSERT INTO user(username, password, email) VALUES (:username, :password, :email)'); 

    $new_password = password_hash($password, PASSWORD_DEFAULT); 

    return $q->execute(array(
     ':username' => $username, 
     ':password' => $new_password, 
     ':email' => $email, 
    )); 
} 

這有什麼錯呢?

+2

你得到的錯誤是什麼? –

+0

它會拋出任何錯誤嗎? – phaberest

+0

@Norax。請做一個你的PHP的版本檢查http://php.net/manual/en/function.password-hash.php – rahul

回答

2

祝賀您改變了一種古老而不安全的算法!

我對如何在my answer to PHP Secure password generation and storage使用password_hash一些信息,但它的本質如下複製:

特別是,你可以用一個足夠高的成本(挑選只需長成本散列密碼以至於您的預計最大負荷下,您的網站將不太CPU綁定) - 就像在password_hash Example 2,但是有一個更新的工作因素:

<?php 
/** 
* In this case, we want to increase the default cost for BCRYPT to 12. 
* Note that we also switched to BCRYPT, which will always be 60 characters. 
*/ 
$options = [ 
    'cost' => 14, 
]; 
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n"; 
?> 

然後你存儲它返回字符串,其中包括一個密碼生成隨機鹽和你設定的工作因素 - 增加工作因子爲m根據高峯期的登錄速率與CPU功耗的比較,記住在高峯期,所有內核都可以並行工作,因爲它們每個都會針對不同的用戶進行哈希處理!

要進行驗證,獲取它,無論你保存它返回的字符串(如數據庫),並與password_verify example比較:與往常一樣

<?php 
// See the password_hash() example to see where this came from. 
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

if (password_verify('rasmuslerdorf', $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
?> 

,如果你想詳細信息,請閱讀Thomas Pornin's canonical answer to How to securely hash passwords - 但PHP 5.5密碼功能使用Bcrypt,所以你可以使用足夠高的成本。

+0

加上使用「工作因子」! – zaph