🙆

HTTPS通信を支える3つの安全対策

に公開

🔒 はじめに

Web通信は、私たちが思っている以上に多くのリスクにさらされています。
もし通信が暗号化されていなければ、第三者に内容を盗み見られたり、途中で書き換えられたり、偽サイトに誘導されたりする危険があります。

こうした脅威を防ぐために登場したのが HTTPS(HTTP Secure)。
この記事では、HTTPSがどのようにして「盗聴」「改ざん」「なりすまし」を防いでいるのかを、できるだけ分かりやすく解説します。

🕵 1. 盗聴を防ぐ ― 通信の暗号化

🔍 問題

HTTP通信は平文(そのままの文字)で送られます。
そのため、ネットワークの途中にいる誰かが通信を覗くと、ユーザー名やパスワードなどの機密情報を簡単に盗めてしまいます。

🔙 昔:RSA方式(公開鍵暗号による鍵共有)

2000年代〜2010年代前半まで、HTTPSの通信ではRSA(公開鍵暗号)が広く使われていました。
この方式では、サーバーの公開鍵と秘密鍵がペアになっています。

🧩 仕組みの流れ

  1. サーバーが「公開鍵+秘密鍵」を生成し、公開鍵を証明書としてクライアントに渡す。
  2. クライアントは「このサーバーの公開鍵で暗号化」した共通鍵を送信。
  3. サーバーが「自分の秘密鍵で復号」して共通鍵を取得。
  4. 以降の通信は、その共通鍵を使って**対称暗号(AESなど)**で暗号化。

⚠️ 問題点(RSAの限界)

• 前方秘匿性がない:
 サーバーの秘密鍵が流出すると、過去の通信をすべて復号できてしまう。
• 負荷が重い:
 RSAは大きな整数の計算(2048bit以上)が必要でCPU負担が高い。

➡ これらの問題を解決するために、現在主流の ECDHE方式 に移行しました。

🔒 現在:ECDHE方式(楕円曲線Diffie-Hellman鍵交換)

🔍 背景

TLS1.2以降、特にTLS1.3では「RSAによる鍵交換」は廃止され、
ECDHE(Ephemeral Elliptic Curve Diffie-Hellman) が標準方式になりました。
これは「公開鍵・秘密鍵を使って直接暗号化」するのではなく、
計算によって同じ共通鍵を導く方式です。

🧮 仕組みの流れ(簡略)

  1. サーバーとクライアントは、それぞれ一時的な秘密値を生成。
     - クライアント:秘密値 a
     - サーバー:秘密値 b
  2. 双方が「公開値」を計算して交換。
     - クライアント:A = aG
     - サーバー:B = bG
  3. 双方が自分の秘密値と相手の公開値から同じ共通鍵を計算。
     - クライアント:K = aB = abG
     - サーバー:K = bA = abG
  4. 第三者はAとBを見てもa,bを知らないため、Kを導けない。

✏️ 2. 改ざんを防ぐ ― データの完全性検証

🔍 問題

通信の途中で悪意ある第三者が、送信データを勝手に書き換えてしまう危険があります。
例えば「振込先口座番号」や「金額」がすり替えられる、といったケースです。

🔑 解決策:HMAC(メッセージ認証コード)

TLSでは、送信データに「ハッシュ値(署名のような指紋)」を付けて送信します。
受信側は同じ方法でハッシュを再計算して、内容が一致するか確認します。
• 一致する → 改ざんされていない
• 一致しない → 改ざん検出 → 通信破棄

💡 ポイント

• HMACやAEAD(AES-GCMなど)で暗号化+改ざん検知を同時に行う。
• 1ビットでも内容が変わると検出されるほど強力。

🎭 3. なりすましを防ぐ ― サーバーの正当性認証

🔍 問題

攻撃者が「本物そっくりの偽サイト(例:paypa1.com)」を作り、ユーザーを騙して個人情報を奪うことがあります。

🔑 解決策:デジタル証明書(SSL証明書)

HTTPSでは、サーバーが認証局(CA)から発行された「証明書」をブラウザに提示します。
この証明書は、CAの電子署名付きで「このサーバーは本物である」と保証するものです。
1. サーバーが証明書を提示
2. ブラウザがその署名をCAの公開鍵で検証
3. 問題なければ「安全なサイト」として通信開始

💡 ポイント

• 証明書の署名にはサーバーの秘密鍵が使われる。
• ブラウザはあらかじめCAの公開鍵を内蔵しており、信頼できる発行元かを自動で確認。

まとめ

HTTPSは「暗号化」「完全性」「認証」の三本柱で通信を守っている。
だからこそ、Webの世界では「HTTPS対応」が当たり前になっているのです。

Discussion