【问题标题】:DotNetZip wrong password while unzippingDotNetZip 解压时密码错误
【发布时间】:2017-10-04 08:55:40
【问题描述】:

场景:上传文件而不是尝试使用带有密码保护的DotNetZip 压缩文件,密码是使用Membership.GeneratePassword() 方法生成的。一切正常,只是有时用户无法使用生成的密码解压缩文件。有线的事情是,这种情况只发生在某些时候,比如说 15 次中的 1 次。 生成密码:

public static String FilePassword()
{
    while (_filePassword.Length < 12)
    {
        _filePassword += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
    }

    return _filePassword;
}

保存文件:

if (FileUploadControl.HasFile)
{

    fileName = Path.GetFileName(FileUploadControl.FileName);
    FileUploadControl.SaveAs(FileSavePath + fileName);

        // Archive uploaded file to zip.
        using (ZipFile zip = new ZipFile())
        {
            // File to be archived.
            var file = FileUploadControl.PostedFile;

            // Enable encryption of file
            zip.Encryption = EncryptionAlgorithm.PkzipWeak;

            // Set password.
            zip.Password = Settings.FilePassword();

            // Set temporary folder path for archive process.
            zip.TempFileFolder = tempPath;

            // Add file to archive with its path.
            zip.AddFile(FileSavePath + file.FileName, "");

            File objFile = new File(file.FileName, FileSavePath); 

            // Save zip file with the name as file ID.
            zip.Save(FileSavePath + file.FileName);
        }
}

我在创建方法时记录了密码,并且在使用密码保护 zip 文件时,它们总是匹配的,我看不出有什么问题,为什么有时在解压缩文件时显示错误的密码。

【问题讨论】:

  • 您能否向我们展示一些有效和无效的密码示例?
  • 你检查过密码的字符编码吗?
  • @mjwills 密码是字母数字,工作密码之一:vKkowRZBtIxo,无效密码:QjCFFaM9LumZ

标签: c# asp.net .net zip dotnetzip


【解决方案1】:

为什么在FilePassword() 中使用静态全局变量_filePassword 而不是在作用域中使用一个?

这样它可以从外部修改,甚至可能仍然包含最后使用的值。如果没有lock,它也不是线程安全的。

用局部变量解决,应该没问题。

public static String FilePassword()
{
    string retString = string.Empty;
    while (retString.Length < 12)
    {
        retString += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
    }    
    return retString;
}

您也可以记录返回值。


理解示例

if (FileUploadControl.HasFile)
{

    fileName = Path.GetFileName(FileUploadControl.FileName);
    FileUploadControl.SaveAs(FileSavePath + fileName);
    string filePassword = Settings.FilePassword(); // Contains the Password

    using (ZipFile zip = new ZipFile())
    {
        var file = FileUploadControl.PostedFile;
        zip.Encryption = EncryptionAlgorithm.PkzipWeak;            
        zip.Password = filePassword; // <-- Set password for ZIP
        zip.TempFileFolder = tempPath;
        zip.AddFile(FileSavePath + file.FileName, "");
        File objFile = new File(file.FileName, FileSavePath);
        zip.Save(FileSavePath + file.FileName);
    }

    // Log this value!
    Log(filePassword);
}

【讨论】:

  • 好点。密码是用GeneratePassword方法直接生成的,所以它也是带有特殊字符的。将尝试您的建议,看看是否有帮助。
  • @Mony 如果您的问题发生,如果两个用户同时请求 Zip 文件,您可以尝试。
  • 您的更改会生成 4 个不同的密码,但其中不适合解压缩文件。我的日志:10/4/2017 11:22:55 AM =&gt; Password from FilePassword method: iowSYgGB4Nbi 10/4/2017 11:22:55 AM =&gt; Password from FilePassword method: mmnZeM1sz3ln 10/4/2017 11:22:55 AM =&gt; Password from zipping file: mmnZeM1sz3ln 10/4/2017 11:22:57 AM =&gt; Password from FilePassword method: 3xUeKXkWveIv 10/4/2017 11:22:58 AM =&gt; Password from FilePassword method: nKNZW67O6yi1 注意压缩时使用的压缩文件密码,即使这个密码不起作用
  • @Mony 您是否对压缩和日志记录使用了相同的变量?
  • @Mony 使用静态几乎可以肯定是您的问题的原因。您需要使用局部变量并将其传递而不是使用静态变量。或者使用HttpContext.Itemsodetocode.com/Articles/111.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 2020-11-04
相关资源
最近更新 更多