我正在開發網站,我盡我所能確保我有一個很好的安全系統。我要告訴你我做了什麼,我還有關於這個系統的另一個問題。最安全的用戶登錄系統
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;
}
那麼,您怎麼看?這是足夠的還是我應該使用更多的東西?
我認爲,我爲黑客製造了噩夢,或者我只是另一個試圖製造另一輛自行車的愚蠢的程序員。
我覺得這是比較合適的[代碼審查(http://codereview.stackexchange.com/),因爲似乎沒有是一個問題,你正在尋找更多的批評。 – cspray 2012-02-24 18:59:19
你應該得到一隻狗。 – 2012-02-24 18:59:57
**最安全的**用戶登錄系統是帶有兩步驗證的Google OAuth。 – SLaks 2012-02-24 19:00:10