You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DotNetZip密码无效问题:Azure Function加密Zip后7zip解压失败

问题:DotNetZip设置Zip条目密码后7zip解压提示密码错误

通过ADF生成文件并压缩至Azure存储容器,调用Azure Function读取该Zip文件并为单个条目设置密码,覆盖回原容器后,用7zip解压时提示密码错误,密码不生效。

相关代码

string zipName = objParam.ZipFileName;
Logger.LogInformation("Starting Password Protect of Zip File");
var blobClient = BlobServiceClient.GetBlobContainerClient(objParam.DestinationContainer).GetBlobClient(zipName);

Logger.LogInformation("Zip File Name: " + objParam.ZipFileName);
using (Stream zipStream = await blobClient.OpenReadAsync().ConfigureAwait(false))
{
    ZipFile zipFile = ZipFile.Read(zipStream);    
    zipFile.Encryption = EncryptionAlgorithm.None;
    zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;

    foreach (var entry in zipFile)
    {                        
        entry.Password = "Test123";
    }

    var zipOutputStream = new MemoryStream();
    zipFile.Save(zipOutputStream);
    zipOutputStream.Seek(0, SeekOrigin.Begin);
    zipStream.Close();
    await blobClient.UploadAsync(zipOutputStream, true);
    zipOutputStream.Close();
}            

问题根源

  • 代码中设置了zipFile.Encryption = EncryptionAlgorithm.None,这会强制禁用整个Zip文件的加密功能,直接覆盖了单个条目设置的密码配置,导致条目未被加密。
  • 若加密算法与7zip不兼容,也会出现密码验证失败的情况。

修复方案

  1. 删除zipFile.Encryption = EncryptionAlgorithm.None,或指定与7zip兼容的加密算法(如WinZipAes256,安全性更高且支持广泛)。
  2. 使用using语句自动管理流和ZipFile实例,避免手动关闭流可能引发的资源泄漏或数据写入不完整问题。

修改后的代码

string zipName = objParam.ZipFileName;
Logger.LogInformation("Starting Password Protect of Zip File");
var blobClient = BlobServiceClient.GetBlobContainerClient(objParam.DestinationContainer).GetBlobClient(zipName);

Logger.LogInformation("Zip File Name: " + objParam.ZipFileName);
using (Stream zipStream = await blobClient.OpenReadAsync().ConfigureAwait(false))
using (var zipFile = ZipFile.Read(zipStream))
{
    // 采用WinZip兼容的AES-256加密,7zip完全支持
    zipFile.Encryption = EncryptionAlgorithm.WinZipAes256;
    zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;

    foreach (var entry in zipFile)
    {                        
        entry.Password = "Test123";
    }

    using (var zipOutputStream = new MemoryStream())
    {
        zipFile.Save(zipOutputStream);
        zipOutputStream.Seek(0, SeekOrigin.Begin);
        await blobClient.UploadAsync(zipOutputStream, true);
    }
}

额外提示

  • 确保使用的DotNetZip版本支持WinZipAes256加密,建议升级至最新稳定版。
  • 测试时可先通过DotNetZip自身的解压方法验证密码是否生效,再用7zip测试,排除工具兼容性问题。

内容的提问来源于stack exchange,提问作者Adonis Villanueva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:29:55