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)
如上所述,问题在于解密逻辑无法正确处理输入密码是零长度数组的情况。
为此创建了一张票证:
请注意,运行 .NET Framework 4.0 时它似乎工作正常。