2012-06-07 41 views
0

我最近開始的一個項目工作,它包含以下功能散列密碼:這是哈希函數矯枉過正

function hash_password($password) { 
    $account_id = $this->account_id; 

    /* 
    * Cook up some randomness 
    */ 
    $password = str_rot13($password); 

    $random_chars = "1%#)(d%6^".md5($password)."&H1%#)(d%6^&HB(D{}*&$#@[email protected]".md5($password)."``~~+_+_O(Ed##fvdfgRG:B>"; 

    $salt = $account_id; 
    $salt = ((int)$salt * 123456789) * 1000; 

    $salt_len  = strlen($salt); 

    for($i=0; $i <= $salt_len; $i++) { 
     $salt .= $random_chars[$i];    
    } 

    $salt = str_repeat($salt, 3); 

    return hash('sha256', base64_encode($password.$salt.$password), false); 
} 

* $ ACCOUNT_ID是唯一的每個用戶帳戶。

我的問題是:該功能的任何不是做簡單的東西更安全:

$salt = sha1($account_id); 
$hash = hash('sha256', base64_encode($password.$salt), false); 

乾杯!

+0

只要你正確地使用它,它使用什麼散列算法並不重要。即使SHA1可以用很好的鹽來保證安全。 –

+1

'這個函數更安全嗎? - 好的,但是'這個哈希函數是否過度殺死 - - 肯定是的。你正在使用很多CPU週期來散列密碼 - 每次你處理一個登錄,或者一個用戶改變他們的密碼,[或者],你需要集中精力更多(如果它們*是敏感的)會阻止人們首先獲得散列密碼。 – DaveRandom

+1

實際上它可能不太安全,因爲熵要高得多 - 請參閱https://www.grc.com/haystack.htm - 無論如何,您應該使用bcrypt – scibuff

回答

0

將帳戶ID用作鹽可能不是一個好主意 - 如果有人可以竊取您的哈希密碼,那麼他們也可能獲得帳戶ID。因此,在這種情況下,在代碼中使用更復雜的哈希值可能會更安全,前提是代碼也可以得到很好的保護。使用已知的隨機字符串作爲代碼中的鹽,意味着有人必須破解數據和代碼才能攻擊密碼 - 這必須比僅僅攻擊數據庫要好。

相關問題