【PHP実践|実務向け】OpenSSLによる安全な文字列暗号化の実装ガイド

導入

Webアプリケーション開発において、機密情報をデータベースへ保存したり、外部APIとやり取りしたりする際、データの暗号化は避けては通れない要件です。かつてPHPで主流だったmcrypt拡張は既に非推奨となり、現在はOpenSSL拡張を利用するのが標準的なベストプラクティスです。本記事では、実務で安全にデータを暗号化・復号するための実装方法を解説します。

基礎知識

暗号化とは、特定のパスワード(鍵)を使用してデータを判読不能な形式に変換する処理です。ここで重要なのが初期化ベクトル(IV: Initialization Vector)です。IVは、同じデータと鍵を使っても、暗号化のたびに異なる暗号文を生成させるためのランダムな値です。これにより、推測攻撃を防ぐことができます。また、暗号化方式(cipher method)はOSやPHPの環境に依存するため、実行環境で利用可能なものを選択する必要があります。

実装/解決策

OpenSSLでの暗号化は、以下の手順で行います。
1. 利用可能な暗号化方式を選択する。
2. 選択した方式に応じたIVの長さを取得する。
3. 安全な乱数生成器を用いてIVを生成する。
4. openssl_encrypt関数で暗号化し、必要に応じてbase64エンコードを行う。
5. 復号時は同じ鍵とIVを用いてopenssl_decrypt関数で元に戻す。

サンプルプログラム

以下のコードは、実務でも汎用的に使えるAES-256-CBC方式による実装例です。

応用・注意点

実務における重要な注意点を3つ挙げます。

1. パスワード管理: 鍵となる文字列をソースコードに直書きするのは厳禁です。.envファイルやサーバーの環境変数を利用しましょう。
2. パスワード保存への利用禁止: ユーザーのログイン用パスワードを保存する場合は、暗号化ではなくpassword_hash()関数による「不可逆なハッシュ化」を行ってください。暗号化は「復号」が前提ですが、パスワードは復号する必要がないためです。
3. IVの保存: 暗号化のたびに生成したIVは、復号時に必要となります。サンプルコードのように、暗号化されたデータと一緒に保存(連結してbase64化など)するのが一般的です。IV自体は秘匿する必要はありませんが、暗号文ごとに一意である必要があります。

タイトルとURLをコピーしました