WSSE認証とパスワードに関する疑問
Atom APIの認証などに利用されるWSSE認証というものがあってちょっと調べています。そこでちょっと疑問点が。
» はてなフォトライフAtomAPIとは – はてなキーワード
にWSSE認証に関する説明があって、これを読むと X-WSSE ヘッダには
- Username: ユーザID
- Nonce: トークン
- Created: Nonceが作成された日時
- PasswordDigest: Nonce, Created, パスワードを文字列連結し、SHA1でハッシュ化し、さらにBase64エンコードした文字列
という情報を入れてあげる必要があるようです。で、疑問に思ったのは PasswordDigest のところ。
PasswordDigest は SHA1で暗号化されていて、SHA1 を解読するアルゴリズムは知らないので PasswordDigest は不可逆なものです。
そのため受け取ったサーバ側では NonceとCreatedとサーバ側で保管されているパスワードを元にして同じ方法で PasswordDigest を生成し、受け取った PasswordDigest と比較する必要があります。
ということはドキュメントに特に指定がない場合、サーバ側ではパスワードを平文もしくは可逆な暗号方式で保管しているということになります。
平文など論外。なのでおそらく可逆な暗号方式で保管していることになりますが、では可逆な暗号方式と不可逆な暗号方式のどちらで保管しておくと安全でしょうか。
もしサーバ側でパスワードを不可逆な暗号化方式で暗号化して保管していてWSSE認証を提供する場合、公開ドキュメントには「PasswordDigest には XXXで暗号化したパスワードを用いてください」と書かなければなりません。
たとえば「2.5.個人認証について|アメばた会議API」にはそのように書かれています。
アメーバIDに対応したパスワードを、MD5によりハッシュ化した値とnonceの値と作成日の文字列を連結しそれらの文字列をSHA1によりハッシュ化した値をBase64エンコードした値になります。
ただ、こうしてしまうと「うちはパスワードをMD5で暗号化してます」と明かしていることになるので、データベースの情報が漏洩した場合にMD5が解読できればたちどころにパスワードが漏れるということになります。暗号化方式を明かすことは好ましくありませんし、そもそもMD5は安全ではありません。これはまずい気がします。
だったら可逆でも暗号化方式が明かされないほうが安全な気がしますが、暗号化については詳しくないのでわかりません。
ただひとつ言えることは、WSSE認証を提供する場合、サーバ側で不可逆な暗号化方式を用いてパスワードを保管しているなら、利用者側に暗号化方式を明かさなければならないリスクがあるということです。なのでこの場合、より安全なSHA512などを用いておくほうがいい気がします。
もしくは、WSSE認証専用のパスワードを用意して、WSSE認証にはそのパスワードを用いるとかしたほうがよさそうです。
最近はログイン認証をOpenIDに任せることも多く、その場合はそもそもパスワードをもらうことがないので、やはりWSSE認証を提供する場合はそれ専用のパスワードなりトークンなりを発行しないと実現できません。
とりあえずMD5で暗号化していることを明かすのは平文でパスワードを保管しているのと同じくらい危険だと思うのですが、、。
コメントを残す