日志文件,“填充无效,无法删除”

本文关键字:删除 填充无效 无效 文件 填充 日志 | 更新日期: 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

日志文件,“填充无效,无法删除”

是的,你应该担心,因为有多种原因,最主要的一个当然是你的数据没有被解密。

但是查看代码也有很多值得担心的地方:

  1. 对于url安全的base 64应该使用,以避免随机解密错误;
  2. 加密密钥和盐似乎不变,在这种情况下,不需要使用PasswordDeriveBytes,只提供虚假保护+不必要的减速;
  3. 密钥和IV将是静态的,以便您可以区分密文;
  4. PasswordDeriveBytes对于超过20字节的数据是不安全的,甚至可能在IV中重复密钥的字节;
  5. Read方法可能不会返回所有的数据字节;
  6. 它使用Unicode编码,在微软的情况下意味着UTF-16LE,基本上需要两倍的字节正常文本;
  7. 没有显式错误处理或区分系统异常和输入相关异常。

你不应该在网络连接上使用CBC,因为填充oracle攻击可能导致中间有人。您的"加密"数据可能不是机密的!如果有很多很多关于这个的日志,那么就在我们说话的时候,可能有人正在解密你的密文。

基本上这段代码设法跳到每一个可能的坑。您遇到的问题可能是由于#1或#5。

你应该创建一个完整的重新设计的代码,最好是有人知道他/她在做什么。

您的代码正在使用Rijndael,这是一个块密码,这意味着它以16个字符块(128位块)加密数据。

如果被加密的数据的最后一块不够长(<128位),必须添加填充以确保它是可加密的。

如果在加密期间显式设置填充,则需要确保在解密期间也显式设置填充。如果在加密过程中没有显式地设置它,那么在解密过程中也不需要显式地设置它——只需确保两个方法匹配即可。

如果加密时使用的密钥与解密时使用的密钥不同,也会出现此错误。