.NET加密类的线程安全性?

mck*_*mey 13 c# encryption cryptography thread-safety rijndaelmanaged

我有一个高级目标,即创建一个静态实用程序类,它封装了我的.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个类中存在Key和IV是安全的问题,这个示例块提出了许多其他问题:

  1. 我可以一遍又一遍地重复使用EncryptorTransform和DecryptorTransform吗?这些*.CanReuseTransform*.CanTransformMultipleBlocks属性意味着"是",但是我应该注意哪些警告?

  2. 因为RijndaelManaged实现IDisposable我倾向于把它放在一个using块中,特别是因为它可能与外部操作系统级别的lib相关联.有什么警告,因为我保持ICryptoTransform周围的物体?

  3. 可能是最重要的问题,在高度多线程的环境中,我会遇到ICryptoTransform在线程之间共享对象的问题吗?

  4. 如果对#3的回答是它不是线程安全的,那么当我使用这些ICryptoTransform对象时,我是否会因锁定而导致严重的性能下降?(取决于负载我想.)

  5. RijndaelManaged每次只是简单地实例化它会更高效吗?或者存储一个RijndaelManagednew RijndaelManaged().CreateEncryptor(...)每次生成?

我希望那里的某些人知道这些工作是如何工作的,或者是在类似实现方面遇到的问题.我发现很多这些性能和线程相关的问题通常都没有表现出来,直到有相当大的负载.

谢谢!

Ree*_*sey 15

1)是的.

2)你处理它,你不能使用它.在此之前,您可以共享/使用它(但见下文)

3-4)来自MSDN:

"此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的.任何实例成员都不保证是线程安全的."

如果你想保留它并在线程之间共享它,你需要实现锁定并将其视为锁定资源.否则,我建议根据需要制作单独的版本,并在完成后处理它们.

5)我建议根据需要创建这些,然后尝试优化它,如果以后发现你有性能问题.不要担心创建新版本后的性能影响,直到您在分析后发现它是一个问题.

  • 确实,你不应该花时间过早地优化,但只是想放弃这里,在我们的情况下,我们发现执行~500次小加密(都使用相同的密码)花了将近10秒,这是一场灾难.几乎所有的时间都花在创建加密器上.重复使用ICryptoTransforms是一个显而易见的解决方案. (2认同)