.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が存在することは安全であるという問題を回避します。このブロック例では、他の多くの質問が発生します。
EncryptorTransformとDecryptorTransformを繰り返し再利用できますか?およびプロパティは「はい」を意味
*.CanReuseTransform
し*.CanTransformMultipleBlocks
ますが、注意すべき注意事項はありますか?RijndaelManaged
実装しているので、特に外部OSレベルのライブラリに関連付けられているためIDisposable
、ブロック内に配置する傾向があります。オブジェクトをusing
保持しているので、これに関する注意点はありますか?ICryptoTransform
潜在的に最も重要な質問は、高度にマルチスレッド化された環境で、
ICryptoTransform
スレッド間でオブジェクトを共有する際に問題が発生するでしょうか?ICryptoTransform
#3の答えがスレッドセーフではないということである場合、オブジェクトを使用している間、ロックによってパフォーマンスが大幅に低下しますか?(私が推測する負荷に依存します。)RijndaelManaged
毎回新しいものを単純にインスタンス化する方がパフォーマンスが高いでしょうか?または、1つを保存して、毎回RijndaelManaged
生成しますか?new RijndaelManaged().CreateEncryptor(...)
私は、これらが内部でどのように機能するかを知っているか、同様の実装の問題を経験している人がいることを望んでいます。これらの種類のパフォーマンスとスレッド関連の問題の多くは、通常、かなりの量の負荷がかかるまで現れないことがわかりました。
ありがとう!