6

中間者攻撃の対象となる自分自身に渡すメッセージがあります。そのため、メッセージを送信してから受信するまでの間、メッセージの完全性が維持されていることに懸念を抱いています。

メッセージを自分自身に送信すると、送信されたメッセージに関する情報は今後利用できないと想定する必要があります。メッセージは完全に自己完結型です。

そのためには、メッセージの内容をハッシュし、メッセージを送信する前にハッシュを比較する必要があることを知っています。メッセージを送信した後、それらが異なる場合、メッセージは改ざんされています。

もちろん、中間者が、ハッシュが実際にはそのままのメッセージ コンテンツの単なるハッシュであることを知っている場合、メッセージは自己完結型であるため、新しいコンテンツを作成して同じハッシュを適用するだけで済みます。内容にアルゴリズム。

問題は、ハッシュを生成するときにメッセージの内容をランダム化するには、どのくらいの長さまで行くべきかということです。収益が減少するポイントに到達するのはいつですか。

このシナリオでは、一連のキーと値のペアがあります。そのために、私が取らなければならないことがわかっている手順は次のとおりです。

  1. メッセージにソルトを追加します。塩は世界の秘密です。ハッシュする前に、メッセージの内容に添付されます。
  2. ハッシュを生成する前に、一貫した方法でキーと値のペアを並べ替えます。
  3. 直接関係はありませんが、リプレイ攻撃を防ぐために、ハッシュする前に各メッセージの内容にタイムスタンプが追加されます。

これらは、私が検討しているオプションの手順です。

  1. 注文する前にキーを変換します。それらを逆にしてから、カウント/キーで注文することを検討しました。
  2. キー/値のペアを区切るセパレーターをいじる(キー/値のセパレーターとペアのセパレーターの両方)。

ノート

ここではメッセージのプライバシーは必須ではないため、暗号化は必要ありません。値は平文で送信する必要があります。

最後に、避けるべきハッシュ アルゴリズムは何ですか?


仕様

入力の検証と永続化を処理するコントローラーがある ASP.NET MVC サイトがあります。

(ヒューリスティックに基づいて、どれが重要ではない) 入力が自動化されたスパムの試みであると判断された場合IDictionary<string, string>、入力値を使用して のモデルが作成され、ViewResult が一般的な CAPTCHA ページに送信されます。

そのビューでは、CAPTCHA コントロールを含むフォームで、の内容がIDictionary<string, string>非表示の入力フィールドに書き出され、フォームのアクションはコンテンツが最初に投稿されたときと同じアクションになります。このようにして、MVC はフォームが再送信されたときに値を取得できます。

このため、キーと値のペアを暗号化できません (または、理由と方法を教えてください!)。

もちろん、ハッシュ化されたメッセージの内容を含むもう 1 つの値を追加する必要があります。その値が存在する場合、コントローラーはメッセージの整合性が維持されていることを確認し、維持されている場合は入力を永続化できるようにします。

解決

System.Security.Cyrptography.Pkcs 名前空間の SignedCms クラスを使用することにしました。これは、CMS/PKCS #7 メッセージの署名と検証を表します。

詳しく説明すると、MAKECERT.EXE を使用して自己発行の証明書を作成し、コードで次の例を使用してデータにデジタル署名します。

http://blogs.msdn.com/shawnfa/archive/2006/02/27/539990.aspx

ここで、エクスポートされた秘密鍵のパスワードとサーバーのセキュリティを安全に保つことが問題になるはずです。これにより、プログラミングは少なくなります。

リプレイ攻撃用のタイムスタンプ用のキーを追加する必要がありますが、それほど難しくはありません。

答えはKaliumにあり、彼の最初の投稿ではなく、デジタル署名への道を示した彼のフォローアップ コメントと、最終的に .NET でそれらを利用する方法の発見です。

貢献してくれたすべての人に感謝します。

4

5 に答える 5

6

ここで必要なのは PGP/GPG だと思います。

于 2009-04-02T17:42:20.373 に答える
2

アプリケーションが自身のメッセージが改ざんされていないことを確認できるようにするための最も簡単なアプローチは、キー付きハッシュメッセージ認証コードを使用することです。メッセージは平文で送信されますが、改ざんを防ぐためのハッシュも含まれています。ハッシュは、メッセージの内容と秘密鍵の両方に依存します。中間者は、キーを知らずに変更されたメッセージにハッシュを偽造することはできません。アプリケーションはメッセージの作成と検証の両方を行うため、秘密鍵を開示する必要はありません。

起こりうる落とし穴のほとんどを回避するために慎重に検討されているため、RFC-2104http://www.ietf.org/rfc/rfc2104.txtで説明されている実装を特にお勧めします

信頼できない当事者がメッセージの信頼性も検証する必要がある場合は、代わりにデジタル署名スキームを使用する必要があります。

.Netライブラリでは両方がサポートされている可能性があります。Milesは、SHA1ハッシュを使用してキー付きHMACを実装する.Netライブラリ関数のMSDN Webページへのリンクを(コメントとして)有益に提供しました:http://msdn.microsoft.com/en-us/library/system.security 。 cryptography.hmacsha1.aspx

于 2009-04-02T18:22:11.357 に答える
1

デジタル署名されたメッセージが必要です。GPG を使用すると、メッセージ暗号化せずに署名できます。しかし、ハッシュを生成できないため、誰もそれを改ざんすることはできません。ハッシュはあなたの秘密鍵を使用するため、できるのはあなただけです

于 2009-04-02T17:48:00.970 に答える
0

おそらくメッセージにデジタル署名する必要があります (したがって、オプションとして Kalium が推奨する PGP/GPG が適切です)。作成できる純粋なハッシュは、攻撃者によって再作成される可能性があります。デジタル署名 - 公開鍵を使用して検証できるように、秘密署名鍵を使用することが解決策です。それ以外は、無益な練習です。

于 2009-04-02T17:48:01.173 に答える
0

「安全な」チャネル (つまり、ハッシュ) を介して情報を渡すことができないと仮定すると、次のようになります。

  1. メッセージをハッシュし、秘密鍵でハッシュに署名します。署名付きハッシュをメッセージに含めます。
  2. メッセージを取得したら、公開鍵を使用して署名付きハッシュを復号化し、それがメッセージの実際のハッシュと一致することを確認します。

攻撃者は、新しいハッシュを暗号化するために秘密鍵が必要になるため、メッセージを「偽造」することはできません。

他の人が述べたように、これは単純な単純なデジタル署名であり、PGP/GPG などで処理できます。

于 2009-04-02T17:49:33.477 に答える