スキップしてメイン コンテンツに移動

PHP8 AES-256暗号化

PHP8 AES-256暗号化

共通鍵暗号とAES-256-CBC

機密データを安全に保護するために、共通鍵暗号(対称鍵暗号)は広く利用されています。AES(Advanced Encryption Standard)はその代表的なアルゴリズムで、256ビット鍵長を持つAES-256-CBCモードは、現在のセキュリティ基準に適合しています。CBC(Cipher Block Chaining)モードでは、各ブロックの暗号化に前のブロックの暗号文を XOR するため、同じ平文でも異なる初期化ベクトル(IV)を使うと異なる暗号文が生成されます。これにより、リプレイ攻撃やパターン解析が困難になります。

暗号化処理を行う際は、鍵とIVを安全に管理することが不可欠です。鍵は安全な鍵管理サービスやハードウェアセキュリティモジュール(HSM)で保管し、IVは暗号化時にランダムに生成し、暗号文と共に保存します。IVは秘密にする必要はありませんが、同じ鍵で複数回暗号化する場合は必ず異なるIVを使用してください。

PHP8での暗号化処理

PHP8 では、OpenSSL 拡張が標準で組み込まれており、openssl_encryptopenssl_decrypt 関数を使って簡単に暗号化・復号が可能です。以下に基本的な使用例を示します。

$plaintext = "機密データをここに入れます。";
$method = "AES-256-CBC";
$key = hash("sha256", "my_secret_key", true); // 32 バイトの鍵
$iv = random_bytes(openssl_cipher_iv_length($method));

$encrypted = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);
$payload = base64_encode($iv . $encrypted); // IV と暗号文を結合して保存

// 復号
$decoded = base64_decode($payload);
$iv_dec = substr($decoded, 0, openssl_cipher_iv_length($method));
$encrypted_dec = substr($decoded, openssl_cipher_iv_length($method));

$decrypted = openssl_decrypt($encrypted_dec, $method, $key, OPENSSL_RAW_DATA, $iv_dec);
echo $decrypted; // 機密データを表示

上記コードでは、hash 関数で 256 ビット鍵を生成し、random_bytes で安全な IV を作成しています。OPENSSL_RAW_DATA フラグを指定することで、Base64 エンコードを手動で行うことができます。これにより、暗号化されたデータを安全に保存・転送できます。

実装例とベストプラクティス

実際のアプリケーションでは、以下の点に注意して実装してください。

  • 鍵は環境変数や専用の鍵管理サービスに保管し、コードベースにハードコーディングしない。
  • IV は毎回ランダムに生成し、暗号文と共に安全に保存する。
  • 暗号化されたデータは Base64 でエンコードし、データベースやファイルに格納する。
  • 復号時には必ず IV と暗号文を正しく分離し、同じ鍵とアルゴリズムで復号する。
  • エラーハンドリングを徹底し、暗号化失敗時に機密情報を漏らさない。

さらに、PHP8 の openssl_encryptopenssl_decrypt は、内部で安全なランダム生成やパディングを行うため、開発者は低レベルの実装ミスを減らせます。これにより、データ保護とセキュリティを高いレベルで確保できます。

この記事はAIによって作成されました。

コメント