我的一个库中有静态加密/解密类和静态方法。代码有点大,所以我在这里发布了它:http://pastebin.com/zRZtNmjU
在开始在Parallel.ForEach()
调用中执行的某些代码的执行堆栈中使用之前,我对此代码没有任何问题。我尝试在一些MemoryStream和CryptoStream变量上添加一些lock
,但这似乎没有帮助。我这样做是因为我相当肯定这个问题是由于访问这个静态类而造成的。多线程的方法。
我不断得到的例外是:'填充无效,无法删除。'
当在名为Decrypt的代码(第250行)中的最后一个方法中执行到达decryptedTextStream.FlushFinalBlock();
时,会发生此异常。
我的问题是 - 我无法弄清楚代码有什么问题,我想知道唯一的问题是类和方法是否是静态的?几个月来我一直在使用这个代码而没有一个问题,并且最近才开始在其他一些TPL代码中使用它时遇到问题。我应该只是将这个类重构为基于实例还是不能解决我得到的异常?
答案 0 :(得分:2)
你的代码根本不是线程安全的...... 怎么了?目前你有一个创建一次的iCryptoTransform(静态构造函数),所以每个加密/解密调用都会使用该对象......
有两个问题:
如果两个或多个线程并行尝试加密/解密怎么办? 你的系统有一个内部状态,在所有调用中都是共享的,这是不好的,因为在运行模式下使用IV每个加密块都取决于之前的块...这对安全性有好处......但是如果加密的块很糟糕之前不属于当前的块流,因为另一个胎面管道同时阻塞同一个实例...
你不关心你的iCryptoTransform是否可重复使用......在你的情况下,它是,但通常你需要检查CanReuseTransform成员或为每个操作创建一个新成员
建议:
让你的ICryptoTransform存在于Encrypt()/ Decrypt()方法中...不要使用静态变量......