【ITニュース解説】Encryption Isn't Enough — You Also Need to Know If Someone Tampered With Your Data
2026年09月22日に「Dev.to」が公開したITニュース「Encryption Isn't Enough — You Also Need to Know If Someone Tampered With Your Data」について初心者にもわかりやすく解説しています。
ITニュース概要
データ暗号化は内容を読まれないようにするが、改ざん防止は別だ。情報を秘匿する「機密性」と、改ざんされていないことを保証する「完全性」は異なるセキュリティ要件だ。AES-GCMなど「認証付き暗号化」は両方を実現し、改ざんを検知すると復号を拒否しエラーを出す。安全なシステムにはこの暗号化方式が不可欠だ。
ITニュース解説
多くの人が暗号化について考えるとき、データを「秘密にする」という側面を最初に思い浮かべるだろう。つまり、許可されていない人がデータの内容を読み取れないようにする、ということだ。これは「機密性」と呼ばれ、暗号化の非常に重要な役割の一つであることは間違いない。しかし、ニュース記事が指摘するように、これは暗号化の役割の半分に過ぎない。もう半分は、データが「誰も変更していないこと」を保証すること、つまり「完全性」を確保することなのだ。この完全性が欠けていると、たとえデータが暗号化されていても、システムは深刻な脆弱性を抱えることになる。
暗号化されたデータ、いわゆる「暗号文」がインターネット上を流れるとき、悪意のある第三者がそれを傍受することが考えられる。もし暗号化が機密性しか提供しない場合、この攻撃者は、データの復号に必要な「鍵」を知らなくても、暗号文の一部を巧妙に変更する(ビットを反転させるなど)ことが可能になる。攻撃者は内容を読み取れないため、どのような変更になるかは正確にはわからないかもしれない。しかし、特定の暗号化方式(CBCモードなど)の場合、攻撃者は平文の構造をある程度推測し、意図的に破損させたり、あるいはシステムが「正しいデータ」として受け入れてしまうような、構造的に有効に見えるが実際には異なるデータに改ざんしたりすることができてしまうのだ。システムは改ざんされた暗号文を何の疑いもなく復号し、その結果、不正なデータや意味不明なデータが処理されてしまう。これは非常に危険な状況である。
ここで、「機密性」と「完全性」という二つの保証が全く異なるものであることを理解する必要がある。機密性は「誰かがこれを読むことができるか?」という問いに答えるものだが、完全性は「誰かが私が気づかずにこれを変更できるか?」という問いに答えるものである。現代のセキュアなシステムでは、この両方が不可欠だ。
そこで登場するのが、AES-GCM(Galois/Counter Mode)のような「認証付き暗号化」と呼ばれる技術である。ニュース記事で紹介されているcryptography.hazmat.primitives.ciphers.aead.AESGCMもその一つだ。GCMはAEAD(Authenticated Encryption with Associated Data)というカテゴリに属しており、これはデータの「暗号化」と「認証」を同時に、一回の処理で行うことを意味する。
具体的にAES-GCMが何をするのかを見てみよう。データを暗号化するとき、AES-GCMは単にデータを秘密にするだけでなく、その暗号文が「改ざんされていないこと」を証明するための特別な情報、つまり「認証タグ」も生成する。この認証タグは、暗号文の一部として含まれる。データを復号する際には、まずこの認証タグがチェックされる。もし暗号文が元の状態から少しでも変更されていた場合、再計算された認証タグは元の認証タグと一致しない。
この認証タグのチェックは非常に重要だ。AES-GCMを使ってデータを復号する際、もし暗号文のわずかでもビットが変更されていたら、AESGCM.decrypt()は単に破損したデータを返すのではなく、例外(エラー)を発生させてデータの復号を拒否する。これがAES-GCMが提供する真のセキュリティ特性である。「失敗は明確かつ即座に発生する」のであって、システムが沈黙して不正なデータを受け入れることはない。これにより、AES-GCMを利用するシステムは、暗号化されたままの正確な平文を受け取るか、あるいは何も受け取らないかのどちらかになる。改ざんされたデータをこっそり受け入れるという「第三の選択肢」は存在しないのだ。
これは、旧来のAES-CBC(Cipher Block Chaining)のような暗号化モードと大きく異なる点である。AES-CBCは機密性を提供するが、完全性については何も保証しない。そのため、改ざんされた暗号文も「正しい」暗号文として受け入れ、復号処理を実行してしまう。その結果、データは破損したり、場合によっては攻撃者の意図する意味のあるデータに変わってしまったりする可能性がある。AES-CBCで完全性を確保するためには、MAC(Message Authentication Code)などの別の仕組みを組み合わせて使う必要があるが、これを「正しく」実装するのは非常に難しく、少しでも間違えると深刻な脆弱性につながりやすい。
「この情報は秘密だ」と言うのと、「この情報は秘密であり、かつ誰も変更していないことを信頼できる」と言うのは、言葉のわずかな違いに聞こえるかもしれない。しかし実際には、これらはシステムがビットフリッピング攻撃や暗号文操作攻撃に対して脆弱であるか、全く安全であるかという大きな違いを生む。そして、AES-GCMのようなAEAD暗号は、この「完全性チェックを忘れていないか?」という問いを、暗号化そのものに組み込むことで解決してくれる。これにより、開発者は別途完全性チェックのロジックを実装する手間と、その実装ミスによるリスクから解放されるのだ。AES-GCM(やChaCha20-Poly1305のような代替手段)が、新しいシステム設計において標準的な推奨事項となっているのは、まさにこの理由からである。
まとめると、機密性と完全性は異なる、しかし相互に重要な保証である。多くの既存の、あるいは独自に実装された暗号システムは、どちらか一方しか提供していない可能性がある。AES-GCMを従来のAES-CBCよりも優先して選択することは、単なる性能や利便性の問題ではない。それは、実際のシステムで想定以上に頻繁に発生する、特定の既知のセキュリティギャップを意図的に塞ぐための重要なセキュリティ選択なのだ。