中間者攻撃の対象となる自分自身に渡すメッセージがあります。そのため、メッセージを送信してから受信するまでの間、メッセージの完全性が維持されていることに懸念を抱いています。
メッセージを自分自身に送信すると、送信されたメッセージに関する情報は今後利用できないと想定する必要があります。メッセージは完全に自己完結型です。
そのためには、メッセージの内容をハッシュし、メッセージを送信する前にハッシュを比較する必要があることを知っています。メッセージを送信した後、それらが異なる場合、メッセージは改ざんされています。
もちろん、中間者が、ハッシュが実際にはそのままのメッセージ コンテンツの単なるハッシュであることを知っている場合、メッセージは自己完結型であるため、新しいコンテンツを作成して同じハッシュを適用するだけで済みます。内容にアルゴリズム。
問題は、ハッシュを生成するときにメッセージの内容をランダム化するには、どのくらいの長さまで行くべきかということです。収益が減少するポイントに到達するのはいつですか。
このシナリオでは、一連のキーと値のペアがあります。そのために、私が取らなければならないことがわかっている手順は次のとおりです。
- メッセージにソルトを追加します。塩は世界の秘密です。ハッシュする前に、メッセージの内容に添付されます。
- ハッシュを生成する前に、一貫した方法でキーと値のペアを並べ替えます。
- 直接関係はありませんが、リプレイ攻撃を防ぐために、ハッシュする前に各メッセージの内容にタイムスタンプが追加されます。
これらは、私が検討しているオプションの手順です。
- 注文する前にキーを変換します。それらを逆にしてから、カウント/キーで注文することを検討しました。
- キー/値のペアを区切るセパレーターをいじる(キー/値のセパレーターとペアのセパレーターの両方)。
ノート
ここではメッセージのプライバシーは必須ではないため、暗号化は必要ありません。値は平文で送信する必要があります。
最後に、避けるべきハッシュ アルゴリズムは何ですか?
仕様
入力の検証と永続化を処理するコントローラーがある 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 でそれらを利用する方法の発見です。
貢献してくれたすべての人に感謝します。