OSS開発勉強会
Upcoming SlideShare
Loading in...5
×
 

OSS開発勉強会

on

  • 1,584 views

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

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

Statistics

Views

Total Views
1,584
Views on SlideShare
1,581
Embed Views
3

Actions

Likes
0
Downloads
2
Comments
0

1 Embed 3

http://technohidelic.posterous.com 3

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    OSS開発勉強会 OSS開発勉強会 Presentation Transcript

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