完全前方秘匿性を理解する方法

📅
🕑 1 分で読む

さて、暗号学の世界ではPFSという言葉が時々出てきます。これはPerfect Forward Secrecy(完全前方秘匿性)の略で、単にFSと呼ばれることもあります。簡単に言うと、サーバー上の秘密鍵が盗まれた場合(例えば誰かがサーバーにハッキングした場合)、現在のセッションのデータだけが危険にさらされる可能性があるようにすることです。過去のトラフィックは安全に保たれます。これが重要な考え方です。しかし、正直なところ、その仕組みを理解するには暗号鍵交換の仕組みをある程度理解している必要があります。最初は難しそうに思えても心配しないでください。これは、暗号化されたものを長期的に安全に保つ方法です。

暗号化の基礎

メッセージを安全に保つには、対称暗号化(AESのような高速な暗号化)を使用するのが最善の方法です。問題は、メッセージの暗号化と復号に同じ鍵が使用されるため、その鍵を安全でないネットワーク上で送信すると、傍受されるリスクがあるということです。そのため、一般的なアプローチは、まず非対称暗号化(公開鍵/秘密鍵)を使用して安全なチャネルを確立することです。

注:理論上は、オフラインデバイス経由で鍵を交換するといった帯域外方式を試すことも可能ですが、これは少々面倒で、最近ではほとんど実用的ではありません。通常はDiffie-Hellman方式で行われます。

Diffie-Hellman(DH)は、一種の複雑なハンドシェイクです。例えばアリスという人が自分の公開鍵をボブに送り、ボブはそれを自分の秘密鍵と混ぜて共有秘密鍵を生成します。ボブは自分の公開鍵を返し、アリスも自分の秘密鍵を使って同じことを行います。この仕組みのおかげで、両者は最終的に同じ秘密鍵を共有しますが、実際には秘密鍵を送信しません。この秘密鍵は、超高速な対称アルゴリズムを用いて実際のメッセージを暗号化するために使用されます。

注:問題は?Diffie-Hellmanは、デフォルトでは相手が正当かどうかを確認しません。つまり、誰でも偽の鍵を使って中間に割り込むことができるのです。そのため、本人確認を行う手段が必要となり、そこでPKIと証明書が役立ちます。もちろん、インターネット上のセキュリティは暗号化だけでなく、信頼も重要です。

標準Diffie-Hellmanの問題点

ここからが少しややこしくなります。ウェブサイトは信頼できる証明機関(CA)が発行した証明書を使用しており、その中には公開鍵が含まれています。これらの証明書は、サーバーの秘密鍵が侵害されるまでは問題なく機能します。例えば、ハッカーがサーバーに侵入して秘密鍵を盗み出すとします。秘密鍵を入手すれば、攻撃者はその鍵で暗号化されたトラフィックを解読でき、場合によっては何年も前のトラフィックまで解読できてしまいます。現代の暗号化技術では鍵の推測はほぼ不可能なので、これは一種の悪夢です。つまり、誰かが秘密鍵を入手すれば、何の罪もありません。

正直に言うと、もし攻撃者(国家や、狡猾なISP、VPNプロバイダーなど)が膨大な量の暗号化トラフィックを保有していたとしたら、鍵を入手すれば後でそれを解読できる可能性があります。つまり、秘密鍵が漏洩すれば、暗号化されたゴシップ情報や銀行情報など、あらゆる情報が危険にさらされるということです。

恐ろしいのは、鍵を持っているだけでは過去の会話を解読できないということです。ただし、通信中のすべてのトラフィックを記録しておかない限りは。しかし、もし誰かがそれを成功させ、秘密鍵も持っていれば、後で解読が計算的に可能になった時に、そのすべてのデータを解読できるのです。

完全な前方秘匿性

ここでPFSが登場します。そのアイデアとは? セッションごとに同じ鍵を使い回さないことです。その代わりに、クライアントが接続するたびに、サーバーは新しい一時的な(一時的な)鍵ペアを生成します。この一時的な鍵はそのセッションでのみ使用され、セッション終了後はすぐに破棄されます。そのため、たとえ誰かがサーバーをハッキングして秘密鍵を入手したとしても、各セッションは固有の鍵で保護されているため、過去の会話を解読することはできません。

一時鍵を使ったDiffie-Hellman暗号は、ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)と呼ばれます。長い名前ですが、基本的には同じ考え方です。つまり、毎回新しい鍵を生成し、そのセッションの間だけ保持し、その後消去するのです。

実際のところ、サーバーの秘密鍵が事後的に侵害された場合、攻撃者はその鍵で保護されたセッションのトラフィックしか復号できず、履歴全体を復号することはできません。特に、誰かが後で復号しようとトラフィックをキャプチャしていた場合、セキュリティが大幅に向上します。

ちょっと奇妙ですが、システム全体の耐性、特に長期的なスヌーピングに対する耐性が向上します。セッションごとに新しいシークレットが使用されるため、まるでドアに恒久的な鍵をかけていないかのようです。

まとめ

要するに、PFSとは、たとえ秘密鍵が将来的に侵害されたとしても、古い暗号化されたデータを安全に保つためのものです。完璧な方法ではありませんが、攻撃者が後からアクセスできたとしても、何年も保存されたトラフィックを解読するのを防ぐ最良の方法の一つです。基本的に、これは暗号化された会話を遡及的に解読することを困難にする、優れたセキュリティ習慣です。セキュリティにおいては、過去を遡ろうとする者にとって、より困難にすることが時に重要になるからです。

まとめ

  • Perfect Forward Secrecy では、接続ごとに一意のセッション キーが生成されます。
  • セッション終了後にサーバーに一時キーを強制的に破棄させ、長期的なリスクを軽減します。
  • これにより、攻撃者が後で秘密鍵を入手した場合でも、過去の通信を解読できなくなります。
  • 通常、HTTPS の ECDHE などのプロトコルを通じて実装されます。

まとめ

これで主要なアイデアが明確になれば幸いです。少し技術的な話になりますが、PFSの背後にある理由を理解すれば、ウェブサイトやアプリがなぜPFSを実装しようと躍起になっているのかが理解しやすくなります。複数の環境でうまく動作した例ですが、暗号技術の闇に光が差し込むことを願っています。