私はウェブサイトを開発しており、優れたセキュリティシステムを確保するために最善を尽くしています. 私が行ったことをお話ししますが、このシステムについてもう 1 つ質問があります。
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 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-+=|]}[{;:?.,></";
$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) データベースにソルトを保存する時が来ました。私はこれに 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;
}
それで、あなたはどう思いますか?十分ですか、それとももっと何かを使用する必要がありますか?
私は、ハッカーにとって悪夢を作ったのだと思います。あるいは、別の自転車を作ろうとしているただの愚かなプログラマーだと思います。