0

最近、パスワードハッシュとデータ暗号化について SO でよく読んでいます。つまり、ベストプラクティスを決定するのは本当に混乱しています。どこでも再利用でき、PHP アプリケーションにまともなセキュリティ レベルを提供する非常に単純なクラスが必要です (私は銀行データを処理しません)。さらに、PHP 標準ライブラリにできるだけ依存したいと考えています。私はこれを思いつきました:

class Security {

    public static function hashPassword($plain) {
        $salt = md5(rand(0, 1023) . '@' . time()); // Random salt
        return crypt($plain, '$2a$07$' . $salt); // '$2a$07$' is the Blowfish trigger
    }

    public static function checkPassword($plain, $hash) {
        return (crypt($plain, $hash) === $hash);
    }

    public static function generateIv() {
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); // It's 32
        return mcrypt_create_iv($iv_size, MCRYPT_RAND);
    }

    public static function encrypt($key, $data, $iv = null, $base64 = true) {
        if (is_null($iv)) $iv = md5($key);
        $ret = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
        return ($base64 ? base64_encode($ret) : $ret);
    }

    public static function decrypt($key, $data, $iv = null, $base64 = true) {
        if (is_null($iv)) $iv = md5($key);
        return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $base64 ? base64_decode($data) : $data, MCRYPT_MODE_CBC, $iv), "\0");
    }

}

ご覧のとおり、Blowfish ハッシュ アルゴリズムcrypt()を使用してパスワードをハッシュすることにしました。の戻り値は、DB に保存するソルト + ハッシュです。私がこの選択をしたのは、すべてのサーバーで利用可能であり、使用されるアルゴリズムに関係なくハッシュをチェックする快適な方法を提供し (salt プレフィックスに基づいています)、bcryptは適切なハッシュ方法であると読んだためです。hashPassword()crypt()

次に、データの暗号化には、Rijndael 256アルゴリズムとCBC モードを使用しました。ご覧のとおり、暗号化方法は 2 つの方法で使用できます。暗号化されたデータとともに DB に保存する IV を渡すことができます (そして IVを作成するのに役立ちます)。そうしない場合、基本的な IV は暗号化と復号化の両方のプロセスでキーから派生します。mcrypt() generateIv()

あなたはそれについてどう思いますか?何か不足していますか?PHP アプリケーションでのハッシュと暗号化について、やっと安心できるでしょうか?!?

4

1 に答える 1

1
  1. AES 標準ではないRijndael 256 ビット暗号化を使用しています。MCRYPT_RIJNDAEL_128代わりに 256 ビット キーを使用して AES ( ) を使用してみてください。

  2. 派生したキーが他のデータの暗号化にも使用される場合は、ランダムな IV を暗号文と共に保持する必要があります。

  3. 古い関数を使用しています。IV にbcryptSHA-256を使用することをお勧めします(16 - ブロックサイズ - 左端のバイトのみを使用)。

このリストは完全ではない可能性があることに注意してください。

于 2012-05-17T00:35:39.667 に答える