我的高级目标是创建一个封装我的 .NET 应用程序加密的静态实用程序类。在里面,我想尽量减少不必要的对象创建。
我的问题是:在 .NET Framework 中实现对称加密的类的线程安全性是什么? 具体来说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);
}
}
回避在这个类中存在 Key 和 IV 是否安全的问题,这个示例块提出了许多其他问题:
我可以不断重复使用 EncryptorTransform 和 DecryptorTransform 吗?和属性暗示“是”
*.CanReuseTransform
,*.CanTransformMultipleBlocks
但有什么我应该注意的警告吗?由于
RijndaelManaged
实现IDisposable
了我的倾向是将它放在一个using
块中,特别是因为它可能与外部操作系统级库相关联。既然我把ICryptoTransform
物体放在身边,有什么注意事项吗?可能是最重要的问题,在高度多线程的环境中,我是否会遇到
ICryptoTransform
在线程之间共享对象的问题?如果#3 的答案是它不是线程安全的,那么我在使用
ICryptoTransform
对象时是否会因锁定而导致性能严重下降?(我想取决于负载。)RijndaelManaged
每次都简单地实例化 new 会更好吗?还是存储一个RijndaelManaged
并new RijndaelManaged().CreateEncryptor(...)
每次生成?
我希望有人知道这些在幕后是如何工作的,或者对类似实现的问题有经验。我发现很多此类性能和线程相关问题通常在负载相当大时才会显现出来。
谢谢!