上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
AjaxとPHPを使ったワンタイムパスワード方式のログイン認証

即時認証にはAjaxの類が必要ですが、ワンタイムパスワード(チャレンジ&レスポンス)方式を実装するのにAjaxである必要は必ずしもありません。先ずはチャレンジ&レスポンス方式とは一体何なのかという所から。
CR1.jpg


webアプリの場合はクライアントとは通常、webブラウザの事。便宜上MD5としているけれど別のハッシュ関数、SHA1等でも問題ありません。重要なのは、認証に際して通信路を流れるのは、毎回変化するランダムなCKとそれを元にハッシュしたレスポンスキーだけという事。例えCKとレスポンスキーが盗聴されたとしても、盗聴者は元になった生のパスワードが何であったのかは推測不可能です。(ただし、最近はMD5も色々と焦げ臭くなってきたので絶対不可能とも言えない)

PHP+Javascriptでこれを実現しようとした場合、例えば以下のような流れになります。

CR2.jpg


JavascriptによるMD5の実装は何種類かあるようだけれど、私はこちらのを使わせて頂いています。

高度な JavaScript 技集

社内アプリでこの仕組みを使ってみたのだけれど、作りながら勘違いしてしまった部分があります。

・平文のパスワードは流れないけれど、パスワード以外は平文
はい。当たり前ですね。作りながら何故か勘違いをして「あれ?これSSLとかいらなくね?」なんて考えていました。危険です。私の精神状態が。

・セッションクッキーは平文で流れる
はい。盗聴されます。生のパスワードが盗聴されるよりはマシというレベルかもしれません。逆にSSL等を用いる場合は敢えてチャレンジ&レスポンスで認証する意味は薄くなるような気がするんですがどうなんでしょう。最初のログインと比較的重要なデータ更新の場面で使うといいのかもしれません。

作った当時にどこかで見たのだけれど、yahooのログインはJavascriptが有効だとチャレンジ&レスポンスで処理されるらしい。

2/7追記
今気が付いたけれど、単純にCKとパスワードを連結させてハッシュする方法だと、ブルートフォース(総当り)でパスワードを推測される可能性がある。盗聴によってCKとレスポンスが判明すれば、ブルートフォースに使う辞書にCKを連結させて丸ごとハッシュしたものとレスポンスを比較すればいい。かといってCKとパスワードを複雑に合成してハッシュしても、その合成処理はクライアント(Javascript)側で行われるので、どういう合成過程を行っているかは駄々漏れる。複雑なパスワードを使うという基礎はチャレンジ&レスポンスでも同じという事か。
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2005 The elephant vanishes all rights reserved.
Powered by FC2ブログ.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。