こんにちは。セキュリティの現場で長年、泥臭いインシデントと対峙してきた者です。
今日は「暗号化」の話をしましょう。多くのエンジニアが「暗号化=隠すこと」だと思っていますが、実務で本当に怖いのは「隠されていること」ではなく、「中身が誰かにすり替えられていること」なんです。
今日は、現代の通信を守る要「AEAD(認証付き暗号)」について、防犯の例えを交えながら紐解いていきましょう。
—
1. 「ただの鍵」じゃダメな理由:MAC-then-Encryptの罠
想像してみてください。あなたは大切な書類を金庫に入れて、その金庫に「封印シール(MAC)」を貼って送ります。これが昔ながらの「MAC-then-Encrypt」という考え方です。
一見安全そうですが、実は大きな落とし穴があります。泥棒は金庫を開けなくても、「このシールを剥がして別のシールに貼り替える」とか、「金庫そのものを別の偽物にすり替える」という攻撃ができてしまうんです。
特に、暗号化する前に改ざん検知(MAC)をする手法は、暗号化アルゴリズムとの組み合わせ次第で、「パディングオラクル攻撃」という恐ろしい脆弱性を生みます。これは、金庫の鍵が開かない時の「カチャッ」という音だけで、中の構造を当てられてしまうようなものです。
だからこそ、私たちは「暗号化と改ざん検知をセットで行う」AEADという技術を使います。
—
2. AEAD(認証付き暗号)で泥棒をシャットアウト
AEAD(Authenticated Encryption with Associated Data)は、暗号化と同時に「このデータは絶対に途中でいじられていない」という証明書を自動的に発行する仕組みです。
代表格は AES-GCM や ChaCha20-Poly1305 です。これらは「開封した時に、もし中身が1ビットでも書き換えられていたら、エラーを出して中身を一切見せない」という強力なガードを備えています。
なぜこれが最強なのか?
- 一体化: 暗号化と認証のプロセスが不可分。
- 改ざん検知: 復号時にタグ(証明書のようなもの)を検証するため、攻撃者が少しでもデータを改ざんすると、復号プロセスが即座に失敗します。
—
3. 実践:PHPで学ぶAES-GCMの実装
では、実際にどう実装するかを見てみましょう。ここでは、モダンなWeb開発でよく使われる openssl_encrypt を例にします。
<?php
// 暗号化キー(絶対にソースコードに直書きせず、環境変数で管理しましょう!)
$key = random_bytes(32); // 256ビットの強固なキー
$plaintext = "秘密のメッセージ";
// IV(初期化ベクトル)は毎回ランダムに生成!
// 同じデータでも毎回違う暗号文にするための「塩」のようなものです
$iv = random_bytes(openssl_cipher_iv_length('aes-256-gcm'));
// AEADの肝!認証タグ($tag)を渡すのがポイント
$ciphertext = openssl_encrypt(
$plaintext,
'aes-256-gcm',
$key,
$options = OPENSSL_RAW_DATA,
$iv,
$tag // ここに認証タグが書き込まれます
);
// 保存や送信の際は、暗号文だけでなく「IV」と「タグ」もセットで送る必要があります
$payload = base64_encode($iv . $tag . $ciphertext);
echo "暗号化データ: " . $payload;
?>
このコードのポイント
1. IV(初期化ベクトル)の使い回し厳禁: 同じキーとIVで2回暗号化すると、攻撃者にパターンを読まれます。必ず random_bytes で生成してください。
2. タグの保存: 復号するときに、この $tag が一致しないと、PHPは「改ざんされている!」と判断して復号を拒否してくれます。これがセキュリティの「守り」です。
—
4. 現場からのアドバイス:使い分けの指針
- AES-GCM: ほとんどのCPUで高速化が効くハードウェア対応が進んでいます。サーバーサイドの通信やデータベース暗号化の第一候補です。
- ChaCha20-Poly1305: スマホやIoT機器など、AES専用の演算回路を持たないデバイスで非常に高速です。また、AESよりも実装ミスによる脆弱性が起きにくいという特性があります。
—
最後に:セキュリティは「完璧」を目指さない
最後にこれだけは覚えておいてください。セキュリティに「絶対」はありません。しかし、AEADのようなモダンな暗号技術を正しく使うことで、「攻撃の難易度」を極限まで引き上げることはできます。
「自分だけは大丈夫」と思わず、まずはこの AES-GCM のような、改ざんを許さない仕組みを自社のシステムに取り入れるところから始めてみてください。
一歩ずつ、確実に。あなたの書くコードが、誰かの大切な情報を守る防波堤になることを願っています!
コメント