Webサービスのリクエストヘッダーのタイムスタンプの概念を理解しようとしていますが、どういうわけかそれがどのように機能するかを完全に理解することはできません。
誰かがWebサービスの要求と応答でのタイムスタンプのエンドツーエンドの使用について説明していただければ幸いです。
それは本当にリプレイ攻撃を防ぐための絶対確実な方法ですか?
Webサービスのリクエストヘッダーのタイムスタンプの概念を理解しようとしていますが、どういうわけかそれがどのように機能するかを完全に理解することはできません。
誰かがWebサービスの要求と応答でのタイムスタンプのエンドツーエンドの使用について説明していただければ幸いです。
それは本当にリプレイ攻撃を防ぐための絶対確実な方法ですか?
タイムスタンプだけでは十分ではありませんが、通常はハッシュ メカニズムと組み合わせて、値が改ざんされていないことを保証します。
クライアントがパラメーターを生成し、秘密鍵を使用してパラメーターをハッシュするという考え方です。次に、[ハッシュ + 元の値 + 公開鍵] が要求と共に送信されます。サーバーは公開鍵を使用して秘密鍵を検索し、パラメーターが正しいことを確認できます。
タイムスタンプは、特定のリクエストを複数回使用できないようにするために、いくつかのしきい値とともに使用されます。しきい値が小さい場合 (数百ミリ秒)、リプレイ攻撃は事実上不可能です。
タイムスタンプは暗号化されておらず、SOAP ヘッダーにある必要があります。
<wsu:Timestamp wsu:Id="timestamp">
<wsu:Created>2014-07-01T11:30:28.123+05:30</wsu:Created>
<wsu:Expires>2014-07-01T11:35:28.123+05:30</wsu:Expires>
</wsu:Timestamp>
作成された時間の後に有効期限が切れる時間が短い場合、リプレイ アタックを最小限に抑えることができます。実際にはタイムスタンプだけではありません。タイムスタンプのダイジェストを SignedInfo セクションに追加する必要があります。
<ds:Reference URI="#timestamp">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="wsse soap" xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>TGgFBvglhb+jZCvjV0+oVnNaivpVBp5iVbJEqkTfaCU=</ds:DigestValue>
</ds:Reference>
したがって、サーバー側では、これらのダイジェストが一致する必要があります。それだけではありませんが、signedInfo 全体に秘密鍵で署名し、次のように Signature 要素に署名値を追加します。
<ds:SignatureValue>jdO5GIZ9v1VTngFZcMpz5hz62RwToq2W24A9KhJ5JNySZW1AHhd3s+eTduZZPD0Ok6Wtgzu5kquK
IinPdi5IbGjlg6mXGDbVkLd79RBdnbzFxsJFBtRr9r3mQZp9xfU7zSJW3kbizz6Jjk3h+S2nNbUu
f7rFrNN53ciRtj9RlKzQzmW7BDaFuq18DUfcr70muSkmd4DIqxYDGScjEjgIqLE2pYwIdDDRUGPD
MuwuIN3DgB051QwcE75SVrKBKsTHmFADmN3nKzmQ/JUQuLot0vW6WUFRMLVlAcl5C09SGPOcpow2
kjbuWx/bI7Aj4nAaAnmAYsWKIA3xVao+nPBOWmM0Lg7kpC4Dr5DwahmjH0/78aVUU23DEiMc0kR0
YDg5CxD8MUuj24w8tAjuzoHrvcsIYw+vWCTKvucnXwTlZ+K3QFB6gkct2zVOyQeYaPpkAnmPYS3W
DDpNmsx3lDcNr+5QWTsUbSQaFDddjHT/zoOJ8+iZKY/RujOI5vfXVwgN</ds:SignatureValue>
これで、リプレイ攻撃が不可能であることを確認できます。他の誰かが同じ秘密鍵を持つことはできないため、タイムスタンプを変更して有効な署名を保持する方法はありません。