在我的一个库中有一个带有静态方法的静态加密/解密类。代码有点大,所以我把它贴在这里:http://pastebin.com/zRZtNmjU
在Parallel.ForEach()
调用中执行的一些代码的执行堆栈中开始使用此代码之前,我没有遇到任何问题。我试着在一些MemoryStream和CryptoStream变量上添加一些lock
的使用,但这似乎没有帮助。我这样做是因为我相当确定这个问题是由访问这个静态类引起的。方法。
我一直得到的异常是:'Padding是无效的,不能删除。'
此异常发生在执行到decryptedTextStream.FlushFinalBlock();
时,在称为Decrypt的代码(第250行)的最后一个方法中。
我的问题是-我不能找出什么是错误的代码,我想知道如果唯一的问题是类和方法是静态的?几个月来,我一直在使用这个代码,没有遇到任何问题,直到最近,当我开始在其他一些TPL代码中使用它时,才遇到问题。我应该把这个类重构成基于实例的还是不能解决我得到的异常?
你的代码根本不是线程安全的…会发生什么呢?目前你有一个iCryptoTransform是创建一次(静态构造函数),所以每个加密/解密调用将使用该对象…
有两个问题:
-
如果2个或更多的线程试图并行加密/解密怎么办?你的系统有一个内部状态,在所有调用中共享,这是不好的,因为在IV的操作模式下,每个加密块都取决于之前的块……这有利于安全…但是如果之前加密的块不属于当前的块流,因为另一个线程同时通过同一个实例传输块,那就非常糟糕了……
-
你不关心你的iCryptoTransform是可重用的…在您的情况下,它是,但通常,您需要检查CanReuseTransform成员或为每个操作创建一个新成员
建议:
让你的ICryptoTransform活在Encrypt()/Decrypt()方法中…不要使用静态变量…