如何为ZipFile类型对象设置密码保护并生成base64格式字符串
带密码保护ZIP文件生成及Base64转换解决方案
问题根因
你当前使用的Python标准库zipfile仅支持读取解密加密压缩包,不支持写入加密,setpassword()方法仅作用于解压场景,因此你生成的zip实际为无密码保护的普通文件,解压时自然不会触发密码校验。
解决方案
推荐方案:使用pyzipper库生成AES加密压缩包
pyzipper是完全兼容zipfile接口的第三方库,原生支持写入AES加密的zip文件,跨平台可用。
- 安装依赖
pip install pyzipper
- 完整实现代码
import base64 from io import BytesIO import pyzipper data = BytesIO() # 创建AES加密的zip文件对象 with pyzipper.AESZipFile( data, mode='w', compression=pyzipper.ZIP_DEFLATED, encryption=pyzipper.WZ_AES ) as zip_obj: # 设置解压密码 zip_obj.setpassword(b'1234') # 写入需要打包的文件内容 zip_obj.writestr('test.csv', 'Hello, World') # 将内存中的zip内容转换为base64字符串 b64zip = base64.b64encode(data.getvalue()).decode('utf-8')
生成的压缩包支持所有主流解压工具,打开时会正常触发密码输入提示。
可选方案:调用系统原生zip命令
如果不想引入第三方依赖,且运行环境为Linux/macOS,可直接调用系统zip命令生成加密压缩包:
import subprocess import base64 from io import BytesIO # 先将待打包的内容写入临时文件,也可通过管道传递 with open('test.csv', 'w') as f: f.write('Hello, World') # 调用系统zip命令生成带密码的压缩包,-P参数指定密码 subprocess.run(['zip', '-P', '1234', 'output.zip', 'test.csv'], check=True) # 读取压缩包内容转base64 with open('output.zip', 'rb') as f: b64zip = base64.b64encode(f.read()).decode('utf-8')
注意:该方案生成的是Zip 2.0标准加密压缩包,安全性低于AES加密,且Windows环境需要提前安装zip命令工具才可使用。
内容的提问来源于stack exchange,提问作者ang
相关产品推荐
相关产品推荐

