我们有一个旧的 ASP.NET 站点,它在此处使用加密方法:
http://www.codekeep.net/snippets/af1cd375-059a-4175-93d7-25eea2c5c660.aspx
当我们调用以下方法时,页面加载非常缓慢,最终返回 Connection Reset:
Decrypt(" ", true);
如果在后续的页面请求中多次调用该方法,应用程序池将关闭。
这发生在运行 .NET framework v3.5 的 Windows 2008 服务器上。
我将问题缩小到TransformFinalBlock()
电话。
注意:在 Cassini 上,我没有收到连接超时;而是引发以下异常:
System.Security.Cryptography.CryptographicException: Bad Data
为其他字符串调用 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();