«前の日記(2007-07-22 (日)) 最新 次の日記(2007-07-25 (水))»  

まちゅダイアリー


2007-07-23 (月)

mixilabo のサービスはパスワードを渡さなくても実装できるかも

文句ばかり言うのもあれなので。 昨日の日記で「足跡をつけた人の追跡」以外ではパスワードは要らないはずって書いたけど、「足跡をつけた人の追跡」もパスワードを渡さずに実装できる気がしてきた。 ポイントは以下のとおり。

  • mixi のあしあとAPIを使って足跡を取得する
  • mixilabo には生パスワードではなく、WSSEで規定された wsse:PasswordDigest を渡す
  • wsse:PasswordDigest は JavaScript を使ってクライアントで生成する

wsse:PasswordDigest は以下のようにして生成する(参考リンクの仕様書から引用)。

Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )

生パスワードとの違いは、毎回 nonce と created を違う値にすることで、生成されるダイジェストの値も毎回異なること。 mixi 側が同じ nonce を一度しか受け付けないようになっていれば、ダイジェストの使いまわしはできないはず。 図にするとこんな感じか。

生パスワードの場合
[client] ----- (password) -----> [mixilabo] ----- (password) -----> mixi
あしあとAPIの場合
[client] -- (nonce, digest) ---> [mixilabo] -- (nonce, digest) ---> mixi (同じ nonce は一度しか受け付けない)
  ↑
JavaScript: digest = base64(sha1(nonce + created + password)

利用者はパスワードを入力するけど、パスワード自体は mixilabo には送られない。 ただ困ったことに、本当に生パスワードを送っていないかどうかを利用者が確認するのが難しいんだよね…。

参考リンク

Tags: Security

mixi のあしあとAPIを使って認証APIも実現できるのでは?

mixi のあしあとAPIを第三者経由で安全に使えるのなら、不完全ながら認証APIまで実現できる気がする。

  1. ユーザはサイトAにアクセス
  2. サイトAはログイン画面を表示
  3. ユーザはサイトAにmixiのIDとパスワードを入力し、JavaScriptでwsse:PasswordDigestを生成する
  4. ユーザはwsse:PasswordDigestをサイトAに送信する(パスワードはサイトAに送られない)
  5. サイトAはmixiのあしあとAPIを使ってログインを試みる
  6. ログインに成功したら、ユーザがmixiのユーザであることが認証されることになる

不完全と書いたのは、この仕組みが危うすぎるから。

  • 違うサイトに対してIDとパスワードを入力する習慣が危険(たとえパスワードが送られないとしても)
  • パスワードがサイトAに送られないという保証が無い(サイトAはいくらでも不正ができる)

JavaScript じゃなくて、信頼できる第三者がWebブラウザのWSSEプラグインを提供すればいいのかもしれない。

構造上はサイトAが中間者攻撃をしているのに近い*1のかな。 他に気になるのは、「mixiはユーザの生パスワードを保存していないといけない」ということ。 この問題は、こせきの日記 - はてなはパスワードを生データで管理してる?と同じ。

Tags: Security

*1 ユーザのブラウザ上でJavaScriptまで操作できるのでそれ以上の危険性があるけど