长度泄露与填充
TLS 加密的是内容,不是长度:记录的分片数量与大小、握手消息尺寸仍然可见,攻击者可据此做页面指纹、推断用户在看什么(长度分析类研究的共同前提)。缓解手段是在加密记录内填充无关数据:TLS 1.3 允许应用数据记录的内层明文携带零填充,接收端按长度字段去除;HTTP/2 的 DATA 帧另有 padding 字段,可对响应尺寸做随机化。全局随机填充会让带宽明显上升,实际部署通常只对敏感页面按需启用。
基本信息
| 泄露面 | 记录条数与大小、握手消息尺寸(如证书链长度) |
|---|---|
| TLS 1.3 填充 | 内层明文可含零填充,整体加密后由接收端按长度字段剥离 |
| HTTP/2 填充 | DATA 帧支持 padding 字段,可随机化响应尺寸 |
| 成本 | 额外带宽与少量 CPU;按敏感页面选择性启用 |
| 前提 | 填充必须在加密之前完成,否则长度依旧可见 |
典型使用场景
- 敏感页面防护:登录、检索结果、医疗与金融类页面防长度指纹。
- 抓包分析:统计记录长度分布,判断业务是否存在明显长度特征。
- 协议选型:评估 HTTP/2 填充帧与 TLS 内填充哪种更贴合现有栈。
- 合规说明:向评审方解释为何不能对所有流量无差别填充。
- 安全研究复现:验证某类长度分析攻击在自有业务上是否可行。
观察记录长度分布
观察记录长度分布
# 有抓包文件时统计 application_data 记录长度分布
# tshark -r tls.pcap -Y 'tls.record.content_type == 23' -T fields -e tls.record.length | sort -n | uniq -c | tail
# 对比同一业务在填充前后的分布是否被抹平
# tshark -r padded.pcap -Y 'tls.record.content_type == 23' -T fields -e tls.record.length | sort -n | uniq -c | tail泄露面与缓解手段
| 泄露点 | 能推断出什么 | 可行缓解 |
|---|---|---|
| 响应记录长度 | 页面类型、数据条目多少 | 内层填充或按块补齐长度 |
| 请求记录长度 | 输入长度(如密码位数) | 对提交内容做定长化处理 |
| 握手证书链长度 | 是否使用了某类特定证书 | 压缩证书链,减少特征差异 |
| 记录条数 | 响应分片的节奏 | 合并分片,减少可区分边界 |
长度分析属于信息收集手段,防护重点在敏感页面的尺寸分布上。普通静态资源页填充意义不大,反而拖慢首屏。