4

メッセージを暗号化するための対称キーを生成するときは、プロセスのメモリにバイト配列を作成します。

次に、 AesCryptoServiceProviderなどのSymmetricAlgorithmをインスタンス化します。次に、通常、キー プロパティをメモリ内キーに設定します。

次に、通常はSymmetricAlgorithm.CreateEncryptor()またはCreateDecryptor()を呼び出してICryptoTransformを作成します。上記の Key プロパティの設定をスキップして、キーと IV をCreateEncryptor(byte[], byte[])またはCreateDecryptor(byte[], byte[])に直接渡すこともできます。

  1. ICryptoTransform が作成されたらすぐにバイト配列をゼロにして、悪意のあるソフトウェアが読み取らないようにする方が安全ですか? バイト配列を使用して暗号化ランダム データを生成し、変換を初期化していますが、ピニングはセキュリティを提供しますか?

  2. SymmetricAlgorithm.Key プロパティを設定した場合、どこかに追加のコピーがありますか、それとも秘密のバイト配列へのポインターだけですか? 変換を作成した直後に SymmetricAlgorithm を破棄する方が安全ですか?

  3. ICryptoTransform が作成された時点で、RAM に追加のコピーがあると想定しています。では、ICryptoTransform オブジェクトの存続期間中、キーは不正なソフトウェアによって読み取られるのでしょうか? 処分後はどうですか?

    言い換えれば、ソフトウェアが暗号化されたデータを断続的に書き込むストリームがある場合、キーが盗まれる可能性のある時間を最小限に抑えるために、それぞれの小さなビットを個別のキーで暗号化し、その間にできるすべてのものを破棄/破棄する方がよいでしょうか?

悪意のあるソフトウェアがコンピュータに存在すると、何も安全ではないので、心配する必要はないと言う人がいるかもしれません。攻撃者が個人データの暗号化キーにアクセスすることによって引き起こされる潜在的な被害を最小限に抑えるための措置を講じたいと思います。

4

1 に答える 1

2
  1. いいえ、安全ではありません。

  2. それは問題ではありません、そしていいえ、それはより安全ではありません。

  3. はい、それはそうする特権を持つどんなソフトウェアでも読むことができます。.Net暗号のDispose()は一般にメモリをゼロにするため、廃棄後はおそらく読み取ることができません。

これについては多くの宗教的な議論がありますが、実際的な意味からできるだけ明確に答えます。「不正なソフトウェア」、つまりマルウェアが、復号化プログラムのメモリ空間にアクセスする権限を持って実行されている場合、キーを読み取るだけでなく、復号化したデータも読み取ることができます。確かに、それはもっと問題です-結局のところ、それがキーが保護するものだからです。ユーザーが自分のデータを表示するのを止めるつもりはありませんか?したがって、セキュリティを追加することはありません。

言い換えれば、計算可能性のテネットは、ホストプラットフォームのセキュリティルールを置き換えるのではなく、補足するものです。この2つを足し合わせると、セキュリティのために両方が必要になります。復号化マシンにホストセキュリティがないと、暗号化セキュリティを利用できません。追加しようとすると、複雑さが増し、実際のバグが発生する可能性が高くなります(ただし、.NETがメモリ管理を行うため、ここではそれほど問題にはなりません)。

于 2012-04-12T14:26:12.367 に答える