JA3 和 JA4 都是用来给 TLS 客户端“画画像”的指纹技术,但 JA4 是专门为了解决 JA3 在现代浏览器环境下失效的问题而设计的升级版。核心区别在于:JA3 依赖字段的原始顺序,容易被随机化打乱;JA4 先排序再计算,因此更稳定,格式也更透明。
🎯 核心区别对比
抗随机化能力
- JA3:弱。它按字段出现的原始顺序计算哈希。当 Chrome 等浏览器开始随机化 TLS 扩展顺序后,同一个浏览器每次连接产生的 JA3 值都会变,导致指纹失效。
- JA4:强。它在计算哈希之前,会先对密码套件和扩展列表进行排序。这样一来,无论客户端如何打乱顺序,最终得到的 JA4 值都是稳定的。
指纹格式与可读性
- JA3:不透明。最终输出的是一个 32 位的 MD5 哈希值,人类无法直接阅读,必须查表才能知道它代表什么。
- JA4:结构化且部分可读。采用
a_b_c三段式格式。第一段(a)是明文元数据(如t13d1516h2表示 TLS 1.3、TCP、15 个密码套件、16 个扩展、ALPN 为 h2),后两段才是排序后的哈希值。分析师可以直接从指纹中读出关键信息。
协议覆盖与扩展性
- JA3:仅限 TLS。主要针对传统的 TLS over TCP 客户端握手。
- JA4:覆盖更广。作为 JA4+ 套件的基础,它不仅支持 TCP 上的 TLS,还支持 QUIC,并且有对应的 JA4S(服务器)、JA4H(HTTP)、JA4X(证书)等变体,能提供更丰富的上下文。
碰撞风险
- JA3:较高。不同的客户端库可能产生相同的 MD5 哈希,导致误判。
- JA4:较低。由于引入了更多维度的信息(如 ALPN、更细粒度的排序哈希),区分度更高,减少了不同软件被混为一谈的情况。
💡 一点补充视角
尽管 JA4 被普遍视为 JA3 的继任者,但也有开发者(如 curl_cffi 的文档)指出,JA4 将可读文本和不可读哈希混在一个字符串里的设计,在调试时反而不如 JA3 的“原始文本 + 单独哈希”来得清晰直接。不过,从防御和检测的稳定性角度来看,JA4 确实是目前更主流的选择。