学校では教えてくれないこと

セキュリティってなに?(3)

2010.3

やあ、みんな。ビリーだよ。

今回は、データそのものが偽造や改ざんされてないかを判定する技術について話そう。このことは本人認証にも使えるので、その方法についても説明するよ。

RSA暗号を使った改ざん防止

前回話したとおり、DH法は鍵の受け渡しを安全に行なうという意味では目的を達していたけど、本人認証が抜け落ちていたため、欠点のあるものになってしまっていたよね。実は、RSAの3人は、「公開鍵暗号」というテーマだけに取り組んだのではなくて、同時に「本人認証」というテーマに解を与えたんだ。

RSA暗号の使い方は、鍵Aを公開し、文書を暗号化して送ってもらって、秘密の鍵Bで復号するというパターンだったよね。

これの逆はどうなるか考えてみよう。つまり、鍵Aを公開し、自分のサイン(たとえば「BILLY」)を秘密の鍵Bで暗号化する。この文書をベリーちゃんに送り、ベリーちゃんはこれを公開されている鍵Aで復号化してみるんだ。見事、「BILLY」という字が現れたら、これは確かに鍵Bを持っているビリー以外には作れない電子的な「サイン」ということになるよね。

RSA暗号を使った本人認証

認証のところ~セキュリティってなに?(1)~で説明した電子証明書もこの方法を使っている。認証局がパスポートや免許証に相当するものを発行するんだけど、この文書自体を認証局が秘密鍵で暗号化してしまうんだ。このこと自体が、「認証局がサインをした」ということになるね。

この証明書の具体的な使い方として、ポストに手紙を取りに行くベリーちゃんの例を考えてみよう。

ビリーの手紙を受け取りたいベリーちゃんは、この秘密鍵で暗号化された証明書を持って、ビリー君からの手紙が届いている郵便ポストに行くんだ。

郵便ポストは、
「たしかに自分はベリーちゃん宛ての手紙をもっている。あなたは本当にベリーちゃんですか?」
と聞くわけだけど、ポストが認証局が公開している鍵を使ってベリーちゃんの持っている証明書を復号すると、
「この人はベリーちゃんです」
という文章が現れる。

この暗号化された証明書はだれでも鍵Aで復号化できるんだけど、鍵Aで復号化できる暗号文を作れるのは、秘密鍵Bを持っている認証局だけだよね。これでベリーちゃんの身分が保証されることになって、ポストはベリーちゃんに手紙を渡すことができる。偽造されていない文書を持っている人を本人と認める証明書方式はこうして成り立っているんだ。

メッセージダイジェストを使った改ざん防止

「これは確かに本人が書いた文書です」ということを証明する技術は、公開鍵暗号を使うほかにもう一つあるんだ。メッセージダイジェストと呼ばれる方式で、究極の圧縮と言ってもいいかもしれない。

MD5(エムディーファイブ)とか、SHA-1(エスエッチエーワンまたはシャーワン)という認証アルゴリズムがこれなんだ。聞いたことあるかな?

レポートなどのドキュメントを上司に提出すると、修正して返してくれることがあるよね。どこを直したかがわかるようになっていればいいんだけど、そうじゃない場合、どう直されたか探すのが大変なことがないかな?そんな時ビリーは、2つの文書の行の最初の文字だけを見ていく、ということをよくやるんだ。

もちろん、同じ字数の別の単語に置き換えられているような場合は見逃してしまうので、あとでちゃんとチェックしなくちゃダメだけど、大きく変更されている場合はだいたいこれでわかる。チェックサムやCRCチェックとちょっと似ているかもしれない。

ここでやっていることの精度を高めたのが「メッセージダイジェスト」方式なんだ。その名の通り、メッセージのダイジェスト版をつくる、ということだね。MD5の「MD」は、Message Digestの略なんだよ。下に挙げるのは、このHP「組込みの門」の別コーナーに掲載されている、ワイヤレスセンサーネットワークの説明文だ。

説明文1

この文章がこう書き替わったとする。

説明文2

「最トノ張」という行の最初の部分と、「最クー線」を比べると、文章が変わっていることがすぐわかる。これは簡単な例で、こんなことをしなくても読めば変わっているのはわかるけど、もし通信途中に誰かが変更してしまったとしたらどうだろう。自社製品をこき下ろすレポートに、上司は激怒するに違いない。ビリーのボーナスは減るだろう。

ビリーが上司にレポートを送るときに、「最トノ張」という「メッセージダイジェスト」を付けておけば、上司は、受け取った文章から同じ方法で作成したメッセージダイジェスト(この場合、「最クー線」)を見て、改ざんされていることがわかるよね。ビリーからすれば、「最トノ張になるようなレポートのはずなんですが」というわけだ。

メッセージダイジェストの要件

もちろん実際のMD5やSHA-1はこんなに簡単なものじゃないよ。メッセージダイジェストを作る計算方法を「ハッシュ関数」と言い、ハッシュ関数を使って計算されたメッセージダイジェストを「ハッシュ値」と言うんだけど、メッセージダイジェストは、

  • (1)ハッシュ値が一意に決まること。
  • (2)不可逆的であること。

の2点が必須要件なんだ。

まず(1)については、ひとつの文書に対するハッシュ値が2つあっては意味がないし、全く別の内容の文書から偶然同じハッシュ値が導かれても困ることがありそうだよね。

でも論理的には、下記(3)で話す理由によって、全く違う文章が同じハッシュ値になることがあり得る。この可能性が低いものが良いハッシュアルゴリズム、ということになるんだ。

(2)はどういうことだろう。いままで見てきた暗号アルゴリズムは、暗号化⇔復号化という可逆性をもっていたけれど、ハッシュ関数の場合は不要なんだ。ハッシュ値を見て、絶対に元の文章が推測されてはいけないので、復号できないことにしてしまえばいいよね。

ちなみに、RSA法などの公開鍵暗号方式も、公開鍵しかもっていない人が平文を暗号化した場合、平文をなくすと復号化は不可能、すなわち不可逆的だよね。公開鍵と秘密鍵の両方が揃っていることが、可逆性の条件ということになる。さらに、ハッシュ関数の必要条件としては、

  • (3)極力短いハッシュ値が高速に求められること。

というのがあるんだ。比較が簡単で処理が軽くなるからだね。一般的に、ハッシュ値は、どんなに長い文章でも(短い文章でも)16バイトの固定長とすることになっているんだ。固定長のほうが演算上扱いやすいからだ。ただし、この制限によって、元の文章が長くなればなるほど、全く別の文章でも同じハッシュ値になってしまう可能性がでてくるんだよ。

メッセージダイジェストを使った本人認証

ベリーちゃんが郵便ポストにビリーの手紙を取りに行く場合、さっきは証明書を持って行ったよね。今回は事前共有鍵があるとしてみよう。この場合は、ポストとベリーちゃんの事前共有鍵である暗証番号をその場でポストに伝えればいいよね。番号キーをプッシュするとか。

どんなときにハッシュ関数が必要になるかというと、ポストにそのまま伝えられない場合なんだ。たとえば、たくさんの人が自分の手紙を取りにポストに集まってきているような状況があるとしよう。

ここでポストは中から手紙を順に取り出して、待っている人に渡すんだけど、ポストはその場に集まっている人に大声で聞くんだ。
「ベリーちゃんはどこにいるかな?」
「は~い、私がベリーちゃんで~す」
「暗証番号はいくつですか?」
「はい、0243で~す」
というわけにはいかないね。まわりの人にバレバレだ。

そこで、
「ベリーちゃんはどこにいるかな?」
「は~い、私がベリーちゃんで~す」
「じゃあ、これからいう数字をあなたの暗証番号でハッシュ計算してみてね。0135243!」
「………計算しました。243(実際には16バイト)で~す」
「オッケー。計算結果が一致したから、あなたは確かにベリーちゃんですね」

さっき言ったように、ハッシュ関数は不可逆な一方向関数だから、0135243(ポストが発生させた乱数)と243(ハッシュ値)がみんなに知られても、暗証番号を計算して導くことはできないよね。

では、最後にまとめとして、実際の通信規格のなかでこれらの技術がどう使われているかをみていくことにしよう。

秘密鍵方式と公開鍵方式のトレードオフ

秘密鍵共有方式と公開鍵暗号方式を比べてみると、公開鍵暗号方式は鍵の受け渡しという永遠のテーマを解決するものとして非常に優れているのは説明した通りだ。でも、計算にとても時間がかかり、現在のCPUでは、送りたい文書やデータそのものを暗号化するにはちょっと厳しい。

それで、文書やデータそのものは秘密鍵共有方式で暗号化/復号化して、この共有鍵を渡すのに公開鍵暗号方式を使うという組み合わせ方になるし、インターネット通信で使われるIPsecやSSLはこのようなやり方で通信を行なっているんだ。

IPsecとSSL

IPsecはDH法で鍵交換をし、文書の暗号化はDESや3DES、AESといった共有鍵方式を使うことになっている。厳密に言うと「DH法で鍵交換をする」という部分がIKE(Internet Key Exchange)で、その後の暗号化と暗号化した文書の送受信のやり方を決めているのがIPsecという規格なんだ。

IPsecには、Authentication Header (AH)と呼ばれる認証のためのヘッダもあり、ここではハッシュ関数の技術が使われているよ。

SSLはRSAかDH法で鍵交換をし、文書の暗号化は同じように共有鍵方式だ。

IPSecやSSLは暗号技術そのものではなくて、RSAやDES、MD5といった暗号アルゴリズムの「使い方」を決めているということだね。

どの部分でどういった暗号を使うべきかについては、それぞれ複数の選択肢を用意していることが多い。たとえば認証段階ではSHA-1かMD5を使って、鍵のやり取りはDH、本文はDESか3DESかAESで、といったような具合だ(実際にはもっと複雑だけど)。この場合、通信機器同士では、相手がどの暗号アルゴリズムを持っていて、今回の通信では何を使うかを最初に話し合うための方法も規格で決めているんだよ。

本人認証技術のトレードオフ

本人認証のやり方にも技術によってトレードオフがある。証明書を使った方法は確実だけど、認証局に証明書を発行してもらう手順や、証明書の管理などで運用上の課題は多いんだ。それでまだまだID/パスワード認証が使われるんだけど、平文でパスワードを送るのは危険だから、ハッシュ関数と組み合わせることになる。

PPPの場合

PPP(Point to Point Protocol)は、インターネットにつなぐ時、プロバイダとの最初の通信に使われるプロトコルだ。広い意味でのPPPにはダイヤルアップ接続する際の認証技術が含まれている。

具体的にはPAP(Password Authentication Protocol)とCHAP(Challenge Handshake Authentication Protocol)があるんだけど、PAPは単にパスワード認証のことで、パスワードは平文で送られるので、今ではほとんど使われていない。

一方CHAPとは、「チャレンジ」と呼ばれる乱数文字列をサーバーからクライアントに渡し、クライアントはあらかじめ決めてあるパスワードを使ってこれを演算して、結果をサーバーに返す。サーバーも共有しているパスワードで計算した結果とあっていれば本人認証OKとする。これって、前回のベリーちゃんとポストとの間のやり取りとまったく同じだよね。

無線LANの場合~WEPからWPAへ~

無線LANにおけるセキュリティで当初使われていたWEPという方式は、「Wired Equivalent Privacy」という名の通り、「有線と同等のプライバシー」だったんだ。無線LANは部屋の外でも傍受できるから、「有線と同等」ではダメだよね。怪しいケーブルがつながってたら見てわかるけど、無線はわからない。どのあたりが脆弱だったかというと、

  1. キーを安直に使っていたこと
  2. なりすましが容易だったこと

の2点なんだ。

WEPで共有するキーは、そのまま暗号化に使うキーだった上に、基本的に固定だったので、一度バレると簡単に解読されっぱなしの状況ができてしまう。

この1.キーを安直に使っていたこと、への対策として、相手先機器をMACアドレスで識別するMACフィルタリングや、WEPキーを一定時間で自動的に更新するTKIP (Temporary Key Integrity Protocol)などを実装することで問題を回避しようとしていた。

その中でWPAという現在の規格ができたんだけど、最初はWPAの一部である、WPA-PSK(Pre-Shared Key)という方式がよく使われた。事前共有鍵を使うことはWEPと同じなんだけど、この鍵をそのまま暗号化に使うわけではなく、これを使ったやり取りのなかで改めて暗号化に使う鍵を生成するんだ。TKIPも使うことでどんどん鍵が代わっていくから、傍受できてもなかなか解読が追い付かない。

一方で、IEEE802.1Xという規格がある。これ自体は無線LANに限った話ではなくて、証明書を使った相手先認証の規格なんだ。Xには何かの文字が入るという変数のXではなくて、「はちまるにーてんいちえっくす」という立派な仕様書名だ。

PSKではなくて802.1X認証を用いるのがフル規格のWPAで、WPA=WPAPSK+802.1Xという関係にある。802.1Xを無線LANで採用したことで、2.なりすましが容易だったこと、への対策にしたんだ。

802.1Xは、Radiusサーバーを認証サーバーに使って、主にAPがステーションを認証する時に使われる。この証明書のやり取りのためのプロトコルが、EAP-TLSやEAP-MD5と呼ばれるもので、TLSはSSLとほぼ同じものだし、MD5はメッセージダイジェストの名前だよね。ちなみにEAPは「Extensible Authentication Protocol」だ。

無線LANのステーションは、これらのプロトコルを実装することで証明書のやりとりができるようになり、APは、Authenticator(認証者)としてRadiusサーバーを使ってステーションから提示された証明書の確認をするというのが基本的な使い方だ。

実は無線LANの認証方式は様々なものが入り乱れているし、どこまで強固にするかは状況に応じて違うので、トレードオフをどこでバランスするかのやり方がたくさんある。WEPで十分、という場合もあるかもしれないし、がちがちに証明書で固めた上に、ステーションだけが認証されるのではなくて、ステーションがサーバーを認証しなくてはならない場合もある。認証は本来相互で行なうべきものだから、Radiusサーバーだからといって、簡単に信用するわけにはいかん、というわけだ。まあ、そりゃそうだ。

通信以外での暗号

ここまで長々と「暗号通信」について書いてきたけど、通信に関係ないところで暗号技術を活用することもあるんだ。

電子署名や証明書といったものは、そのものでは通信とは関係なくて、一般的な偽造防止に使えるよね。他に最近とっても注目されているのが、著作権保護としての暗号技術だ。有料放送でのスクランブルとか、地デジのコピー防止(または回数制限)技術とかだよ。むしろこっちの方が身近かもしれないね。

普通は再生機器に鍵がセットされていて、これとコンテンツに仕込まれている鍵との組み合わせでコピーをコントロールする。

DVDのリージョンコードというのを知っているかな?アメリカで発売されたDVDソフトは、アメリカのDVD機器でしか再生できないんだ。映画の公開時期やDVDの発売時期は世界一斉とは限らず、日本で公開されてない映画がアメリカではDVD化されているということもある。映画会社としては、アメリカで発売したDVDが世界に流通しては、公開した映画に観客が動員できないかもしれないので、制限をかけているんだ。

このような著作権保護目的でのコンテンツの暗号化は、いわゆるセキュリティとは異なるけれど、暗号の重要な活躍場所になっているんだ。

最後に

「セキュリティってなに?」シリーズはずいぶん長編になってしまった。それでも説明を簡単にしてしまったところや、飛ばしてしまった説明も・・・。興味があれば、もっともっと勉強してほしい。最後にビリーからのお勧めの本を紹介しよう。 暗号攻防史(文春文庫) ルドルフ・キッペンハーン 暗号解読〈上・下〉 (新潮文庫) サイモン・シン 残念ながら、「暗号攻防史」の方は絶版になっているらしい。読み物としても技術書としても読めて、しかも文庫といういい本なんだけどな。

ページのトップへ