PHPのOpenSSL関数を利用して暗号化する例

(更新日: 2017/03/13)

色々やることがあってブログを更新できていませんでした。久々のブログはPHPのOpenSSL関数を使ってAES-256-CBCを使って暗号化する例です。今時のハードウェアとソフトウェアならハードウェアAESが利用できるので普通はAES-256-CBCで構わないでしょう。

暗号を利用する場合のポイントは以下の通りです。

  • IV(Initialization Vector ソースでは$iv)にはランダムな「バイト」を利用する。IVに16進数のハッシュ「テキスト」を使うと折角のIVの空間を半分にしてしまいます。IVには毎回ランダムバイトを設定する。
  • 鍵($key)には「バイト」を利用する。IVと同様にハッシュ「テキスト」などを使うと鍵空間が半分になってしまう。
  • 人に256ビットの鍵を要求するのは非現実的なので、パスワードはどんなパスワードでも受け付けるようにする。(勿論、パスワードは長くて強固な方が良い)
  • 同じパスワードで同じ暗号文が作られては困るので、ランダムなSaltを付け加えて毎回異なる暗号文が生成されるようにする。

暗号化後のデータはバイナリで返されるのでBase64でエンコードして取り扱いやすくして返しています。バイナリのままで構わない場合、Base64でエンコード/デコードするのは無駄なので省いて下さい。

これらの要件を満たしたコードは以下のようになります。

 

これを複数回実行すると、毎回異なる暗号文が生成され、正しく復号されていることが分かります。

検索してみると、IVや鍵にランダム「テキスト」を利用している例が多かったようです。ランダム「バイト」を使わないと暗号強度を不必要に落としてしまうので注意して下さい。

人が設定するパスワードは脆弱なので、ランダムバイトの秘密のデータと連結して使うと鍵がより強固になります。

$saltを秘密にしておける場合は、$saltを秘密にするようにして利用してください。例えば、特定の暗号データに対する$saltをサーバー側で保存し、復号時に設定できるような場合には$saltを秘密にするとより安全になります。

この例では、鍵($key)を生成する方法にSHA-256を利用していますが、この鍵生成アルゴリズムを秘密にすることでより安全になります。鍵生成のアルゴリズムを知らなければ、攻撃者はパスワードのみでなく、鍵生成のアルゴリズムの推測も行わなければなりません。複数の種類のハッシュ関数を利用する、ハッシュ関数を複数回適用する、IVと同じようにパスワード+秘密のランダムバイトを使ってハッシュ関数を適用するなどの方法が考えられます。AES-256は鍵サイズが256ビットなので鍵空間が小さくならないよう注意してください。例えば、128ビットのハッシュであるMD5で単純にMD5ハッシュを生成しSHA-256ハッシュを生成するなど、とすると鍵空間を小さくしてしまいます。

弱い鍵を強い鍵にする方法も紹介しました。弱い鍵を使う必要がある場合、こちらを参考にしてください。

Comments

comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です