連載
» 2000年10月21日 00時00分 公開

不正アクセスを防止するSSL/TLS(3):SSL/TLS(Part.2) (3/3)

[福永勇二,インタラクティブリサーチ]
前のページへ 1|2|3       

MACの機能とハッシュ関数

 TLSCiphertext構造体で新しく登場するMAC(Message Authentication Code)には、データの改ざん検出、通信相手の認証、この2つの機能が盛り込まれている。本体データにこの情報を付加することにより、通信中の危険性をより多く排除することができ、通信はより一層安全なものとなるのである。

図17 MACを使って通信中の改ざんを検出する仕組み 図17 MACを使って通信中の改ざんを検出する仕組み

 まずMACの使われ方の概念を説明しておこう(図17)。MACはデータ送信時に生成する。その意味としては送信データを要約したような情報と考えればよい。送信者は送信データにMACを付与してデータを送出する。次に、そのデータを受信した者は、まず自分が受信したデータに対して送信者と同じ手順で独自のMACを生成する。その独自のMACと、送信者が付与したMACを比較して、両者が一致すれば通信中の改ざんはなかったと判断できる、という原理である。

 なお、本稿では、MACと似たような言葉として、ハッシュ関数やメッセージダイジェストといった単語を使っており、混乱してしまっているかもしれない。ここでいうMACは一般名称というよりもSSL/TLSで使われる認証・改ざん防止情報の名称にあたる。その生成にはハッシュ関数(またはメッセージダイジェスト関数)が使われており、その関数が生成したものがハッシュ値(またはメッセージダイジェスト値)である。ハッシュ関数やメッセージダイジェストという言葉は、要約機能を持った数学的な関数やその結果を、一般性をもって表現した名称だ。こう説明すれば、少しは混乱も解消するだろうか。

 説明のついでに、ハッシュ関数の性質をもう少し説明しておこう。大まかに言えば、ハッシュ関数とは、入力値の長い情報を圧縮(要約)して短い情報にするための関数だ。だが、直感的に考えても分かるように、長い情報を短くするのだから、必ず結果が重複するケースが現れる。そこでハッシュ関数では、重複は許容するが、重複が発生する入力はなるべく異なるという性質も備えている。つまり、ハッシュ関数とは、入力のわずかな違いで結果が大きく異なるが、まったく相関のない入力に対しては結果が重複するかもしれない関数ということである。

 例えば、「I have a pen」の要約と「I have a pan」の要約が重複してはハッシュ関数の意味がない。しかし、「I have a pen」の要約と「I have a pan」の要約はまったく異なり、XapCiuPwerlkjfの要約が一致するのであれば、両者には相関がないためハッシュ関数としての機能を果たすことができる。

 また、上記の性質に加えて、「出力から入力を逆計算できない」という性質もハッシュ関数には求められる。具体的には、y=f(x)と表現できるハッシュ関数fがあるとき、ハッシュ値yから元情報xが計算不可能でなければならない。また同じハッシュ値yを持つ元情報x'についても計算不可能である必要がある。

 こういった性質が求められるのは、次のような不具合を防ぐためである。まず前者だが、ハッシュ値は入力データの無改ざん性を証明するために使用する。そのハッシュ値から入力データが計算できてしまうと、無改ざん性を証明したいがために、秘匿性を失ってしまうという致命的な矛盾が生じてしまう。これはあってはならない。また後者については、あるハッシュ値yを持つx'が分かってしまうと、データをxからx'への改ざんして、システムを混乱させるような攻撃が可能になってしまう。これも避けなければならない点である。ハッシュ関数は、こういった不具合が発生しない関数を選択する必要がある。

 では、こういった性質を持つ関数にはどんなものがあるのだろうか。例えばSSL/TLSで使用されるハッシュ関数にはMD5やSHA-1がある。MD5がRFC1321で、またSHA-Aは米国NISTのWeb(http://www.itl.nist.gov/fipspubs/fip180-1.htm)で定義されている。

 これらの詳細な分析はここでは行わないが、実際にどのような値が得られるのか実例を表4に示しておく。各例文は下線部のわずか1文字が違っているだけなのにも関わらず、いずれも得られたハッシュ値はまったく異なっていることが図から分かる。ここにハッシュ関数の性質がよく表れている。

入力文字列 MD5(16 バイト) SHA-1(20 バイト)
I have a pen 4a25880d19034b05ea27a3de98109343 5be69e2aae7b0c7552e294ea0ef5e6af39889d83
I have a pan 728832bb972194526a13c329388f392f 2b41abc5bd0010e6ffce26bae97998033277b6ec
I have a pin e2f830b0e1b4b9488b8f853cc53562e4 299181e873b6869a481406248bde39e13f7aeed3
表4 少しずつ異なる文字列にMD5とSHA-1を適用した結果

 なお、この表を作るにあたっては、MD5の計算はFreeBSDのmd5コマンドを使った。SHA-1についてはライブラリがSSLeayのパッケージに含まれているようだが、ここではその抜粋を電総研のWebサイト(http://aist.ring.gr.jp/archives/net/Crypto/libeay/libsha-0.8.2b.tar.gz)から入手し、FreeBSD上でmakeして利用した。

 最後になったが、ハッシュ関数の安全性に関してはさまざまな議論があり、MD5の脆弱性を指摘する研究も発表されている。ただ、アルゴリズムそのもの安全性を脅かす内容ではないようで、現在でもMD5は広く利用されている。本稿ではアルゴリズムの強度評価については言及しないので、必要のある方は別の資料をあたっていただくことにしよう。

上記WebサイトURLを電総研の変更に伴い更新しました(2003/11/19)

 

TLSのMAC生成アルゴリズム

 では、具体的なMAC生成の概念を説明しよう。図18はMAC生成を概要フローとして表したものだ。ここから分かるとおり、MAC生成に使用する情報は図の上下それぞれ2種類に分かれる。それらをHMACと書かれた関数に入力して、その返却値がMACとなるというのが大きな流れである。

図18 TLSにおけるMAC生成の概念。改ざん検出対象のほかに秘密情報も与える 図18 TLSにおけるMAC生成の概念。改ざん検出対象のほかに秘密情報も与える

 MAC生成に使用する情報の1つは、TLSCompressedデータに「シーケンス番号」を加えたものだ(図18中の(2) )。TLSCompressedデータは、送出したいデータそのものであり、このデータのハッシュ値を得ることで、データ本体の改ざんを防止することができる。

 では、シーケンス番号(正確には送信シーケンス番号)は何のために付加されているのだろうか。実はこれは、第三者がデータをまるごと差し替えることを防止するために行われている。それが可能な理由は次のとおりである。

 シーケンス番号(正確には送信シーケンス番号)はRecordレイヤ内部データの1つであって、データの送出ごとにデータ送出バイト数を加える形で更新されてゆく。また、通信相手は、受信したデータについて同様のカウンタ値(正確には受信シーケンス番号)を計算している。これら両カウンタの値は、両者が同じ順序でデータを送受している限り一致する。

 ここで重要になるのが、シーケンス番号がRecordレイヤの内部データであり、送信者と受信者しか知らないという性質だ。これを利用して、送信データでは、シーケンス番号も含んでMACを計算しておく。本来の送信者と受信者の間では、シーケンス番号は一致しているので、受信者はMACを再計算する際に自分のシーケンス番号を含めて計算し、その一致を確認することができる。

 一方、第三者が通信途中でデータをまるごと差し替えようと企んだ場合、MACを計算する上で必要なシーケンス番号を知ることができない。もし適当なシーケンス番号でMACを生成したとしても、受信者が再計算したMACと一致しないため、差し替えを検出することができる、という巧妙な仕掛けになっている。

 MAC生成に使用するもう1つの重要な情報は、図上側の「MAC書き込みシークレット」だ(図18中の(1) )。詳しくは後ほど説明するが、ひとことで言えば、この値は通信相手との間でネゴシエーションして決定した暗号化パラメータの1つである。この値を知りえるのは、自分自身と通信相手のみであって、いわば秘密の共有情報とでも言えるものだ。

 各データに含めるMACを計算する際に、この値を含めるということの意味は、いま通信している相手が、最初にネゴシエーションをした相手に間違いないことを保証するという点にある。

 もし、データを送ってきた相手がネゴシエーションした相手ではなくなっていた場合、そのマシンはこの値を知りえないので、データに含まれるMAC値と自分が再計算したMAC値は一致しない。そのため、受信したデータは破棄され、身元不明の相手が送ってきたデータは受信せずに済む。これは毎回通信相手を確認していることに等しく、まさに通信相手の認証機能を提供するための仕組みそのものである。

図19 HMAC値を算出する方法。2段階の処理が必要 図19 HMAC値を算出する方法。2段階の処理が必要

 こういった目的を持った2種類の情報は、HMAC(Keyed-Hashing for Message Authentication)と呼ばれる関数に与えられ、その結果として得られた値が最終的なMAC値として利用される。HMACの計算には図19のような2段階の操作が行われ、その中ではハッシュ値の計算にMD5やSHA-1のようなハッシュ関数を使用している。これら併用するハッシュ関数の違いから、HMACをHMAC-MD5やHMAC-SHA-1と呼ぶこともあるので覚えておくとよいだろう。

 HMAC計算のSTEP1では、まず(1)MAC書き込みシークレットの後に0x00を付加して64バイトにしたものと、0x36を64バイト分並べたものの排他的論理和(XOR)を取る。次に、その結果の後に(2)ハッシュ対象ビット列、具体的にはシーケンス番号とTLSCompressed構造体の内容を付加する。そしてそのデータに対してハッシュ関数を適用し、(3)ハッシュ値を得ておく。

 続くSTEP2では、最初に(1)MAC書き込みシークレットに0x00を付加して64バイトにしておき、今度は0x5cを64バイト分並べたものとXORを取る。その結果に(3)のハッシュ値を付加して、再びハッシュ関数を適用する。

 こうして得られた最終的なハッシュ値が、TLSCiphertext構造体に含める(4)MACとして使用される値となるのである。このHMACのアルゴリズム定義やセキュリティ評価は、RFC2104で公表されているので、興味があればのぞいてみるのもいいだろう。

 なお、SSLでのMAC生成に関しては、HMACとよく似ているものの、幾分単純なアルゴリズムでの生成が行われている。ここでは説明を省略するが、その方法は仕様書に記されているので、必要ならご覧いただくといいだろう。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。