0

HMAC を使用して API 呼び出しを認証する場合、ハッシュされるメッセージには、何も追加していないように見える多くのものが含まれていることがよくあります。たとえば、API の署名を生成する手順は次のとおりです。

hmacsha1(HTTP VERB + URI + JSON_REQUEST_CONTENT + DATETIME, "secret")

なぜ次のように行かないのですか:

hmacsha1(JSON_REQUEST_CONTENT, "secret")

これは、JSON_REQUEST_CONTENT が、関連するすべてのリクエスト情報を含む JSON 文字列であると想定しています。

HTTP 動詞と URI (またはコンテンツ固有ではない追加情報) を追加すると、メッセージの長さが長くなるだけのように思えますが、その利点がわかりません。

ありがとう!

4

1 に答える 1

2

HMAC は通常、メッセージの改ざんを防止するために使用されますが、メッセージの再生を防止するためにも使用されます。

HMAC に改ざんを防止するだけのペイロードとシークレットのみが含まれている場合、同じメッセージを再度送信すると有効になります。要求に他の詳細 (特に日時またはナンス) を付けることにより、リプレイと改ざんを防ぐ必要があります。


datetime をハッシュのソルトとして使用するには、通常、メッセージと共に datetime をクリア テキストで送信する必要があります (ただし、ペイロードの外部の要求ヘッダーでメッセージが受信または送信された時刻から大まかに推測できます)。datetime が、サーバーが認識している時刻から離れすぎている場合、メッセージは失敗します (たとえば、1 分以内ではありません)。サーバーがデータに対して同じハッシュを実行し、同じ結果が得られない場合、メッセージも失敗します。

ノンスを使用する最も実用的な方法は、次回リクエストを送信するときに、このナンスを使用するようにサービスに指示することです。ノンスは、リクエストとともにクリア テキストで送信する必要はありません。サーバーがメッセージを正常に処理すると、次回はこのノンスを使用すると、前のナンスは無効になると言われます。

Datetime は、メッセージが特定の時刻に送信されたことを確認することでリプレイを防ぎます。ナンスは、単一の使用パスワードを使用してリプレイを防ぎます。

于 2012-08-23T22:06:28.913 に答える