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不兼容,也会出现密码验证失败的情况。
修复方案
- 删除
zipFile.Encryption = EncryptionAlgorithm.None,或指定与7zip兼容的加密算法(如WinZipAes256,安全性更高且支持广泛)。 - 使用
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
相关产品推荐
相关产品推荐

