15

.NETアプリケーションの暗号化をカプセル化する静的ユーティリティクラスを作成するという高レベルの目標があります。内部では、不要なオブジェクトの作成を最小限に抑えたいと思います。

私の質問は、.NETFramework内で対称暗号化を実装するクラスのスレッドセーフとは何ですか? 具体的System.Security.Cryptography.RijndaelManagedには、ICryptoTransformそれが生成するタイプ。

たとえば、私のクラスコンストラクターでは、次の行に沿って簡単に何かを実行できますか?

static MyUtility()
{
    using (RijndaelManaged rm = new RijndaelManaged())
    {
        MyUtility.EncryptorTransform = rm.CreateEncryptor(MyUtility.MyKey, MyUtility.MyIV);
        MyUtility.DecryptorTransform = rm.CreateDecryptor(MyUtility.MyKey, MyUtility.MyIV);
    }
}

このクラス内にキーとIVが存在することは安全であるという問題を回避します。このブロック例では、他の多くの質問が発生します。

  1. EncryptorTransformとDecryptorTransformを繰り返し再利用できますか?およびプロパティは「はい」を意味*.CanReuseTransform*.CanTransformMultipleBlocksますが、注意すべき注意事項はありますか?

  2. RijndaelManaged実装しているので、特に外部OSレベルのライブラリに関連付けられているためIDisposable、ブロック内に配置する傾向があります。オブジェクトをusing保持しているので、これに関する注意点はありますか?ICryptoTransform

  3. 潜在的に最も重要な質問は、高度にマルチスレッド化された環境で、ICryptoTransformスレッド間でオブジェクトを共有する際に問題が発生するでしょうか?

  4. ICryptoTransform#3の答えがスレッドセーフではないということである場合、オブジェクトを使用している間、ロックによってパフォーマンスが大幅に低下しますか?(私が推測する負荷に依存します。)

  5. RijndaelManaged毎回新しいものを単純にインスタンス化する方がパフォーマンスが高いでしょうか?または、1つを保存して、毎回RijndaelManaged生成しますか?new RijndaelManaged().CreateEncryptor(...)

私は、これらが内部でどのように機能するかを知っているか、同様の実装の問題を経験している人がいることを望んでいます。これらの種類のパフォーマンスとスレッド関連の問題の多くは、通常、かなりの量の負荷がかかるまで現れないことがわかりました。

ありがとう!

4

3 に答える 3

18

1) はい。

2) 廃棄したものは使用できません。それまでは、共有/使用できます(ただし、以下を参照)

3-4) MSDNから:

"この型の public static (Visual Basic では Shared) メンバーはスレッド セーフです。インスタンス メンバーはスレッド セーフであるとは限りません。"

これを維持し、スレッド間で共有したい場合は、ロックを実装してロックされたリソースとして扱う必要があります。それ以外の場合は、必要に応じて個別のバージョンを作成し、完了したら破棄することをお勧めします。

5) 必要に応じてこれらを作成し、後でパフォーマンスの問題が見つかった場合は最適化を試みることをお勧めします。プロファイリング後にそれが問題であることがわかるまで、新しいバージョンを作成することによるパフォーマンスへの影響について心配する必要はありません。

于 2009-06-12T00:55:59.740 に答える
0
  1. 絶対にありません、私は問題を抱えていました。私はそれを 2 年間使用していましたが、最も重要なコードの一部が突然、復号化時にエラーをスローし始めました。マイクロソフトのパッチの結果? マカフィー?ドット ネット フレームワークの更新?(フレームワーク 4.7.2)

私が最終的にそれを理解したとき、私は CreateEncryptor と CreateDecryptor を暗号化と復号化の実際の呼び出し内で使用するように移動しました。問題が修正されました。

于 2020-10-02T11:39:32.107 に答える