OSS開発勉強会

1,578 views

Published on

OSS開発勉強会向けにOpenIDのプロトコルを調べたときの資料

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,578
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

OSS開発勉強会

  1. 1. OpenID における RP/OP 間アソシエーション調査 KaiGai Kohei <kaigai@ak.jp.nec.com>
  2. 2. OpenID プロトコル概要
  3. 3. RP->OP アソシエーション要求 <ul><li>OP Endpoint URL に対して、以下の要求を行う </li></ul><ul><ul><li>OP Endpoint URL は、ユーザからの入力、もしくはディスカバリの実行により取得する事ができる。 </li></ul></ul><ul><li>要求パラメータ(必須) </li></ul><ul><ul><li>openid.ns = &quot;http://specs.openid.net/auth/2.0&quot; </li></ul></ul><ul><ul><li>openid.mode = &quot;associate&quot; </li></ul></ul><ul><ul><li>openid.assoc_type = (&quot;HMAC-SHA1&quot;|&quot;HMAC-SHA256&quot;) </li></ul></ul><ul><ul><li>openid.session_type=(&quot;DH-SHA1&quot;|&quot;DH-SHA256&quot;|&quot;no-encryption&quot;) </li></ul></ul><ul><li>Diffie-Hellman 要求パラメータ </li></ul><ul><ul><li>openid.dh_modules=base64(btwoc( p )) </li></ul></ul><ul><ul><li>openid.dh_gen=base64(btwoc( g )) </li></ul></ul><ul><ul><li>openid.dh_consumer_public=base64(btwoc( g ^ xa mod p )) </li></ul></ul><ul><ul><li> DH 鍵共有方式については、 RFC2631 参照 http://www.ipa.go.jp/security/rfc/RFC2631JA.html </li></ul></ul>公開鍵
  4. 4. Diffie-Hellman 鍵共有法( DH 法) <ul><li>Shared secret (ZZ) の生成 </li></ul><ul><ul><li>ZZ = g ^ (xb * xa) mod p </li></ul></ul><ul><ul><li>ZZ = (yb ^ xa) mod p = (ya ^ xb) mod p ya は、主体 a の公開鍵; ya = g ^ xa mod p yb は、主体 b の公開鍵; yb = g ^ xb mod p xa は、主体 a の私有鍵 xb は、主体 b の私有鍵  p と q は、大きな素数 </li></ul></ul><ul><ul><li>g = h^{(p-1)/q} mod p h は、 h{(p-1)/q} mod p > 1 を満たす、 1 < h < p-1 内の任意の整数。 (g は、位数 q mod p をもつ。すなわち、 g^q mod p = 1 if g != 1) </li></ul></ul><ul><li> ZZ を元に、 MAC 鍵(共有の秘密鍵)を生成する事ができる。 </li></ul>Diffie と Hellman は、「共有された秘密( shared secret )」が盗聴者によって入手できない方法で、 2 者が秘密を共有するための方法を記述している。この秘密は、他の(共通鍵)アルゴリズムのための暗号技術的な鍵とする材料に変換することができる。
  5. 5. HMAC :メッセージ認証のための鍵付ハッシング <ul><li>HMAC の定義 </li></ul><ul><ul><li>データ 'text' に対して HMAC を計算するには、以下のようにする </li></ul></ul><ul><ul><li>H(K XOR opad || H(K XOR ipad, text)) H() は、一方向ハッシュ関数 e.g) md5, sha1, sha256, ... K は、秘密の共有鍵 opad は、バイト値 0x5C を 64 回繰り返した文字列 pad は、バイト値 0x36 を 64 回繰り返した文字列 </li></ul></ul><ul><li>RFC2104 </li></ul><ul><ul><li>http://www.ipa.go.jp/security/rfc/RFC2104JA.html </li></ul></ul>この文書では、暗号ハッシュ関数を使用してメッセージ認証を行なう仕組みである HMAC について記述する。HMAC は、MD5 や SHA-1 などの反復暗号ハッシュ関数を秘密の共有鍵と組み合わせて使用する。HMAC の暗号としての強度は、使用しているハッシュ関数のプロパティに依存する。
  6. 6. OP->RP アソシエーション応答 <ul><li>RP->OP アソシエーション要求に対し、 RP は以下のパラメータを返却する </li></ul><ul><li>共通の応答パラメータ </li></ul><ul><ul><li>ns= http://specs.openid.net/auth/2.0 </li></ul></ul><ul><ul><li>assoc_handle=255 字以下の ASCII 文字列 </li></ul></ul><ul><ul><li>session_type= 要求の openid.session_type の値 </li></ul></ul><ul><ul><li>assoc_type= 要求の openid.accoc_type の値 </li></ul></ul><ul><ul><li>expires_in= このアソシエーションの有効期限(単位: 秒) </li></ul></ul><ul><li>暗号化されない応答パラメータ </li></ul><ul><ul><li>mac_key=base64(MAC 鍵 ; セッションの共有秘密鍵 ) </li></ul></ul><ul><li>Diffie-Hellman 応答パラメータ </li></ul><ul><ul><li>dh_server_public=base64(btwoc(g ^ xb mod p)) </li></ul></ul><ul><ul><li>enc_mac_key=base64(H(btwoc(g ^ (xa * xb) mod p)) XOR MAC 鍵 )  ハッシュ関数 H() は、 &quot;SHA1&quot; か &quot;SHA256&quot; のどちらか </li></ul></ul>共有の秘密 (=ZZ) OPの共有鍵
  7. 7. UA->OP 認証要求 <ul><li>RP はリダイレクト (302) を用いて、 UA⇔OP で認証を行うよう要求する。 </li></ul><ul><li>要求パラメータ </li></ul><ul><ul><li>openid.ns = &quot;http://specs.openid.net/auth/2.0&quot; </li></ul></ul><ul><ul><li>openid.mode = (&quot;checkid_immediate&quot;|&quot;checkid_setup&quot;) </li></ul></ul><ul><ul><li>openid.claimed_id= 主張識別子 </li></ul></ul><ul><ul><li>openid.identity=OP ローカル識別子 </li></ul></ul><ul><ul><li>openid.assoc_handle= アソシエーションハンドル </li></ul></ul><ul><ul><li>openid.return_to= 認証後に戻るべき URL </li></ul></ul><ul><ul><li>openid.realm= 認証を求める URL </li></ul></ul>
  8. 8. UA⇔OP 間認証プロセス <ul><li>具体的な認証の方法については、 OpenID では未定義 </li></ul>
  9. 9. OP->RP 肯定アサーション <ul><li>OP は UA との認証の結果を、リダイレクトを用いて RP に伝達する </li></ul><ul><li>肯定アサーションは以下のパラメータを含む </li></ul><ul><ul><li>openid.ns = &quot;http://specs.openid.net/auth/2.0&quot; </li></ul></ul><ul><ul><li>openid.mode=&quot;id_res&quot; </li></ul></ul><ul><ul><li>openid.op_endpoint=OP Endpoint URL </li></ul></ul><ul><ul><li>openid.claimed_id= 主張識別子 </li></ul></ul><ul><ul><li>openid.identity=OP ローカル識別子 </li></ul></ul><ul><ul><li>openid.return_to= 要求された戻り先 URL </li></ul></ul><ul><ul><li>openid.response_nonce= 認証応答に固有の 255 字以下の ASCII 文字列 </li></ul></ul><ul><ul><li>openid.accoc_handle= アソシエーションハンドル </li></ul></ul><ul><ul><li>openid.signed= 署名済みフィールドのリスト </li></ul></ul><ul><ul><li>openid.sig=base64(HMAC 署名 ) </li></ul></ul><ul><li>否定アサーションはエラー情報を含む(省略) </li></ul>
  10. 10. RP: アサーションの検証 <ul><li>RP が肯定アサーションを受け入れる際には、 以下の値を検証しなければならない </li></ul><ul><ul><li>openid.return_to&quot; が現在の要求の URL と一致する </li></ul></ul><ul><ul><li>ディスカバリによって得られた情報がアサーションの情報と一致する </li></ul></ul><ul><ul><li>&quot;openid.response_nonce&quot; について、当該 OP から、これまでに同じ値の アサーションを受け入れたことがない </li></ul></ul><ul><ul><ul><li> リプレイ攻撃を防ぐため </li></ul></ul></ul><ul><ul><li>アサーションの署名が有効で、必要な全てのフィールドに署名がされている </li></ul></ul><ul><ul><ul><li>少なくとも、 &quot;op_endpoint&quot; 、 &quot;return_to&quot; 、 &quot;response_nonce&quot; 、 &quot;assoc_handle&quot; を 含み、存在する場合は &quot;claimed_id&quot; と &quot;identity&quot; を含むこと </li></ul></ul></ul><ul><li>署名の検証について </li></ul><ul><ul><li>assoc_handle に紐付けられた MAC 鍵は、 OP->RP に伝達済みである enc_mac_key=base64(H(btwoc(g ^ (xa * xb) mod p)) XOR MAC 鍵 )  enc_mac_key を ZZ = (yb ^ xa) mod p で XOR すればよい。 </li></ul></ul>dh_server_public
  11. 11. Diffie-Hellman 鍵共有ライブラリ <ul><li>openssl-devel パッケージ </li></ul><ul><ul><li>Diffie-Hellman 鍵共有を行うためのライブラリ関数が準備されているようだ。 (詳細未確認) </li></ul></ul>dh(3) OpenSSL dh(3) NAME dh - Diffie-Hellman key agreement SYNOPSIS #include <openssl/dh.h> #include <openssl/engine.h> DH * DH_new(void); void DH_free(DH *dh); int DH_size(const DH *dh); DH * DH_generate_parameters(int prime_len, int generator, void (*callback)(int, int, void *), void *cb_arg);          :      :
  12. 12. おしまい

×