0

私はウェブサイトを開発しており、優れたセキュリティシステムを確保するために最善を尽くしています. 私が行ったことをお話ししますが、このシステムについてもう 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;
}

それで、あなたはどう思いますか?十分ですか、それとももっと何かを使用する必要がありますか?

私は、ハッカーにとって悪夢を作ったのだと思います。あるいは、別の自転車を作ろうとしているただの愚かなプログラマーだと思います。

4

2 に答える 2

0

1 つの問題は、プレーンな SHA512 が高速であることです。bcrypt などの低速な方法を使用する必要があります


そしてintRandom 吸う。正しく理解していれば

  1. /dev/urandomが存在しない場合は、大声で死ぬのではなく、静かに失敗します。
  2. のロジック$max-$min>=256は完全に壊れているように見えます。
  3. $min != 1は壊れてます
  4. その戻り値は均一ではありません
于 2012-02-24T19:07:18.523 に答える
-1

暗号化アルゴリズムを探している場合は、blowfish [crypt パッケージ1の CRYPT_BLOWFISH フラグ] を確認してください。

于 2012-02-24T19:03:22.823 に答える