日向夏特殊応援部隊

俺様向けメモ

OpenIDのセキュリティモデルについて

はじめに

僕自身がセキュリティに対する暗号化の知識が足りなさ過ぎたので、ここで思い切ってまとめてみようと思います。

  1. HMAC-SHA1
  2. Diffie-Hellman鍵共有

について主に述べます。

現代の暗号化技術について (via: wikipedia)

現代の暗号ってのは概ね2パターンしか無くて、

  1. 共通鍵*1
  2. 公開鍵・秘密鍵

って奴です。

共通鍵ってのは代表的なのはパスワード認証なんかはそうで、データを送信する側(概ねサーバーとか)とデータを受信する側(ユーザー)は共に同じ共通鍵であるパスワードを知ってるってケ−スがそれ。DESとかAESが使われます。

公開鍵・秘密鍵ってのはsshでの公開鍵認証でも使われているように、データの暗号化に公開鍵を使い、データの複合化に秘密鍵を使う。従って特定のデータを複合出来るのは秘密鍵を所持している人のみ可能だって事になります。RSAだとかDSAが使われてます。

HMAC-SHA1

MACってなんだよ(ぇ

そういえば良く聞くけど何者かってのは調べた事が無かったので、調べてみました。
MACとはMessage Authentication Codeの略で、

 メッセージを圧縮したようなもので、ハッシュ関数によって生成され、メッセージに付帯される。受信者は送信者と同じプロセスでこれを生成し、メッセージに付帯させることによって、通信途中の改ざんなどをチェックすることができる。  秘密の共有鍵を持った送信者のMACと受信者が受信したときに生成したMACが一致しない場合は、メッセージ盗聴・改ざんの恐れがある。逆に一致する場合は改ざんの恐れがないとほぼ断定できる仕組みとなっている。

とあるように、共有鍵を持った受信側、送信側双方が、データのやり取りの上で改ざんが行われていない事を保証する為に行うチェックサムみたいなものって事ですね。なるほどー。

HMAC

keyed-Hashing for Message Authentication Codeの略。

HMAC(Keyed-Hashing for Message Authentication code)とは、MAC(Message Authentication Code)の一つで、ハッシュ関数を使って秘密鍵と組み合わせて計算するMACである。

任意のハッシュ関数が適用可能でSHA1とかMD5とか利用出来て、HMAC-SHA1, HMAC-MD5と呼ばれる。
秘密鍵と共に用いられるのがミソですね。

SHA1, MD5

余談だけどMD5は衝突問題がSHA1より深刻*2なので、ハッシュ関数としてどーよって話がある。
SHA1も特定のケースであるみたいだけどMD5よりは攻撃しにくいらしい。

Diffel-Hellman鍵共有

DH鍵交換とかDH鍵共有みたいな言い方をされる事がある。

Diffie-Hellman鍵共有(デフィー・ヘルマンかぎきょうゆう)、あるいはDiffie-Hellman鍵交換(-かぎこうかん)とは、事前の秘密の共有無しに、盗聴の可能性のある通信路を使って、暗号鍵の共有を可能にする暗号プロトコルである。この鍵は、共通鍵暗号方式の鍵として使用可能である。

とても重要なのは、「盗聴の可能性がある通信経路」でも「暗号鍵(共通鍵)の共有が可能」って事ですね。
今回みたいなOpenIDでのConsumer-IdP間の通信において、httpでPOSTしてますけど、本来はSSLとかで、通信経路自体をセキュアにするんだろうけど、
httpで仮に漏れてもOKなんて仕組みがあるのは全然知らなかった。

実際の内容ですけど、

このプロトコルは通信を行いたい2者が、各々公開鍵と秘密鍵を用意し、公開鍵のみを公開する。そして、お互いに秘密の値から作成されるデータを相手に送信し、各自、自分の秘密鍵と受信したデータから共通鍵を作成できる方法である。第三者が送受信されるデータを盗聴しても鍵を生成することができない所に特徴がある。

つまりこういう事。A-B間で通信を行いたいとき

  1. Aは自分の秘密鍵と公開鍵を生成
  2. Bは自分の秘密鍵と公開鍵を生成

そして、お互いの公開鍵を交換し合う。
お互いのデータのやりとりでは、例えばBからAに何かを送信する場合、BはAより受け取ったAの公開鍵を持ってデータの暗号化をし、Aはそのデータを受信して、自分の秘密鍵で複合する。ってやり方が取れる。

それが互いに保証されるので、共通鍵の受け渡しが非常にセキュアに出来ますよって事になる。凄い!

まとめ

と言う訳でConsumer-IdP間では(任意ではあるけど)DH鍵共有によるお互いの信頼性が確立されてて、さらにはHMAC-SHA1によって互いのMAC値の確認を行ってるので、セキュリティ的にかなり堅い状態になってるって言えると思います。

ふぅ、苦手分野だ、こういうの。

*1:昔は秘密鍵と呼ばれてたが、今は公開鍵認証での秘密鍵と区別する為に共通鍵と呼ばれるようになった

*2:数年前のニュースだよなw