web-dev-qa-db-ja.com

OAuth Nonceが1回しか使用できない場合、タイムスタンプの意味は何ですか?

最初にOAuthのタイムスタンプの実装を誤って解釈したため、現在の時刻から30秒以内にないタイムスタンプは拒否されることになると考えられましたが、これはいくつかの理由で間違っていましたタイムゾーンに関係なく、各システムクロックが分と秒まで十分に同期していることを保証できなかったという事実を含め、さらに明確にするためにもう一度読みました。

「サービスプロバイダーによって特に指定されていない限り、タイムスタンプは1970年1月1日00:00:00 GMTからの秒数で表されます。タイムスタンプ値は正の整数でなければならず以前のリクエストで使用されたタイムスタンプ以上である。 "

ソース: http://oauth.net/core/1.0/#nonce

タイムスタンプが同じソースからの以前のリクエストに関連してのみ比較され、サーバーのシステムクロックとは比較されないことを意味します。

次に、ここでより詳細な説明を読みます: http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/

TL; DR?-以下の太字部分にスキップ)

OAuthはナンスとタイムスタンプを使用します。ノンスという用語は「一度使用された数」を意味し、一意で通常はランダムな文字列です。署名された各要求を識別します。各要求に一意の識別子を持たせることで、サービスプロバイダーは、要求が複数回使用されるのを防ぐことができます。これは、コンシューマーが送信された各要求に対して一意の文字列を生成することを意味しますサービスプロバイダーに通知し、サービスプロバイダーは、使用されるすべてのナンスを追跡して、それらが再度使用されるのを防ぎます。ナンス値は署名に含まれているため、共有秘密を知らない攻撃者。

ナンスを使用すると、受信したすべてのナンス値の永続的なストレージを要求するため、サービスプロバイダーにとって非常にコストがかかる可能性があります。実装を簡単にするために、OAuthは各リクエストにタイムスタンプ値を追加します。これにより、サービスプロバイダーはナンス値を限られた時間だけ保持できます。リクエストが来たとき保持されている期間よりも古いタイムスタンプを使用して、サービスプロバイダーがその期間からナンスを持たなくなったため、タイムスタンプは拒否されます。リクエストが許可された後に送信されたと想定しても安全です。時間制限はリプレイ攻撃です。OAuthはタイムスタンプを実装するための一般的なメカニズムを提供しますが、実際の実装は各サービスプロバイダーに任せます(多くの場合、仕様で再検討する必要があると思われる領域です)。見方をすれば、実際のノンスはタイムスタンプ値とノンス文字列の組み合わせであり、それらを組み合わせることによってのみ、攻撃者が二度と使用できない永続的な一意の値を提供します。

私が混乱する理由は、Nonceが1度しか使用されない場合、サービスプロバイダーがタイムスタンプに基づいて拒否するのはなぜですか? 「サービスプロバイダーはその期間からナンスをもう持たない」と私は混乱し、最後に使用されたときから30秒以内であればナンスを再利用できるかのように聞こえます。

だから誰も私のためにこれを片付けることができますか? nonceが1回限りの使用であり、タイムスタンプを自分のシステムクロックと比較していない場合、タイムスタンプのポイントは何ですか(明らかに信頼できないため)。タイムスタンプは相互に相対的であるだけであることが理にかなっていますが、ユニークなナンス要件があるため、それは無関係に思われます。

37
MetaGuru

タイムスタンプは、サーバーがナンスのストレージを最適化できるようにするために使用されます。基本的に、読み取りノンスはタイムスタンプとランダムな文字列の組み合わせであると見なします。しかし、別個のタイムスタンプコンポーネントを使用することで、サーバーは短いウィンドウ(たとえば15分)を使用して時間ベースの制限を実装し、必要なストレージの量を制限できます。タイムスタンプがないと、サーバーはすべてのnonceをこれまでに使用し続けるために無限のストレージを必要とします。

あなたの時計とクライアントの時計との間に最大15分の時間差を許可し、データベーステーブルのnonce値を追跡しているとしましょう。テーブルの一意のキーは、「クライアント識別子」、「アクセストークン」、「ノンス」、および「タイムスタンプ」の組み合わせになります。新しいリクエストが届いたら、タイムスタンプが時計から15分以内であることを確認し、テーブルでその組み合わせを検索します。見つかった場合は呼び出しを拒否し、そうでない場合はそれをテーブルに追加して、要求されたリソースを返します。テーブルに新しいナンスを追加するたびに、その「クライアント識別子」と「アクセストークン」の組み合わせのレコードを削除し、タイムスタンプが15分より古いものを削除します。

35
Eran Hammer

OK、十分に熟考した後、私はこれを解読したと思います。

彼らは私が常に行われた最後の成功したリクエストのタイムスタンプを知っているようにしたいので、タイムスタンプがそれより前に来る場合は無視されます。

また、ナンスは一意である必要がありますが、特定の日付範囲までしか保存しないので、タイムスタンプが何時間も経過している場合、ナンスは削除され、再度使用できますが、最後に使用されたタイムスタンプがまた、Nonceが一意であると見なされていても、古い要求を再利用できません。その要求のタイムスタンプが古いためです。

ただし、これは署名のためにのみ機能します。リクエストのタイムスタンプまたはノンスを変更した場合、署名はリクエストと一致しなくなり、拒否されます(タイムスタンプとノンスはどちらも署名作成の一部であり、署名キーがないため)。

ふew!

6
MetaGuru

OAuthがタイムスタンプのみを使用した場合、攻撃者が次のタイムスタンプを推測し、独自のリクエストをプロセスに挿入することは比較的簡単です。 「前のタイムスタンプ+ 1」。

暗号化された安全な方法で(できれば)生成されたナンスを使用することで、攻撃者はTS + 1を単に注入することはできません。

キーカードとピンコードの両方が必要な安全なドアロックと考えてください。キーカードを盗むことはできますが、ピンがわからないため、ドアを通り抜けることはできません。

0
Marc B