如何从HTTP响应判断下载的zip文件是否设有密码保护
如何通过HTTP响应内容判断ZIP文件是否设置密码保护
HTTP 响应头部不包含 ZIP 文件是否加密的相关元数据,仅扫描头部无法完成判断,必须读取响应体的二进制内容解析 ZIP 标准结构实现判断,具体操作如下:
操作步骤
- 不需要下载完整ZIP文件,仅请求响应体前128字节即可完成基础判断,大幅节省带宽
- 先校验ZIP文件签名:标准ZIP的本地文件头前4字节为固定值
0x504B0304(二进制为b'PK\x03\x04'),如果匹配则确认是有效ZIP格式 - 读取偏移量为6的2个字节(小端序),得到ZIP的通用位标记
- 检查通用位标记的最低位(第0位):如果该位为1,说明当前读取的压缩项是加密状态,绝大多数场景下只要有一个压缩项加密,整个ZIP包就属于密码保护的压缩包。如果需要确认全量文件是否都加密,遍历所有本地文件头逐个检查通用位标记即可
- AES加密的ZIP格式同样适配该规则,除了第0位置1外第6位也会被置1,不影响加密状态的判断
代码示例(Python)
import requests def is_zip_encrypted(url: str) -> bool: # 仅请求前128字节,足够读取核心头部信息 resp = requests.get(url, headers={"Range": "bytes=0-127"}, stream=True) content = resp.content # 校验是否为有效ZIP格式 if len(content) < 10 or content[:4] != b'PK\x03\x04': raise ValueError("目标文件不是有效ZIP格式") # 读取通用位标记,小端序解析 general_flag = int.from_bytes(content[6:8], byteorder="little") # 第0位为1代表加密 return (general_flag & 1) == 1
注意事项
- 分卷压缩ZIP、自解压EXE格式ZIP的头部结构有差异,需要适配对应格式的规则再判断
- 部分恶意修改过头部的ZIP包可能出现标记位和实际加密状态不符的情况,可多校验2-3个压缩项的通用位标记降低误判概率
内容的提问来源于stack exchange,提问作者Jérôme D'hulst
相关产品推荐
相关产品推荐

