Web セキュリティ防御 -- リプレイ攻撃の防止

1. リプレイ攻撃とは?
インターフェイスを開発する際には、通常、インターフェイスのセキュリティを考慮します. たとえば、通常、要求された URL には、検証のためにアルゴリズムで暗号化された署名署名をサーバーに送信する必要があります. 検証に合格した場合,要求が正当であることを証明します。たとえば、次の URL です。

http://wokao66.com/in.json?uid=7&sign=xxxxx

その中で、一般的に使われている署名の暗号化アルゴリズムは MD5 で、MD5 アルゴリズムは不可逆アルゴリズムであり、暗号化後に復号化することはできません。これには通常、通信当事者が秘密鍵 appSecret について合意する必要があります.この秘密鍵は合意済みであり、ネットワーク上で送信することはできません. しかし、この暗号化だけでは十分ではありません. たとえば、私はハッカーであり、現在の成功した実行のリクエスト情報を取得しました. これを request-1 と仮定します. あなたはそれを正常に実行したので、つまりあなたのすべてこのリクエストのパラメータは合法なので、ハッカーとして、リクエスト 1 のリクエスト データを別のリクエスト リクエスト 2 に再パッケージ化し、リクエスト インターフェイスに移動できるかどうか疑問に思います。処理が完了したら、システムは request-2 が正当であると判断し、確実に解放される必要がありますが、ビジネスが成功するかどうかは別の問題です.ビジネスオペレーションを実行すると、大量の request-2、request-3 がサーバーを麻痺させることは避けられません。

まず、通常のリクエスト システムでは検証が必要であり、正当なリクエストがハッカーによって傍受されると、ハッカーは正当なリクエストを繰り返し送信して、システムを欺くという目的を達成します。正当な要求を再利用するこの攻撃は、リプレイと呼ばれます。

2. リプレイ攻撃を防ぐには?
リプレイ攻撃の原理は実にシンプルで、システムが正当なリクエストの一意性をチェックしないことに他なりません。どういう意味ですか?つまり、システムは、最初の法的要求 request-1 を繰り返すことができないことを認識する必要があり、各要求の一意性を保証する必要があります。では、リプレイ攻撃を防ぐにはどうすればよいでしょうか。

インターネット上の解決策を参照すると、おそらく次の2つの方法があります。

1.
タイムスタンプを使用する方法は、まず、HTTP リクエストを送信してからサーバーに到達するまでの時間が 60 秒を超えないと考えています. リクエストを送信するときは、値が 10 であると仮定して、タイムスタンプのタイムスタンプを運ぶ必要があります. . リクエストがサーバーに到着すると、サーバーは現在の時刻を取得し、t2=80、明らかに t2-timestamp>60s であると仮定すると、サーバーはリクエストを違法と見なします。

番号の外では、このタイム スタンプを MD5 暗号化署名で追加する必要があります。そうしないと、ハッカーがタイム スタンプ t2=20 を変更してしまい、無駄な労力になります。

なぜこれが機能するのですか?

まず第一に, 通常, ハッカーがパケットをキャプチャしてリクエストを開始するには 60 秒以上かかります. さらに, ハッカーがタイムスタンプのタイムスタンプを変更することを心配する必要はありません. MD5 は元に戻すことができないため、無効になります. MD5 を偽造したい場合は、両者が合意したキー appSecret を知っている必要があります.

欠点:

ハッカーが 60 秒以内に攻撃を開始した場合、私たちは無力です。
2. タイムスタンプ + 乱数ナンスを使用する
上記のように、タイムスタンプには欠点があります。次に、乱数ナンスを追加します。リクエストが成功するたびに、サーバーは現在成功しているリクエストの乱数ナンスを保存します。 redis と database , リクエストが再びサーバーに入ると, 最初にタイムスタンプが有効かどうかを確認します. 有効な場合は, 運ばれた乱数ナンスがキャッシュまたはデータベースにすでに存在するかどうかを判断します. 存在する場合, リクエストは違法と見なされます. .

しかし、多くのシステム リクエストがある場合、nonce を格納するためのキャッシュまたはデータベースが必然的に大きくなることがわかります。その場合、サーバーの nonce 値を現在の時刻から 60 秒以内に保存するだけで済みます。

欠点:

乱数ノンスが完全に一意であることを確認する必要があります。
3. レコードベースのスキーム
レコードベースの検証方法とは何ですか? つまり、今は乱数は必要ありません. MD5 暗号化の一意性を使用し、多次元 (複数のフィールド) を使用して、各要求のレコードをデータベースに保存します. 各要求は、最初に署名レコードが存在するかどうかを確認します. . 存在する場合、リクエストは不正であると見なされて存在しなくなり、MD5 署名は他のパラメーターと一緒にデータベースに保存されます。もちろん、タイムスタンプと組み合わせて60秒以内のデータのみを保存することもできます。

3 つ目のポイントは、乱数メカニズムが考慮されていないことです。同時に、独自のビジネスにさまざまな拡張を加えたり、運用および保守の監視を容易にするためにビジネス パラメータを追加したりできます。

上記のすべてのソリューションには欠点があります. 致命的な欠点の 1 つは、サーバーの時刻とクライアントの時刻に時差があることです. もちろん、タイムスタンプを確認することでこの問題を解決することもできます.

おすすめ

転載: blog.csdn.net/weixin_44330810/article/details/126465706