Livingdeadの日記: WSSEとHTTPダイジェスト認証
HTTPダイジェスト認証で送るもの
A1 = ユーザ名 ":" realm ":" パスワード
A2 = HTTPのメソッド ":" コンテンツのURI
response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )
サーバ側ではMD5(A1)を保存している.nonceはサーバで生成され,リクエストに対して401でレスポンスを返す時にクライアントに通知される.cnonceはクライアント側で生成する.
WSSEで送るもの
PasswordDigest = base64(sha1(Nonce . Created . パスワード)) … (type-A)
PasswordDigest = base64(sha1(base64_decode(Nonce) . Created . パスワード)) … (type-B)
X-WSSE: UsernameToken Username="Melody", PasswordDigest="VfJavTaTy3BhKkeY/WVu9L6cdVA=", Created="2004-01-20T01:09:39Z", Nonce="7c19aeed85b93d35ba42e357f10ca19bf314d622"
NonceとCreatedの組み合わせは有効期限の間サーバ側で保持され,同じNonceとCreatedの組み合わせでの認証を要求されると無条件で認証に失敗する.これによりリプレイを防ぐ.パスワードは生のまま連結してハッシュするのか.ここはダイジェスト認証のA1のようなものを使う方がいいだろうなぁ.
それにしてもなんで似たようなものが再発明されているんだろう.HTTPヘッダに入れて使うだけならHTTPダイジェスト認証のプチ劣化コピーのように思える.と思ったが,そもそもX-WSSEヘッダではなくWS-Securityの枠組みでSOAP文書などにXMLで埋め込んで使うためのもので,再発明というわけではなかったのか.
【関連サイト】
Web Services Security仕様
Web Services Security (WS-Security)
WS-Security 入門
Web Services Security 補遺
いわゆる「WSSE認証」は、リプレイ攻撃すら防げないあまり出来のよくないプロトコルであり、どうせならHTTP Digest認証を使う方がましなのに、なぜこれが使われているのだろうか?
え・・・リプレイ攻撃防げないのか.勉強不足.
この問題に対処するため、WS-Securityを発表した3社は、2002年8月に発表した「Addendum(補遺)」(日本語版)でこの問題への解決策を公開した。補遺には、リプレイ攻撃を防ぐ有名な手法であるノンス(nonce:「その場限りの」「1回だけの」といった意味)とタイムスタンプを使って、ダイジェストに手を加える方法が規定されている。
via: @IT:特集 次世代XML Webサービスを試す Part 2 1.WS-SecurityとWeb Services Development Kit
ううむ,そうだよな・・・何か見落としているんだろうか.見落としてるんだろうな.偉い人はヒントへのポインタだけでも書いておいてもらえるとアンダーアチーバーでも勉強できるのでありがたいのだが.ググレカスに怒られるか.
WSSEとHTTPダイジェスト認証 More ログイン