我有一个高级目标,希望创建一个静态实用程序类,为我的.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是否更有效?还是存储一个RijndaelManaged并每次生成new RijndaelManaged().CreateEncryptor(...)?
谢谢!