为何Python ZipFile库设置ZipCrypto加密后未强制验证密码?
问题原因及解决办法
你遇到的问题核心是:Python标准库的zipfile.setpassword()方法根本不是用来创建加密压缩包的——它只是给当前ZipFile对象设置一个「默认解压密码」,方便后续用这个对象解压时不用重复输入,但完全不会在创建压缩包时对文件内容进行加密,所以解压自然不用输密码。
要创建真正带ZipCrypto加密的压缩包,你需要为每个要添加的文件单独创建ZipInfo对象,调用其encrypt()方法启用加密,再写入文件内容。
修改后的代码示例
import os import zipfile def zip_directory_with_password(directory_path, zip_file_path, password): # 创建带ZipCrypto加密的压缩包 with zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED, allowZip64=True) as zip_file: password_bytes = password.encode('utf-8') # 遍历目录添加文件和文件夹 for foldername, subfolders, filenames in os.walk(directory_path): # 添加文件 for filename in filenames: file_path = os.path.join(foldername, filename) arcname = os.path.relpath(file_path, directory_path) # 创建ZipInfo对象,设置加密 zip_info = zipfile.ZipInfo(arcname) zip_info.external_attr = os.stat(file_path).st_mode << 16 # 保留文件权限 zip_info.encrypt(password_bytes) # 读取文件内容并写入压缩包 with open(file_path, 'rb') as f: zip_file.writestr(zip_info, f.read()) print(f"已加密添加文件: {arcname}") # 添加空文件夹(如果需要) for subfolder in subfolders: folder_path = os.path.join(foldername, subfolder) arcname = os.path.relpath(folder_path, directory_path) + '/' # 文件夹要加斜杠标识 zip_info = zipfile.ZipInfo(arcname) zip_info.external_attr = os.stat(folder_path).st_mode << 16 zip_info.encrypt(password_bytes) zip_file.writestr(zip_info, b'') # 空文件夹写入空内容 print(f"已加密添加文件夹: {arcname}")
补充说明
- 上述代码中,每个文件/文件夹对应的
ZipInfo对象都调用了encrypt(),这才是真正启用ZipCrypto加密的关键步骤。 - 注意文件夹需要在
arcname末尾加上斜杠,否则解压软件可能不会识别为文件夹。 - ZipCrypto属于较弱的加密算法,安全性有限,如果需要更高安全性,建议改用AES加密,但这需要依赖第三方库(如
pyzipper)。
内容的提问来源于stack exchange,提问作者user1657666
相关产品推荐
相关产品推荐

