41

私は最初、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 は nonce とタイムスタンプを使用します。nonce という用語は「一度だけ使用される番号」を意味し、署名された各リクエストを一意に識別するための一意で通常はランダムな文字列です。リクエストごとに一意の識別子を持つことで、サービス プロバイダはリクエストが複数回使用されるのを防ぐことができます。これは、コンシューマーがサービス プロバイダーに送信される各要求に対して一意の文字列を生成し、サービス プロバイダーが使用されるすべての nonce を追跡して、2 回目の使用を防止することを意味します。nonce 値は署名に含まれているため、攻撃者は共有秘密を知らずに変更することはできません。

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

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

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

4

4 に答える 4

38

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

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

于 2011-07-29T17:42:00.287 に答える
8

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

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

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

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

ふぅ!

于 2011-07-29T13:38:51.377 に答える
0

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

暗号的に安全な方法で生成されたナンスを使用することで (うまくいけば)、攻撃者は自分自身を認証するための適切なノンスを持たないため、単純に TS+1 を注入することはできません。

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

于 2011-07-28T21:13:41.127 に答える
-1

力ずくでノンスをクラックしようとする可能性があると想定するのは合理的です。タイムスタンプは、誰かが成功する可能性を減らします。

于 2017-01-03T20:30:34.950 に答える