我正在开发网站,我正在尽力确保我有一个良好的安全系统。我将告诉你我做了什么,我还有另一个关于这个系统的问题。
1)我使用sha512方法散列密码.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)用户进入后,我正在生成新盐和哈希密码.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;
}
那么,您怎么看?是否足够或者我应该使用更多东西?
我想,我为黑客制造了噩梦,或者我只是另一个试图创造另一辆自行车的愚蠢程序员。
答案 0 :(得分:0)
一个问题是普通的SHA512很快。您应该使用较慢的方法,例如bcrypt
intRandom
糟透了。如果我理解正确
/dev/urandom
不在时,它会无声地失败,而不是大声死亡。$max-$min>=256
的逻辑看起来完全破碎了。$min != 1
已损坏答案 1 :(得分:-1)
如果您正在寻找加密算法,您可能需要查看河豚 [加密包1
中的CRYPT_BLOWFISH标志