はてなはパスワードを生データで管理してる?
WSSE認証は「安全」かつ「手軽に導入できる」認証として、当初Atom APIで採用されていました。Perl CGIしか動かせないようなホスティングサービスでも使えることが大切で、HTTPSが必須とかでは目的に合わないと考えられていたようです。
以下の記事では、冒頭で4つの選択肢が検討されています。
- HTTP Basic認証を使う。Basic認証は、簡単に元のパスワードにデコードできてしまう。平文を直接送るのと変わらないので却下。
- パスワードをMD5ハッシュしてハッシュだけを送信。盗聴者が平文のパスワードを入手することは不可能。しかし、リプレイ攻撃に耐えられない。Bobのハッシュが通信中に盗まれるとBobに成りすますことができてしまう。
- SSLでHTTP Basic認証を使う。これならパスワード盗聴の問題は解決できる。しかし、Bobのブログは、安いホスティングサービスで動いていて、SSLなんか使えない。
- HTTP Digest認証を使う。これもパスワード盗聴の問題を解決でき、リプレイ攻撃の問題も解決できる。しかし、Bobのホスティングサービスは.htaccessを編集する権限を与えていない。ApacheがDigest認証に必要なヘッダーを剥ぎ取ってしまうので、CGIが自前でDigest認証を実装することも出来ない。
まあ2年以上前の記事なので、実情にどのくらい合ってるのかわかりませんが……。ただMTはローエンドの環境で動作することを非常に重視していて、それが成功の一因になっていた印象はあります。
さて、今の話。Atom Publishing Protocolの仕様では、WSSEへの言及は全て取り除かれています。
draft-ietf-atompub-protocol-01 - (...) Elided all mentions of WSSE.
代わりに、
Atom Protocol servers and clients MUST support one of the following authentication mechanisms, and SHOULD support both.
o HTTP Digest Authentication [RFC2617]
o CGI Authentication
Digest認証か、CGI認証のどちらか、あるいは両方をサポートすることになっています。
CGI認証というのは、CGIで実装できる認証という程度の意味でしかないみたいです(13.1)。WSSEはこれに含まれるのでしょう。
HTTP Digest認証の仕組みは(よく知らなかったので調べたら)、
PasswordDigest = MD5( MD5( Password ) + Nonce )
だそうです。(追記) 上のはだいたいのフィーリングです。というか正直に言うと間違いです。すみません……。sheepmanさんのコメントを参照してください。
Nonceはサーバから送られてきたランダムな(あるいは改変されていないことをサーバ側で確認可能な何らかの)文字列。
WSSEと基本は一緒ですが*1、Digest認証の場合、サーバにパスワードを平文で保存する必要がないんですね。MD5(Password)を持っとけばOK。
というわけで、はてなのAtom APIはHTTP Digest認証に移行するのがいいのかもしれません。でも、クライアントのサポート状況との兼ね合いもあって、難しかったりするのかも*2。(追記) id:sshiさんのコメントと、下の続きをご覧下さい。
ちなみに、Bloggerは、去年の早い段階でWSSEを捨てて、HTTPS + Basic認証に移行しています。これはでも今のAtom PPに合わなくなった感じですねー。
- http://code.blogger.com/archives/atom-docs.html#authentication
- http://www.witha.jp/blog/archives/2005/03/blogger_atomapi.html
一応、元記事の言及記事にトラックバクー。