2012-02-24 241 views
0

我正在開發網站,我盡我所能確保我有一個很好的安全系統。我要告訴你我做了什麼,我還有關於這個系統的另一個問題。最安全的用戶登錄系統

1)我使用SHA512方法散列password.salt並將其保存在數據庫

2)我的鹽是隨機產生並每鹽是唯一的,我使用此方法(中Yii框架開發)

class Random extends CApplicationComponent 
{ 
    public static function intRandom($min, $max) 
    { 
     $bits = ''; 

     $diff = $max-$min; 
     $bytes = ceil($diff/256); 


     $fp = @fopen('/dev/urandom','rb'); 
     if ($fp !== FALSE) { 
      $bits .= @fread($fp,$bytes); 
      @fclose($fp); 
     } 
     $bitlength = strlen($bits); 
     for ($i = 0; $i < $bitlength; $i++) { 
      $int = 1+(ord($bits[$i]) % (($max-$min)+1)); 
     } 
     return $int; 
    } 

    public static function strRandom($length) { 
     $chars = "[email protected]#$%^&*()_-+=|]}[{;:?.,></"; 

     $size = strlen($chars); 
     for($i = 0; $i < $length; $i++) { 
      $str .= $chars[ self::intRandom(0, strlen($chars)-1) ]; 
     } 

     return $str; 
    } 
} 

3)用戶包廂後在我生成新的鹽和散列password.new_salt(當然每鹽必須是唯一的)

 while ($record2 !== null){ 
      $salt = Random::strRandom(32); 
      $record2 = User::model()->findByAttributes(array('salt'=>$salt)); 
     } 
     $record->salt = $salt; 
     $record->password = hash('sha512', $this->password.$salt); 
     $record->save; 

4)現在是時候爲s數據庫中的ave salt,我正在使用Rijndael雙向加密方法。 mc_key位於php文件中,每個月我都會替換它。

function mc_encrypt($encrypt, $mc_key) { 
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv)); 
    $encode = base64_encode($passcrypt); 
    return $encode; 
} 

// Decrypt Function 
function mc_decrypt($decrypt, $mc_key) { 
    $decoded = base64_decode($decrypt); 
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv)); 
    return $decrypted; 
} 

那麼,您怎麼看?這是足夠的還是我應該使用更多的東西?

我認爲,我爲黑客製造了噩夢,或者我只是另一個試圖製造另一輛自行車的愚蠢的程序員。

+4

我覺得這是比較合適的[代碼審查(http://codereview.stackexchange.com/),因爲似乎沒有是一個問題,你正在尋找更多的批評。 – cspray 2012-02-24 18:59:19

+1

你應該得到一隻狗。 – 2012-02-24 18:59:57

+2

**最安全的**用戶登錄系統是帶有兩步驗證的Google OAuth。 – SLaks 2012-02-24 19:00:10

回答

0

一個問題,檢查出河豚 [標誌crypt_blowfish的是,普通的SHA512快。您應該使用較慢的方法,如bcrypt


而且intRandom。如果我理解正確

  1. /dev/urandom不存在時它會靜默失敗,而不是大聲死亡。
  2. $max-$min>=256的邏輯看起來完全破碎。
  3. $min != 1被打破
  4. 它的返回值不統一
+0

你的建議是什麼?或者是否有一些延伸產生真正隨機的字符串? – Irakli 2012-02-24 19:09:33

+0

@ user1228636原則上使用'/ deb/urandom'是一個好主意。您只需要將字節正確地轉換爲int,並且如果無法打開/讀取,則需要'die()'。但由於我不是PHP程序員,我不知道任何現成的功能。 – CodesInChaos 2012-02-24 19:13:30

-1

,如果你正在尋找一個加密算法,你可能想在地下室包1

+0

我知道Blowfish在php 5.3後支持,但在我的情況下,它不被支持,我使用php 5.1,我無法改變它 – Irakli 2012-02-24 19:05:09

+1

@ user1228636:你想安全嗎?在5.1上?咦?先升級。然後擔心它。否則,就像你正在試圖把槍口放在槍傷上一樣...... – ircmaxell 2012-02-24 19:06:10

+0

河豚它是一個塊密碼,你的意思是bcrypt。 – CodesInChaos 2012-02-24 19:07:41