2

署名がどのように行われるかを検索して、かなり手の込んだコードサンプルに出くわしました。しかし、次のコードで十分なようです。たとえば、ここに塩のような何かが欠けているのですか、それとも署名するだけで塩は不要ですか?私は暗号化しておらず、署名しているだけです。

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

byte[] data = Encoding.ASCII.GetBytes("hello");
byte[] signature = rsa.SignData(data, "SHA1");

byte[] dataTest = Encoding.ASCII.GetBytes("hello");
bool verified = rsa.VerifyData(dataTest, "SHA1", signature);
if (verified) Text = "True"; else Text = "Untrue";
4

1 に答える 1

13

署名するだけで塩は不要ですか?

ハッシュが共有シークレットとして使用されている既知のメッセージのハッシュの事前計算を防ぐことがタスクである場合は、ソルトが必要です。それがアプリケーションでない場合は、ソルトする必要はありません。

なぜ塩が必要なのかわからない場合は、そのトピックに関する私の一連の記事を参照してください。

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

ここに何か足りないものはありますか?

はい、最も重要なステップがありません。公開鍵をどのように伝達しますか?システム全体のセキュリティは、あなたが言及していないそのステップに依存しています。

アリスがボブにメッセージを送信したいと考えており、ボブがそれがアリスからのものであることを確認したいとします。彼らは次のことをします:

  • アリスは鍵ペアを作成し、秘密鍵を安全に保管します。
  • アリスは公開鍵を公開します。
  • ボブはアリスの公開鍵を取得します。
  • アリスはメッセージを公開します。
  • アリスはメッセージをハッシュし、秘密鍵を使用してハッシュを暗号化します。
  • ボブはメッセージを読みます。
  • ボブは暗号化されたハッシュを読み取ります。
  • ボブは、暗号化されたハッシュをアリスの公開鍵で復号化します。
  • ボブはメッセージをハッシュします。
  • ボブは、復号化されたハッシュをメッセージハッシュと比較します。それらが一致する場合、ボブはメッセージがアリスによって保証されたことを知っています。

これは正しいです?

いいえ。結論は正しくありません。結論は次のようになります。

  • ボブは、復号化されたハッシュをメッセージハッシュと比較します。それらが一致する場合、ボブは、ボブがアリスの公開鍵であると信じている公開鍵と一致する秘密鍵を所有している誰かによってメッセージが保証されたことを知っています。

元の結論は、ボブがアリスの公開鍵を持っているという追加の証拠がある場合にのみ正しいです。ボブはこの状況にある可能性があるため:

  • アリスは鍵ペアを作成し、秘密鍵を安全に保管します。
  • マロリーはキーペアを作成し、セキュリティは秘密キーを保存します。
  • アリスは公開鍵を公開します。
  • マロリーはアリスの公開を傍受し、アリスの公開鍵をマロリーの公開鍵に置き換えます。
  • ボブはマロリーの公開鍵を取得しますが、それはアリスのものであると信じています。

そして今、すべてが地獄に行きました。マロリーは、ボブがアリスから来たと信じているメッセージを公開できるようになりましたが、アリスは公開できません。

公開鍵を安全に公開する方法を言う必要があります。システム全体は、秘密鍵が秘密のままであることと、公開鍵を所有者に正しく関連付けることができるメカニズムがあることの2つに依存しています。

于 2012-04-23T16:15:37.040 に答える