TripleDESCryptoServiceProvider - 容易遭到拒绝服务?

fra*_*lic 5 encryption cryptography denial-of-service tripledes

我们有一个遗留的ASP.NET站点,它使用加密方法:

http://www.codekeep.net/snippets/af1cd375-059a-4175-93d7-25eea2c5c660.aspx

当我们调用以下方法时,页面加载速度非常慢,最终返回Connection Reset:

Decrypt(" ", true);
Run Code Online (Sandbox Code Playgroud)

如果在后续页面请求中多次调用该方法,则应用程序池将关闭.

这发生在运行.NET framework v3.5的Windows 2008服务器上.

我把问题缩小到了TransformFinalBlock()电话.

注意:在Cassini上,我没有连接超时; 而是抛出以下异常:

System.Security.Cryptography.CryptographicException: Bad Data
Run Code Online (Sandbox Code Playgroud)

在其他字符串中调用Decrypt()会导致任何环境都没有问题.

为什么会这样?这是TripleDESCryptoServiceProvider中的错误吗?

显然,我可以过滤cipherString来拒绝""并避免这个特殊问题.但是,我担心我不怀疑的其他一些cipherString值会导致DoS.

更新2011.06.28

以下是重现该问题的最小代码:

// problem occurs when toEncryptArray is an empty array {}
      byte[] toEncryptArray = {};

      MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
      byte[] keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes("dummy_key"));
      hashmd5.Clear();

      TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
      tdes.Key = keyArray;
      tdes.Mode = CipherMode.ECB;
      tdes.Padding = PaddingMode.PKCS7;
      ICryptoTransform cTransform = tdes.CreateDecryptor();

      // the following line can crashes the ASP.NET Application Pool (may need to call multiple times).
      byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

      tdes.Clear();
Run Code Online (Sandbox Code Playgroud)

fra*_*lic 1

如上所述,问题在于解密逻辑无法正确处理输入密码是零长度数组的情况。

为此创建了一张票证:

http://connect.microsoft.com/VisualStudio/feedback/details/678150/denial-of-service-in-tripledescryptoserviceprovider

请注意,运行 .NET Framework 4.0 时它似乎工作正常。