日志文件,“填充无效,无法删除”
本文关键字:删除 填充无效 无效 文件 填充 日志 | 更新日期: 2023-09-27 18:18:41
我在错误日志文件上发现了这个,但网站仍然工作正常。我无法重现这个问题,我仍然担心它,因为我在错误日志中看到这种情况经常发生。
谁知道是什么原因导致的错误?
public static string Decrypt(string inputText)
{
if (String.IsNullOrEmpty(inputText))
return string.Empty;
RijndaelManaged rijndaelCipher = new RijndaelManaged();
byte[] encryptedData = Convert.FromBase64String(inputText);
PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT);
using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
{
using (MemoryStream memoryStream = new MemoryStream(encryptedData))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
byte[] plainText = new byte[encryptedData.Length];
int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length);
return Encoding.Unicode.GetString(plainText, 0, decryptedCount);
}
}
}
}
下一行抛出错误return Encoding.Unicode.GetString(plainText, 0, decryptedCount);
错误日志
System.Security.Cryptography.CryptographicException: Padding is invalid and cannot be removed.
at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at QueryStringModule.Decrypt(String inputText) in line 135
at QueryStringModule.context_BeginRequest(Object sender, EventArgs e) in E:'SSv45'Pages'QueryStringModule.cs:line 46
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
谢谢Ming-fei
是的,你应该担心,因为有多种原因,最主要的一个当然是你的数据没有被解密。
但是查看代码也有很多值得担心的地方:
- 对于url安全的base 64应该使用,以避免随机解密错误;
- 加密密钥和盐似乎不变,在这种情况下,不需要使用
PasswordDeriveBytes
,只提供虚假保护+不必要的减速; - 密钥和IV将是静态的,以便您可以区分密文;
-
PasswordDeriveBytes
对于超过20字节的数据是不安全的,甚至可能在IV中重复密钥的字节; -
Read
方法可能不会返回所有的数据字节; - 它使用Unicode编码,在微软的情况下意味着UTF-16LE,基本上需要两倍的字节正常文本;
- 没有显式错误处理或区分系统异常和输入相关异常。
你不应该在网络连接上使用CBC,因为填充oracle攻击可能导致中间有人。您的"加密"数据可能不是机密的!如果有很多很多关于这个的日志,那么就在我们说话的时候,可能有人正在解密你的密文。
基本上这段代码设法跳到每一个可能的坑。您遇到的问题可能是由于#1或#5。
你应该创建一个完整的重新设计的代码,最好是有人知道他/她在做什么。
您的代码正在使用Rijndael,这是一个块密码,这意味着它以16个字符块(128位块)加密数据。
如果被加密的数据的最后一块不够长(<128位),必须添加填充以确保它是可加密的。
如果在加密期间显式设置填充,则需要确保在解密期间也显式设置填充。如果在加密过程中没有显式地设置它,那么在解密过程中也不需要显式地设置它——只需确保两个方法匹配即可。
如果加密时使用的密钥与解密时使用的密钥不同,也会出现此错误。