ホイールの再発明についての私のコメントは別として。この理論で私が目にする主な問題は、それが完全にリプレイ攻撃を受けやすいということです。
たとえば、ID99とセッションID/ Cookieが「MONKEY-1」のユーザーがいる場合、ユーザーがリクエストを送信する場合は、何らかの方法で「from、99、MONKEY-1」で署名する必要があります。それがそのようなものだったとしましょう:
{ FROM: 99, TO: SERVER, COMMAND: GET-NEW-MAIL, SESSION: MONKEY-1 }
MONKEY-1が秘密なら、それは素晴らしいことです。(どのフォーマットでも、ラインノイズの4KiBバイナリチャンクである可能性があります。)
しかし、今では、そのパケットが通り過ぎるのを見た盗聴者がいます…彼女は今、自分のパケットを送信しています。おそらく彼女は賢く、実際のユーザー99が使用していた送信元IPアドレスを偽装しました。盗聴者があなたの応答を聞くことができなくても、彼女はあなたにパケットを送信できる可能性があります。おそらく、次のようになります。
{ FROM: 99, TO: SERVER, COMMAND: DELETE-ALL-MAIL, SESSION: MONKEY-1 }
この種のことを防ぐ方法はたくさんありますが、効果はさまざまです。接続をSSLでラップすると、これを非常に困難にすることができます(ただし、決して不可能ではありません)。これは、多くのWebサイトが利用しているソリューションです。より良い方法は、ハッシュまたは公開鍵/秘密鍵暗号を使用して、侵入者が秘密データを取得できない方法で署名するために双方向通信を使用することです。たとえば、次のような交換があるとします。
{ FROM: SERVER, TO: ??, COMMAND: PLEASE-LOGIN, NONCE: PIGEON }
{ FROM: BILL, TO: SERVER, COMMAND: LOGIN, AUTH: hash ( hash ( password ) . "PIGEON" ) }
…ここでhash()
、たとえば、SHA-256の合計を表し、. "PIGEON"
連結を指します。
{ FROM: SERVER, TO: BILL, COMMAND: LOGIN-OK, SESSION: hash ( password ) ^ "MONKEY-1" }
…ここで^
、ビット単位の排他的論理和のような操作を指します-または、おそらく。その後、ビルは次のようなリクエストを送信します。
{ FROM: BILL, TO: SERVER, COMMAND: GET-NEW-MAIL, NONCE: "ARMADILLO",
AUTH: hash ( "GET-NEW-MAIL" . #\Newline . "ARMADILLO" . #\Newline . "MONKEY-1" ) }
さて、MONKEY-1が平地を旅したことは一度もありません。また、各リクエストで指定されたAUTHキーは、使用される動詞またはコマンド、およびリクエストごとに異なるナンスに関連付けられており、サーバーはその整合性を簡単に確認できますが、盗聴者は同じメッセージを再度再生したり、変更したりすることはできません。動詞と何か違うことをします。
パスワードの問題を説明するには:
私はデータベーステーブルを持っています、そしてそれは含まれています
User: BILL, Password: hash(DOLPHIN)
有線で、私が受け取る場合
{ FROM: BILL, PASSWORD: hash(DOLPHIN), COMMAND: GET-ALL-MAIL }
…その場合、盗聴者がパスワードがDOLPHINであることを知る可能性は低いですが、気にする必要はありません。
{ FROM: BILL, PASSWORD: hash(DOLPHIN), COMMAND: DELETE-ALL-MAIL }
パスワードの塩漬けについておっしゃっていますが…どうしますか?
User: BILL, PASSWORD: hash( SALT . DOLPHIN )
hash ( SALT . DOLPHIN )
SALTとDOLPHINを別々に保管しない限り、からに移動する簡単な方法はありません
hash (DOLPHIN)
。したがって、ユーザーがあなたに送信hash ( SALT . DOLPHIN )
するか(クライアント側に静的SALTを配置する)、またはプレーンテキストのパスワードを再度保存する必要があります。
回避策は、次のようなことを行うことです。
Database: ( BILL => hash ( SALT . DOLPHIN ) )
Server sends: ( NONCE )
Client sends: ( BILL => hash ( NONCE . hash ( SALT . DOLPHIN ) ) )