私は最初、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 要件では無関係に思えます。