web-dev-qa-db-ja.com

PHPを使用してデータを暗号化する最良の方法-正しく実行しているかどうかわからない

Mysqlデータベースにデータを追加するときに、phpファイル内の一部のデータを暗号化したい。

これが私のやり方です。

次のような静的キーを作成します。

$key = md5("pass");

それから私はencrypt()とdecrypt()と呼ばれる2つの関数を持っています、そしてそれらはこれをします:

function encrypt($string, $key){
    $string = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB)));
    return $string;
}

function decrypt($string, $key){
    $string = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($string), MCRYPT_MODE_ECB));
    return $string;
}

これがベストプラクティスかどうかはわかりませんが、md5以外のキーを生成するにはどうすればよいですか?

2
Benj Mikesozery

このアプローチには少なくとも2つの問題があります。

  1. 鍵生成の選択
  2. 暗号化の選択 mode

鍵の生成

キーとしてmd5("static password")を実行しています。これは本当に悪いです。まず、MD5から128ビットのみを取得し、256ビットのキー付きAESを使用しているため、使用していないもののサイクルが無駄になります(AES-256はAES-128より遅いため)。第二に、あなたのパスワードは弱いです。 _"pass"_はnot安全なパスワードです。本番環境で使用するためにより強力な much に置き換えてください。 3番目に、パスワード処理に plain MD5 を使用しています( パスワードハッシュに関する正規の回答も参照 )。暗号文は事前に計算された(Rainbow)テーブルを使用して攻撃される可能性があり、MD5は高速ハッシュ関数であり、パスワードのブルートフォースを高速に実行できるため、これは非常に悪いことです。 4番目:パスワードを使用するのはなぜですか!?。希望するサイズの安全でランダムに生成されたキーの代わりに静的(人間が読める)パスワードを使用する論理的な理由はありません。このように、ブルートフォースを心配する必要はありません。MD5を使用することを心配する必要はありません(これは悪い結果をもたらします)。キーが短すぎることを心配する必要はありません。

暗号化モード

暗号化アルゴリズムとしてAES-256を使用している間(これは問題ありません)、操作モードとして [〜#〜] ecb [〜#〜] を使用していますAES。この方法には2つの問題があります。a)リークしているAESブロック(16バイト)が等しいこと、b)メッセージに16バイトの倍数になるようにパディングする必要があること。これらの問題を修正するには、モードを切り替える必要があります。 [〜#〜] gcm [〜#〜] が最適なオプションです。残念ながら、これはPHP ntil PHP 7.1 via openssl_encrypt()またはmcrypt_encrypt()(OpenSSLよりも遅く、メンテナンスも強化もされていないため、実際には使用しないでください。)すでにPHP 7.1がある場合は、AESを使用できます。 -GCMとopenssl_encrypt()を使用すると、暗号化ごとに一意の(秘密ではない)ナンスを渡せば、暗号文が読み取られたり変更されたりするのを防ぐことができます。適切なPHP 7.1 [〜#〜] aead [〜#〜] 暗号化、アドホック構成を使用する必要があります。つまり、最初に(ランダム)16バイトを使用してデータを暗号化します [〜#〜] iv [〜#〜] with [〜#〜] ctr [〜#〜] モードで、- [〜# 〜] hmac [〜#〜] - SHA256 暗号文を生成し、結果のタグを保存して、次回の読み取りアクセス時に検証できるようにします。

7
SEJPM