多线程/TPL应用程序中的静态加密/解密问题



在我的一个库中有一个带有静态方法的静态加密/解密类。代码有点大,所以我把它贴在这里:http://pastebin.com/zRZtNmjU

Parallel.ForEach()调用中执行的一些代码的执行堆栈中开始使用此代码之前,我没有遇到任何问题。我试着在一些MemoryStream和CryptoStream变量上添加一些lock的使用,但这似乎没有帮助。我这样做是因为我相当确定这个问题是由访问这个静态类引起的。方法。

我一直得到的异常是:'Padding是无效的,不能删除。'

此异常发生在执行到decryptedTextStream.FlushFinalBlock();时,在称为Decrypt的代码(第250行)的最后一个方法中。

我的问题是-我不能找出什么是错误的代码,我想知道如果唯一的问题是类和方法是静态的?几个月来,我一直在使用这个代码,没有遇到任何问题,直到最近,当我开始在其他一些TPL代码中使用它时,才遇到问题。我应该把这个类重构成基于实例的还是不能解决我得到的异常?

你的代码根本不是线程安全的…会发生什么呢?目前你有一个iCryptoTransform是创建一次(静态构造函数),所以每个加密/解密调用将使用该对象…

有两个问题:

  1. 如果2个或更多的线程试图并行加密/解密怎么办?你的系统有一个内部状态,在所有调用中共享,这是不好的,因为在IV的操作模式下,每个加密块都取决于之前的块……这有利于安全…但是如果之前加密的块不属于当前的块流,因为另一个线程同时通过同一个实例传输块,那就非常糟糕了……

  2. 你不关心你的iCryptoTransform是可重用的…在您的情况下,它是,但通常,您需要检查CanReuseTransform成员或为每个操作创建一个新成员

建议:

让你的ICryptoTransform活在Encrypt()/Decrypt()方法中…不要使用静态变量…

最新更新