什么是 JA3 / JA4 指纹?
AJA3 / JA4 指纹 是一种从 TLS 客户端握手过程中派生出的短哈希值,用于识别建立连接的 TLS 库、浏览器或机器人,而无需依赖 IP 地址。 JA3由Salesforce于2017年推出,采用MD5算法;JA4是其现代化的FoxIO继任者,采用SHA-256算法,并对输入字段进行排序以防范规避攻击。机器人防御系统、反欺诈平台和访问控制系统利用这些哈希值,在协议层面上标记可疑客户端。
JA3 和 JA4 指纹识别的工作原理
JA3 将 TLS ClientHello 消息中的五个字段(TLS 版本、密码套件、扩展、椭圆曲线和 EC 点格式)拼接在一起,然后对其进行 MD5 哈希运算,生成一个 32 个字符的字符串(Fingerprint.com - TLS 指纹识别(2024年)。每个发送相同组合的客户端,无论其IP地址如何,都会生成相同的哈希值。这种一致性使安全系统能够按客户端类型而非来源对流量进行分组。
JA4 解决了 JA3 中的一个核心缺陷:扩展顺序。客户端可以通过调整 TLS 扩展的顺序,在提供相同功能的同时生成不同的 JA3 哈希值。JA4 在进行哈希运算前会对密码套件和扩展进行排序,从而消除了这一规避途径。输出结果是一个由三部分组成的字符串(例如,t13d1516h2_8daaf6152771_b186095e22b6),由一个易于人类阅读的前缀以及两个各12个字符的截断SHA-256哈希值组成(FoxIO-LLC JA4 规范(2025年)。JA4 还会过滤掉 GREASE 值——这些值是由浏览器为兼容性测试而插入的,若不进行过滤,会增加数据噪声。
FoxIO JA4+ 套件将这一概念扩展到了 TLS 之外。JA4H 涵盖 HTTP 请求头,JA4S 涵盖服务器端的 TLS 响应,而 JA4L 则用于测量网络延迟模式。通过组合子指纹,检测准确率得到了显著提升。
使用场景
机器人防范系统使用 JA3/JA4 哈希值来识别爬虫库(例如 Python 的requests,httpx,或无头 Chromium 构建版本),即使这些客户端会轮换 IP 地址或伪造用户代理字符串。住宅 IP 地址与 Python TLS 堆栈结合使用时,仍会产生可识别的非浏览器指纹。
访问控制平台将JA3/JA4与其他信号(用户代理、HTTP/2帧顺序、Canvas哈希)结合,构建出一个综合设备特征模型。声明的浏览器与TLS指纹之间的不匹配,是一种值得深入调查的强烈异常信号。
安全研究人员和红队则反向利用这些特征:分析目标服务器期望使用的 TLS 库,然后将客户端配置为与之匹配。诸如curl-impersonate 以及utls 该库对 TLS 堆栈进行了修补,以生成与 Chrome 匹配的握手过程。
当通过住宅代理大规模访问网站时,客户端的 JA4 指纹仍需与真实浏览器相匹配,否则 IP 声誉优势将不复存在。将真实的住宅 IP(例如 Massive 网络中的 IP)与符合浏览器标准的 TLS 相结合,是行业标准做法。
常见问题解答
JA3 指纹是五个 TLS ClientHello 字段(TLS 版本、密码套件、扩展、椭圆曲线、EC 点格式)的 32 个字符长的 MD5 哈希值,由 Salesforce 于 2017 年引入(Fingerprint.com - TLS 指纹识别(2024年)。它使网络安全工具能够识别客户端的 TLS 库,而无需依赖 IP 地址。
JA4 在哈希运算前会对字段进行排序,这会破坏扩展顺序随机化,并且使用 SHA-256 代替 MD5。结果是生成了一段易于人类阅读的a_b_c 字符串,而不是不透明的十六进制哈希值(FoxIO-LLC JA4 规范(2025年)。JA4 还忽略了 GREASE 值,从而使指纹在浏览器更新后更加稳定。
是的。像这样的图书馆,例如curl-impersonate 以及utls 对 TLS 堆栈进行修补,以精确模拟目标浏览器的 ClientHello。反机器人防御机制通过将 JA4 与 HTTP/2 帧顺序、时间模式以及画布指纹等额外信号相结合,构建出更难伪造的复合特征,从而应对这一攻击。
轮换 IP 地址并不会改变底层 HTTP 客户端的 TLS 指纹。如果爬虫运行在家庭 IP 上,但使用 Python 的默认 TLS 堆栈,它仍然会与已知的机器人指纹匹配。为了避免被检测到,除了轮换 IP 地址外,还需要进行与浏览器一致的 TLS 模拟。