zipfile模块不支持AES加密,仅支持弱效的传统ZIP 2.0加密;真正安全需用pyminizip或subprocess调用7z实现AES-256加密。

zipfile不支持AES加密,只能用传统ZIP 2.0加密
Python标准库的 zipfile 模块**无法生成AES加密的ZIP文件**,它只支持旧式的“ZIP 2.0 encryption”(也叫CRC-based encryption),这种加密强度极弱,密码可被轻易暴力破解或直接绕过。如果你看到某些教程声称用 setpassword() 就能安全加密,那是严重误导。
真正需要保护敏感数据时,必须换方案。但如果你只是应付内部简单场景(比如防同事随手双击打开),可以临时用传统加密,前提是明确接受其风险。
-
ZipFile.write()本身不处理密码;必须用ZipFile.writestr()配合ZipInfo手动设置encrypt()标志 - 密码必须是 bytes 类型,比如
b"mypassword",传 str 会报TypeError - 压缩级别设为
ZIP_DEFLATED时,加密仍生效;但部分老旧解压工具可能拒绝解密已压缩的条目
用writestr + ZipInfo实现传统加密的最小可行代码
以下代码能生成一个带密码的ZIP,但请再次注意:这不等于安全。
import zipfile
from zipfile import ZipInfo
<p>with zipfile.ZipFile("secret.zip", "w") as zf:</p><h1>构造ZipInfo对象并标记为加密</h1><pre class="brush:python;toolbar:false;">info = ZipInfo("sensitive.txt")
info.compress_type = zipfile.ZIP_DEFLATED
info.flag_bits |= 0x1 # 设置加密标志位
# 写入内容并指定密码(bytes!)
zf.writestr(info, "confidential data here", pwd=b"123456")
验证是否生效:用系统自带解压工具打开 secret.zip,会提示输入密码;用 unzip -P 123456 secret.zip 可无提示解压(Linux/macOS)。但用 fcrackzip 几秒就能爆破出密码。
真正安全的替代方案:用pyminizip或7z命令行
要 AES-256 加密,必须跳出 zipfile。两个靠谱选择:
-
pyminizip:纯Python封装,支持 AES,安装后一行调用:pyminizip.compress("data.txt", "", "safe.zip", "pwd123", 5)(注意密码是 str) -
subprocess调用 7-Zip(推荐):Windows 用"7z.exe a -p123456 -mem=AES256 safe.zip data.txt",macOS/Linux 用7z a -p123456 -mem=AES256 safe.zip data.txt。7z 格式比 ZIP 更可靠,且 AES 密码不可绕过
别试图给 zipfile 打补丁——它的底层 C 实现没暴露 AES 接口,所有“增强版 zipfile”都是重新封装 libzip 或 7z 的轮子。
解压加密ZIP时常见错误和绕过点
即使你用了传统加密,解压端也容易出问题:
- 用
ZipFile.extractall(pwd=...)解密时,密码必须和打包时完全一致(包括类型、空格、大小写),且pwd参数只对传统加密有效,对 AES ZIP 直接抛RuntimeError: File is encrypted - Mac 上归档实用工具默认不支持传统加密解密;Windows 资源管理器有时会静默跳过加密文件
- 最危险的是:传统加密的 ZIP 文件头不加密,文件名、大小、时间戳全明文可见——攻击者根本不用密码就能知道里面有什么
真正敏感的数据,加密只是第一步;文件名泄露、临时文件残留、内存中明文驻留,这些环节比 ZIP 密码本身更常被忽略。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











