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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:25:04