暗号化と復号
インターネットのように誰でもアクセスできる公開ネットワークで安全に通信するには、データをそのまま送るのではなく暗号化して送信するのが基本です。暗号化とは「人間や機械がすぐに読める形のデータ(平文)」を「第三者が読めない形(暗号文)」に変換すること、復号とはその逆に暗号文を平文に戻すことです。
暗号化や復号は アルゴリズム(仕組み) と 鍵(キー) によって成り立っています。
暗号化方式の2つの種類
暗号化方式には大きく分けて 共通鍵暗号 と 公開鍵暗号 の2つがあります。
共通鍵暗号
暗号化と復号に同じ鍵を使う方式です。暗号化アルゴリズムには RC4、DES、3DES、AES などがあります。現在主流は AES(Advanced Encryption Standard) で、無線LANのWPA2でも採用されています。
この方式は処理が速いという長所がありますが、通信する相手ごとに共通鍵を作成する必要があり、さらにその鍵を安全に相手に渡さなければならないという課題があります。もし鍵が第三者に盗まれた場合、暗号化したデータは簡単に復号されてしまいます。
公開鍵暗号
暗号化と復号に異なる鍵を使う方式です。暗号化には 公開鍵 を、復号には 秘密鍵 を用います。公開鍵は誰にでも配布して構いませんが、秘密鍵は受信者だけが保持します。
送信者は公開鍵でデータを暗号化し、受信者は秘密鍵で復号します。このため公開鍵を盗んでも、秘密鍵を持っていない第三者は復号できません。アルゴリズムには RSA や ElGamal などがあります。
ただし公開鍵暗号は処理に時間がかかるため、大量のデータをやり取りするのには不向きです。
共通鍵暗号と公開鍵暗号の比較
| 項目 | 共通鍵暗号 | 公開鍵暗号 |
|---|---|---|
| アルゴリズム | RC4、DES、3DES、AES | RSA、ElGamal |
| 使用する鍵 | 共通鍵1つ | 公開鍵と秘密鍵 |
| 鍵の管理 | 相手ごとに作成 | 1組の鍵で対応可能 |
| 鍵の交換 | 秘密にやり取りが必要 | 公開鍵は自由に配布可 |
| 処理速度 | 速い | 遅い |
ハイブリッド方式
それぞれの短所を補うために実用されているのが ハイブリッド方式 です。仕組みは次のようになります。
- 公開鍵暗号を使って「共通鍵」を安全に受信者へ渡す
- 実際のデータ通信は処理が速い「共通鍵暗号」で行う
こうすることで、鍵を安全に交換でき、かつ高速に通信を暗号化できます。
代表的な例が SSL/TLS通信 です。WebサイトのHTTPSでは、このハイブリッド方式に デジタル署名 や デジタル証明書 を組み合わせることで、安全なやり取りが実現されています。
デジタル署名とは
デジタル署名は、送られてきたデータが「本当に正しい送信者から送られたものか」「途中で改ざんされていないか」を確認するための技術です。例えば、Aさんから届いたメールが実際には誰かが偽装したものかもしれないし、途中でデータが書き換えられているかもしれません。デジタル署名を使えば、送信者の本人性とデータの完全性を保証できます。
この技術は 公開鍵暗号方式 を応用しており、送信者が持つ秘密鍵と、受信者に公開されている公開鍵を利用します。また、データの改ざん検知には ハッシュ関数 が使われます。代表的な方式として RSA署名 や DSA署名 があります。
デジタル署名の仕組み
デジタル署名がどのように機能するか、流れを整理します。
- 送信者は公開鍵と秘密鍵を生成する(署名用の鍵ペアを作成)。
- 送信者は公開鍵を受信者に渡す。
- 受信者は送信者の公開鍵を保持する。
- 送信者は受信者に送るデータを準備する。
- そのデータをハッシュ関数にかけ、ハッシュ値を算出する。
- 算出したハッシュ値を秘密鍵で暗号化する(これが署名部分)。
- 送信者は「データ本体」と「署名(暗号化したハッシュ値)」を受信者に送信する。
- 受信者は署名部分を送信者の公開鍵で復号し、送信者が算出したハッシュ値を取り出す。
- 受信者は受け取ったデータから自分でも同じハッシュ関数でハッシュ値を計算する。
- 復号したハッシュ値と計算したハッシュ値を比較し、一致すれば「正しい送信者から届き、改ざんもない」と判断できる。
デジタル署名の重要性
- データ改ざん検知:受信側でハッシュ値を比較することで改ざんを即座に発見できる。
- 送信者の証明:秘密鍵で署名できるのは送信者本人だけなので、なりすましを防げる。
- 信頼の担保:データと署名の両方を使うため、第三者が途中でデータと署名を一緒に書き換えても検知可能。
デジタル証明書とは
デジタル署名を利用すればデータの改ざんを検知できますが、そもそも「その署名を検証する公開鍵が本当に正しいのか」という課題が残ります。もし攻撃者が偽物の公開鍵を配布していた場合、受信者は気づかずに騙されてしまいます。この「公開鍵の正当性」を保証するために使われるのが デジタル証明書 です。
デジタル証明書をデータと一緒に送れば、改ざん検知だけでなく「公開鍵が確かに正しい持ち主のもの」であることを確認でき、さらに発行元である 認証局(CA: Certificate Authority) を通して「誰がその公開鍵の所有者か」も証明できます。証明書の形式は ITU-T X.509 によって標準化されています。
例えるなら、デジタル署名は「直筆のサイン」、デジタル証明書は「印鑑証明書」に相当します。サインだけでは偽造の可能性がありますが、印鑑証明があれば「これは正規の印鑑である」と証明できるのと同じ仕組みです。
デジタル証明書の内容
X.509証明書には次のような情報が含まれます。
- バージョン情報
- シリアル番号
- 使用する署名アルゴリズム
- 発行者(認証局)の識別名
- 有効期限
- 公開鍵と所有者の識別情報
実際にはブラウザやメールソフトから証明書を確認でき、そこに「発行者」「有効期限」「公開鍵情報」などが表示されます。
認証局(CA)とは
デジタル証明書を発行する機関を認証局と呼びます。有名な例は「ベリサイン」などの商用CAです。商用CAが発行する証明書はすでに主要ブラウザに登録されているため、利用者は警告なく信頼できます。
一方、組織が自分で立てたローカルCAから発行された証明書は、ブラウザに登録されていないためアクセス時に警告が出ます。
認証局には階層があります。
- ルート認証局:最上位に位置し、他のCAの承認を受けずに正当性を証明できる
- 中間認証局:上位の認証局から証明書を発行してもらい正当性を担保する
ルート認証局は厳しい監査を受け、社会的信頼を持つことで正当性を保証しています。
デジタル証明書を使った仕組み
デジタル証明書を用いた署名・検証の流れを整理します。
- Webサーバが公開鍵と秘密鍵を生成する。
- 公開鍵と所有者情報を認証局に送信し、証明書発行を依頼する。
- 認証局は受け取った情報をまとめ、ハッシュ値を算出して秘密鍵で署名し、証明書を発行する。証明書はリポジトリ(公開サーバ)に登録され、失効リスト(CRL)も管理される。
- クライアントがWebサーバに接続を要求する。
- Webサーバはクライアントに証明書を提示する。
- クライアントは受け取った証明書を検証する。認証局の公開鍵で署名部分を復号し、ハッシュが一致すれば公開鍵が正当であると確認できる。
もし証明書が信頼できないCAから発行されたものなら、ブラウザは「警告」を表示します。
PKI(公開鍵基盤)
公開鍵暗号を使ったこうした仕組み全体を PKI(Public Key Infrastructure)=公開鍵基盤 と呼びます。PKIには次の要素が含まれます。
- 公開鍵暗号(RSAなど)
- デジタル署名・証明書
- 認証局(CA)
- SSL/TLSを使ったWebサーバとクライアント
- 暗号化メール(S/MIME)
RADIUSとは
RADIUS(Remote Authentication Dial-In User Service)は、ネットワーク上でユーザ認証を行うためのプロトコルです。もともとはダイヤルアップ接続で利用されていましたが、現在では無線LANや有線LANでのユーザ認証でも広く使われています。認証だけでなく接続時間やデータ利用量を管理できるため、ISPでは課金管理にも利用されてきました。
RADIUSによる認証システムは3つの要素で構成されます。
RADIUSサーバはユーザ情報を保持し認証を実行します。
RADIUSクライアントはNAS(Network Access Server)とも呼ばれ、ユーザからの認証要求をサーバに転送します。
ユーザはネットワークに接続しようとする端末です。ユーザが入力したユーザ名とパスワードは、クライアントからサーバにAccess-Requestメッセージとして送られます。サーバが正規のユーザと判断すればAccess-Acceptを返し、不正であればAccess-Rejectを返します。
不正なRADIUS通信を防ぐ仕組み
RADIUSでは不正なクライアントやサーバからの要求を防ぐために共有鍵(Shared Secret)を事前に設定して利用します。また、通信相手のIPアドレスを指定することで、なりすましによる不正な接続要求を排除できます。
RADIUSパケット
RADIUSプロトコルはUDPを利用します。認証(Authentication)にはポート番号1812、課金(Accounting)にはポート番号1813を使用します。パケットには種別コード、識別子、長さ、認証符号、属性値ペア(AVペア)の情報が含まれます。
種別コードの例
| コード | 内容 |
|---|---|
| 1 | Access-Request(認証要求) |
| 2 | Access-Accept(認証成功) |
| 3 | Access-Reject(認証失敗) |
| 4 | Accounting-Request(課金要求) |
| 5 | Accounting-Response(課金応答) |
属性値ペアの例
RADIUSでは「属性と値」の組み合わせで情報をやり取りします。代表的なものは次の通りです。
- User-Name:認証対象のユーザ名
- User-Password:ユーザパスワード
- CHAP-Password:CHAP認証に用いる応答値
- NAS-IP-Address:認証要求を出すNASのIPアドレス
- NAS-Port:NASの物理ポート番号
- Service-Type:ログインやフレーム接続などサービス種別
- Framed-Protocol:PPPやSLIPなどのプロトコル
- Framed-IP-Address:ユーザに割り当てるIPアドレス