首页/新闻资讯/正文详情

fq TLS 解码器测试数据集全解析:从 dump.pcapng 到按密码套件拆分的回归测试体系

发布时间:2026/9/24 14:56:34 来源:云帆数科 栏目:资讯中心
fq TLS 解码器测试数据集全解析:从 dump.pcapng 到按密码套件拆分的回归测试体系
fq TLS 解码器测试数据集全解析从 dump.pcapng 到按密码套件拆分的回归测试体系【免费下载链接】fqfq - jq for binary formats. Tool, language and decoders for working with binary formats.项目地址: https://gitcode.com/gh_mirrors/fq/fq本篇技术指南围绕 fqjq for binary formatsTLS 解码器的测试数据集展开核心素材是 format/tls/testdata/README.md 中记录的 dump.pcapng 来源、73 个 TLS 连接样本以及 split.jq 按密码套件拆分生成回归测试样本的完整流程。读完本文你将掌握 fq 如何组织 TLS 解码与解密的测试语料、NSS keylog 在解密流程中的关键作用以及如何基于源码复现这一测试数据集的生成与验证过程。一、测试数据集的整体布局fq 的 TLS 解码器位于 format/tls/其测试数据集中在 format/tls/testdata/核心文件包括文件/目录作用README.md测试数据来源与生成说明dump.pcapng / dump.pcapng.keylog主测试抓包73 个 TLS 连接及对应 NSS keylogdump-broken.pcapng / dump-broken.pcapng.keylog损坏的 SSLv3 边界用例抓包及其 keylogsplit.jq将 dump.pcapng 按 TCP 连接拆分的 jq 脚本to_tar.jq将拆分结果打包为 tar 的辅助 jq 脚本ja3.jq计算 TLS 客户端 JA3 指纹的 jq 脚本ciphers/按密码套件命名的 73 组 pcap fqtest 回归测试对testtls.com.http1.1-tls1.2.pcap(.keylog)单连接的 HTTP over TLS 解密示例help_tls.fqtest、ja3.fqtestfq 帮助信息与 JA3 查询的回归断言README 用三句话交代了数据集的核心事实dump.pcapng 与 dump-broken.pcapng 由 Peter Wu 创建来源于 Wireshark 的一个 bug 报告bugzilla id 9144dump.pcapng 包含 73 个使用不同密码套件的 TLS 连接通过 split.jq 被拆分为每个连接一个 pcap并以连接所用的密码套件命名dump-broken.pcapng 是一个损坏的 SSL v3 抓包使用了扩展其 keylog 尚未投入使用。这套数据集的目的是为 TLS 解码器提供覆盖不同密码套件、不同版本含异常 SSLv3的真实抓包样本既用于人工查询验证也作为 fqtest 回归测试的语料。二、dump.pcapng覆盖 73 种密码套件的单一抓包dump.pcapng 是整套数据的源头它被刻意设计为一次握手一个连接、一个连接一种密码套件从而让按密码套件拆分成为可能。与其配套的 dump.pcapng.keylog 记录了每个连接客户端随机数与主密钥的对应关系供解密流程使用。拆分后生成的样本落在 format/tls/testdata/ciphers/ 目录每个样本由CipherSuiteName.pcap和同名.pcap.fqtest组成。将该目录下的 pcap 数量与 README 声明的 73 个连接逐一对照TLS_DHE_DSS_WITH_*12 个DES40_EXPORT、3DES、AES-128-CBC、AES-128-CBC-SHA256、AES-128-GCM、AES-256-CBC、AES-256-CBC-SHA256、AES-256-GCM、CAMELLIA-128、CAMELLIA-256、DES-CBC、SEEDTLS_DHE_RSA_WITH_*12 个同上的 12 种算法组合TLS_ECDHE_ECDSA_WITH_*8 个3DES、AES-128-CBC、AES-128-CBC-SHA256、AES-128-GCM、AES-256-CBC、AES-256-CBC-SHA384、AES-256-GCM、RC4-128-SHATLS_ECDHE_RSA_WITH_*8 个TLS_ECDH_ECDSA_WITH_*8 个TLS_ECDH_RSA_WITH_*8 个TLS_RSA_WITH_*14 个3DES、AES-128-CBC、AES-128-CBC-SHA256、AES-128-GCM、AES-256-CBC、AES-256-CBC-SHA256、AES-256-GCM、CAMELLIA-128、CAMELLIA-256、DES-CBC、IDEA、RC4-128-MD5、RC4-128-SHA、SEEDTLS_RSA_EXPORT_WITH_*3 个DES40-CBC-SHA、RC2-CBC-40-MD5、RC4-40-MD5。合计恰好 73 个与 README 中的73 tls connections完全吻合印证了拆分脚本与数据集声明的一致性。三、split.jq按 TCP 连接拆分并命名样本的源码解析拆分工作由 split.jq 完成其文件头注释保留了原始生成命令# go run . -L format/tls/testdata -o keylogformat/tls/testdata/dump.pcapng.keylog \ # -f format/tls/testdata/split.jq format/tls/testdata/dump.pcapng \ # | tar -C format/tls/testdata/ciphers -x整条流水线是用 fq 以keylog选项加载 dump.pcapng.keylog运行 split.jq 处理 dump.pcapng输出一个 tar 归档再由tar -x解压到 ciphers/ 目录。脚本按三个层次完成拆分1. 提取 TCP 四元组作为连接标识def ipv4_tcp_tuple: ( . as {source_ip: $sip, destination_ip: $dip} | grep_by(formattcp_segment) as {source_port: $sport, destination_port: $dport} | [[$sip,$sport],[$dip,$dport]] | sort );ipv4_tcp_tuple先从 ipv4_packet 解码值中取出源/目的 IP再通过grep_by(formattcp_segment)找到该包内的 TCP 段以取得端口最终将(src_ip,src_port)与(dst_ip,dst_port)排序得到与方向无关的连接标识。2. 汇总去重得到全部连接集合def connetions_tuples: ( [ grep_by(formatipv4_packet) | ipv4_tcp_tuple ] | unique[] );对 pcapng 中所有 ipv4_packet 计算 tuple 并unique去重得到 dump.pcapng 内全部独立 TCP 连接——即 73 个连接。3. 按连接过滤报文并重打包为单个 pcap( $packets | connetions_tuples as $tuple | to_ipv4_pcap( ( $packets | grep_by(formatipv4_packet) | select($tuple ipv4_tcp_tuple) ) ) | . as $pcap_bytes | pcap | .tcp_connections[0].server.stream.records[0].message as {$cipher_suit} | {filename: \($cipher_suit).pcap, data: $pcap_bytes} )对每个连接从原始 pcapng 的 blocks 中筛出四元组匹配的 ipv4_packet交给to_ipv4_pcap重打包。to_ipv4_pcap的注释直白地标注为 TODO: hack——它手工拼接一个经典 pcap 文件头magicd4c3b2a1、版本 2.4、snaplen 0xffff与 per-packet 记录头构造出旧式 pcap 字节流。随后对打包结果再次调用pcap格式解码从该连接第一个 TLS 记录的 ServerHello 中读出cipher_suit解码器源码中由 tls.go 的cipherNames将其映射为套件名字符串如TLS_RSA_WITH_AES_128_CBC_SHA最终以\($cipher_suit).pcap作为文件名。最后的封装调用 to_tar.jq 将{filename, data}序列打包为 tar它手工构造 ustar 头部name/mode/uid/gid/size/mtime/checksum/typeflag/magic 等 512 字节字段计算头部校验和并对每个文件与结尾补齐 512 字节对齐最后追加 1024 字节的 end-of-archive 标记。这正是tar -x能直接解压的原因。四、NSS keylog 与解密dump.pcapng.keylog 的作用拆分样本之所以能展示明文 HTTP 内容是因为解码时提供了 NSS keylog。其解析实现在 format/tls/keylog/keylog.go格式为每行Label 空格 ClientRandom 空格 Secret三条字段以#开头为注释RSARSA 预主密钥对应 RSA key exchangeCLIENT_RANDOMTLS 1.0-1.2 场景下的主密钥master secret这也是 TLS 1.2 及更早版本解密依赖的标签CLIENT_EARLY_TRAFFIC_SECRET/CLIENT_HANDSHAKE_TRAFFIC_SECRET/SERVER_HANDSHAKE_TRAFFIC_SECRET/CLIENT_TRAFFIC_SECRET_0/SERVER_TRAFFIC_SECRET_0/EARLY_EXPORTER_SECRET/EXPORTER_SECRETTLS 1.3 的流量密钥标签。解析器将 client random 校验为 32 字节并以(Label, ClientRandom)为键构建查找表重复的 client random 会被视为错误。用户可通过keylog解码选项-o keylogpath表示从文件读取或-o keylog内容直接传入字符串注入这些密钥。解密发生在客户端解码完成的PostFn回调中见 tls.go 的decodeTLSPostEncryptedRecords解码器先用keylog.Lookup(keylog.ClientRandom, clientCtx.random)以客户端随机数查回主密钥再构造tlsdecrypt.Decryptor携带IsClient、协议版本、协商出的密码套件、主密钥、客户端/服务端随机数对握手之后每个被标记为encrypted_data的记录逐条解密。解密后的明文按记录类型重建message其中 application_data 会被汇总为 TLS 应用数据流stream若协商了 deflate 压缩format/tls/README.md 的开发笔记指出 TLS 的 deflate 实际是 zlib 格式还会经过 rezlib 解压后再解码。解密实现位于 format/tls/tlsdecrypt/其 README 说明这是对 Go 标准库 crypto/tls 与 zcrypto 的适配。一个典型的解密示例来自 TLS_RSA_WITH_AES_128_CBC_SHA.pcap.fqtest$ fq -o keylogall.keylog .tcp_connections[0] | dv TLS_RSA_WITH_AES_128_CBC_SHA.pcap输出树中可以清楚看到客户端握手的 ClientHello 声明TLS_RSA_WITH_AES_128_CBC_SHA与TLS_EMPTY_RENEGOTIATION_INFO_SCSV支持 deflate/null 两种压缩client_key_exchange中的encrypted_premaster是 128 字节 RSA 密文随后的finished与application_data记录在树中先呈现为encrypted_data接着在同一记录下以message展示解密后的内容——客户端明文是GET / HTTP/1.0服务端明文是HTTP/1.0 200 ok最后的 alert 解密为level: warning、description: close_notify完整还原了一次 TLS 1.2 会话。每个样本对应的 all.keylog 聚合了该 pcap 所有连接所需的密钥。五、dump-broken.pcapngSSLv3 边界用例README 特别指出 dump-broken.pcapng 是一个损坏的 SSL v3抓包且使用了扩展。这是一个有意的异常样本SSLv3 规范本身不定义扩展extensions 从 TLS 1.0/1.2 才正式引入因此该抓包违反协议常规用于验证解码器的容错行为。在 tls.go 的握手解码中可以看到对应处理——代码注释写明 SSL v3 should have no extensions but we decode if there are bytesSSL v3 不应有扩展但只要有剩余字节就继续按扩展解码说明解码器对这类畸形报文采取宽松策略版本仍映射为ssl0x0300见versionNames并尝试解析残留的扩展字段。该用例还附带 dump-broken.pcapng.keylog但 README 注明not used yet——即 keylog 已随样本保留但当前尚未在自动化测试中启用从 dump-broken.pcapng.fqtest 的存在看pcapng 本身的解码已纳入回归只是解密路径未覆盖这为后续扩展测试留出了空间。六、配套工具ja3.jq 客户端指纹计算数据集目录中的 ja3.jq 演示了如何基于 TLS 解码结果计算 JA3 客户端指纹。它从首个 ClientHello 记录中取出version、cipher_suits、extensions的 type 列表、supported_groups与ec_point_formats按 JA3 规范拼出TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats字符串过滤掉 16 个 GREASE 保留值再经 MD5 得到摘要$ fq -L . include ja3; pcap_ja3 testtls.com.http1.1-tls1.2.pcapja3.fqtest 中记录了预期输出例如{ client_ip: 192.168.1.230, client_port: 61925, ja3: 771,49196-49200-159-52393-52392-52394-49195-49199-158-49188-49192-107-49187-49191-103-49162-49172-57-49161-49171-51-157-156-61-60-53-47-255,0-11-10-16-22-23-13,29-23-30-25-24,0-1-2, ja3_digest: 87b9bfc7da97115ed2276737b09f8d74, server_ip: 116.203.76.237, server_port: 443 }该脚本同时支持 pcap 与 pcapng 输入内部通过format pcap/format pcapng分支可作为分析真实 TLS 流量的现成查询模板。七、回归测试机制fqtest 与测试覆盖数据集中每个 pcap 都伴随同名.fqtest文件构成 fq 的回归测试体系fqtest 的通用机制见 pkg/fqtest/fqtest.go测试入口在 format/fqtest_test.go。其工作方式是fqtest 文件首行写有要执行的 fq 命令如$ fq -o keylogall.keylog .tcp_connections[0] | dv ...运行后将其标准输出与文件其余部分逐字符比对任何解码行为变化都会导致测试失败。这一设计让 ciphers/ 目录中的 73 个样本同时承担三重职责解码正确性的回归基线、keylog 解密路径的持续验证每个样本的dv输出都展示了解密前后的字段、以及跨密码套件覆盖率的直观清单。加上 help_tls.fqtest校验fq -h tls帮助文本其中列出了keylog选项与全部支持解密的密码套件、ja3.fqtest 与 dump-broken.pcapng.fqtest异常 SSLv3 解码TLS 模块的测试语料覆盖了解码、解密、指纹计算与异常输入四条路径。八、复现与扩展如何重新生成或扩充数据集按照 split.jq 头部的命令即可在仓库内复现整个拆分流程go run . -L format/tls/testdata -o keylogformat/tls/testdata/dump.pcapng.keylog \ -f format/tls/testdata/split.jq format/tls/testdata/dump.pcapng \ | tar -C format/tls/testdata/ciphers -x若想扩充数据集例如新增密码套件覆盖可参考 format/tls/README.md 记录的抓取方法用tcpdump -i iface -w file.pcap抓包用支持SSLKEYLOGFILE的 curlSSLKEYLOGFILEfile.keylog curl --tls-max 1.2 https://host/path发起 HTTPS 请求并导出密钥然后通过 tls.md 中的查询命令验证解密结果# 解码并展示整棵解析树 $ fq -o keylogtraffic.keylog d traffic.pcap # 导出解密后的服务端响应第一个 TCP 连接 $ fq -o keylogtraffic.keylog .tcp_connections[0].server.stream.stream | tobytes traffic.pcap data # 导出第一条 TLS 连接的应用数据 $ fq -o keylogtraffic.keylog first(grep_by(.server.stream | format tls)).server.stream.stream | tobytes traffic.pcap data需要说明的适用前提当前解码器对 TLS 1.3 与 PSK/anon 等部分套件的支持尚不完整tls.go 的 TODO 中列有 TLS 1.3、重协商、ALPN 等未完成项解密能力以fq -h tls输出中列出的密码套件清单为准涵盖 DHE/ECDHE/ECDH/RSA/PSK 等主流 TLS 1.0-1.2 套件。这份 README 虽短却精确记录了 fq TLS 测试语料从抓包、拆分、命名到回归验证的完整链路是理解 fq 如何以jq for binary formats的方式对 TLS 这类有状态、加密、跨连接协议进行解码与验证的绝佳入口。【免费下载链接】fqfq - jq for binary formats. Tool, language and decoders for working with binary formats.项目地址: https://gitcode.com/gh_mirrors/fq/fq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

长时间运行的任务为什么会失去连续性:用 learn-harness-engineering 第 05 讲的连续性工件(handoff)方案为 Agent 构建跨会话记忆
长时间运行的任务为什么会失去连续性:用 learn-harness-engineering 第 05 讲的连续性工件(handoff)方案为 Agent 构建跨会话记忆

【免费下载链接】learn-harness-engineering Harness engineering beginner tutorial, from 0 to 1 项目地址: https://gitcode.com/gh_mirrors/le/learn-harness-engineering 点击查看 免费下载 本篇文章以 learn-harness-engineering 仓库中《Лекция 05. С… · 2026/9/24 14:56:34

NocoBase 开发环境搭建:如何快速搭建一套可用的无代码业务系统
NocoBase 开发环境搭建:如何快速搭建一套可用的无代码业务系统

NocoBase 开发环境搭建:如何快速搭建一套可用的无代码业务系统 【免费下载链接】nocobase NocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-… · 2026/9/24 14:56:31

西红柿土豆炖牛肉详解:从用料配比到 RAG 知识库中的结构化菜谱
西红柿土豆炖牛肉详解:从用料配比到 RAG 知识库中的结构化菜谱

教程人工智能大模型RAG 【免费下载链接】all-in-rag 🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/ 项目地址: https://gitcode.com/datawhalechina/all-in-ra… · 2026/9/24 14:56:24

RunAnywhere Web SDK 架构与实战指南:基于 WASM + WebGPU 的浏览器端本地 AI 运行方案
RunAnywhere Web SDK 架构与实战指南:基于 WASM + WebGPU 的浏览器端本地 AI 运行方案

AI模型推理服务推理引擎本地部署多模态 【免费下载链接】runanywhere-sdks Production ready toolkit to run AI locally 项目地址: https://gitcode.com/gh_mirrors/ru/runanywhere-sdks 点击查看 免费下载 导读 RunAnywhere Web SDK 是 RunAnywhere 项目在浏览器… · 2026/9/24 15:29:31

ESP01 固件烧录全攻略:Flash Download Tool 从入门到精通
ESP01 固件烧录全攻略:Flash Download Tool 从入门到精通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:29:31

X79平台M.2 NVMe固态升级指南:从接口原理到性能实测
X79平台M.2 NVMe固态升级指南:从接口原理到性能实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:29:31

OpenLayers v9.2.3 补丁版解析:Canvas 渲染器 execute() 参数修复与文本叠加 Worker 调用链
OpenLayers v9.2.3 补丁版解析:Canvas 渲染器 execute() 参数修复与文本叠加 Worker 调用链

前端GIS数据可视化 【免费下载链接】openlayers OpenLayers 项目地址: https://gitcode.com/gh_mirrors/op/openlayers 点击查看 免费下载 导读 OpenLayers v9.2.3 是一个针对 Canvas 矢量渲染器内部接口的补丁发布,核心修复点是 execute() 方法参数不… · 2026/9/24 15:29:24

dateparse4cj API完全指南:8大解析方法怎么选?一文讲透日期解析所有姿势
dateparse4cj API完全指南:8大解析方法怎么选?一文讲透日期解析所有姿势

dateparse4cj API完全指南:8大解析方法怎么选?一文讲透日期解析所有姿势 【免费下载链接】dateparse4cj dateparse4cj 是一个基于 cangjie 标准库实现的高性能、功能丰富的日期时间解析库。它能够自动识别并解析多种格式的日期字符串,支持全球… · 2026/9/24 15:29:24

TEN Framework 实时语音助手 main_python 扩展:会话编排中枢的架构与实现解析
TEN Framework 实时语音助手 main_python 扩展:会话编排中枢的架构与实现解析

人工智能AI Agent多模态语音AI 应用 【免费下载链接】ten-framework Open-source framework for conversational voice AI agents 项目地址: https://gitcode.com/TEN-framework/ten-framework 点击查看 免费下载 导读 main_python 是 TEN Framework 实时语音助手… · 2026/9/24 15:29:18

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码