JA4指纹了解

news/2025/3/17 8:48:58/文章来源:https://www.cnblogs.com/Galesaur-wcy/p/18233429

原文来自:https://mp.weixin.qq.com/s/Vo57J6l7WEt7L2bF_EAfbA

https://xz.aliyun.com/t/14054?time__1311=mqmx9DBG0QD%3DNGNDQiiQGk0G8UAfWRi8rD&alichlgref=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DiCpL-H6nh6F3hHSqKNxdmugqoq3VxxR00WtgPIO6P2n4QKqCs9QZmOV5veTiylJY%26wd%3D%26eqid%3Db1fbca78000a6958000000066660296f

开源链接是:

https://github.com/FoxIO-LLC/ja4

ja4概述文章是:

https://blog.foxio.io/ja4-network-fingerprinting-9376fe9ca637

在 TLS 连接开始时,客户端会发送一个 TLS 客户端 Hello 数据包,该数据包在加密通信之前以明文形式发送。此数据包由客户端应用程序生成,用于通知服务器它支持的密码以及其首选的通信方式。因此,TLS 客户端 Hello 数据包对于每个应用程序或其底层 TLS 库都是唯一的

无论流量是通过 TCP 还是QUIC传输,JA4 都会对客户端进行指纹识别。QUIC 是新 HTTP/3 标准使用的协议,它将 TLS 1.3 封装到 UDP 数据包中。由于 QUIC 是由 Google 开发的,如果某个组织大量使用 Google 产品,QUIC 可能占其网络流量的一半,因此捕获这一点非常重要。

JA4 还清楚地显示了 ALPN(应用层协议协商)。这表示应用程序在 TLS 协商完成后想要通信的协议。“h2”= HTTP/2,“h1”= HTTP/1.1,“dt”= DNS-over-TLS 等。可能的 ALPN 的完整列表可在此处找到。此处的“00”表示缺少 ALPN。请注意,ALPN“h2”的存在并不表示浏览器,因为许多 IoT 设备通过 HTTP/2 进行通信。但是,缺少 ALPN 可能表示客户端不是 Web 浏览器。

有关实施的更多技术细节以及原始(未散列)指纹的样子可以在github 页面上找到。

客户端发送其 TLS 客户端问候数据包后,服务器将使用其 TLS 服务器问候数据包进行响应。此数据包也以明文形式发送,根据服务器在客户端问候中选择的可用选项制定。这包括从可用选项列表中选择的一个密码,以及服务器希望设置的任何扩展。

因此,Server Hello 对于服务器应用程序和发送给它的 Client Hello 都是唯一的。不同的 Client Hello 可能会导致来自同一服务器的不同 Server Hello,因此也会导致不同的 JA4S。但是,相同的 Client Hello 始终会从该服务器应用程序产生相同的 Server Hello。例如,如果客户端发送 JA4=a_b_c 并且服务器以 JA4S=d_b_e 响应,则该服务器将始终以 d_b_e 响应 a_b_c。但是,如果另一个应用程序向同一服务器发送不同的客户端 hello,例如 JA4=x_y_z,则服务器将以不同的服务器 hello JA4S=t_y_v 响应。因此,对不同的应用程序来说,响应不同,但对同一应用程序来说,响应始终相同。我在我的JA3S 博客文章中对此进行了更详细的介绍。

 

JA3 的结构

TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats

相同与不同

相同

  1. 关注 TLS version
  2. 关注 cipher suite
  3. 关注 TLS extension

不同

JA4不关心的

  1. EllipticCurves
  2. EllipticCurvePointFormats

增加的

  1. IP Protocol,
    用于标记TCP 或 QUIC,用 t 和 q 表示

  2. TLS version
    不同于JA3,JA4会尝试在拓展中找到可支持的最高TLS version。
    指纹中代表字符串映射关系如下:

    $ssl_version = [0x0100 => "s1",0x0200 => "s2",0x0300 => "s3",0x0301 => "10",0x0302 => "11",0x0303 => "12",0x0304 => "13",0x00 => "00",];
  3. SNI (Server Name Indication)
    如果该拓展类型是域名(domain)记为 ‘d’,否则为’i’

  4. number of Cipher Suite

  5. number of Extensisions

  6. ALPN (Application-Layer Protocol Negotiation)
    取应用层协议协商拓展的第一个值,如果没有则用 00表示。
    具体算法如下

    // $tls_tls_handshake_extensions_alpn_str = ['h2','http/1.1']; h2 // $tls_tls_handshake_extensions_alpn_str = ['h3','http/1.1']; h3 // $tls_tls_handshake_extensions_alpn_str = ['http/1.1']; h1 // $tls_tls_handshake_extensions_alpn_str = ['http/1.0']; h0 $first_ALPN = current($tls_tls_handshake_extensions_alpn_str);if (strlen($first_ALPN) > 2) {$first_ALPN = substr($first_ALPN, 0, 1).substr($first_ALPN, -1, 1);} else {if (strlen($first_ALPN) > 127) {$first_ALPN = '99';}}
  7. Cipher Suite sroted
    相比JA3,JA4会将Cipher Suite进行排序,同样忽略 GREASE_TABEL类型的拓展

  8. Extensisions sroted
    相比JA3,JA4会将Extensisions进行排序,忽略 GREASE_TABEL类型的拓展,同时会再忽略JA4_a中的SNI,ALPN拓展

  9. Signature Algorithms,in the order they appear
    签名哈希算法(准确的说:拓展signature_algorithms(13),按出现的顺序。

    注意:在firefox中,会有拓展delegated_credential(34),也是一个提供Signature Algorithms的拓展,但计算JA4时应该忽略,具体看JA4 is including signature hash algorithms outside of the signature hash extension

常见的JA4

browerJA4mark
Chrome/121 t13d1516h2_8daaf6152771_02713d6af862  
Chrome/121 t13d1517h2_8daaf6152771_b1ff8ab2d16f no key
Chrome/121 13d1517h2_8daaf6152771_b0da82dd1658 with pre_share_key
Edg/122 t13d1516h2_8daaf6152771_02713d6af862  
Edg/122 t13d1517h2_8daaf6152771_b0da82dd1658 with pre_share_key
Firefox/123.0 13d1715h2_5b57614c22b0_5c2c66f702b0  
Firefox/123.0 13d1715h2_5b57614c22b0_7121afd63204 with pre_share_key
OPR/102 t13d1516h2_8daaf6152771_e5627efa2ab1  
OPR/102 t13d1516h2_8daaf6152771_9b887d9acb53 with pre_share_key
curl/7.68.0(ubuntu) t13d3113h2_e8f1e7e78f70_ce5650b735ce  
curl/8.4.0(win10) t12d2109h1_76e208dd3e22_7af1ed941c26  
iPhone OS 16_4_1 Safari 13d2014h2_a09f3c656075_14788d8d241b

 

 

什么是 QUIC

对于用户侧来说 QUIC 主要解决的是延迟的问题,这里我们主要说一下它和 TCP 的区别,简单来说,QUIC 进行了一次 “资源整合”,它把之前 HTTP/2、TLS、TCP 三者的优势集合起来

由于 QUIC 已经整合了这些内容,那么让它继续工作在 HTTP/2 下会出现许多问题,所以便催生了 HTTP/3,因为 QUIC 本身是要取代 TCP 的,所以它的传输层协议选择的是 UDP

 

 

JA4 计算原理

 

JA4 计算的是 Client Hello 报文,这里以官方给出的 Chrome JA4 指纹作为样例来进行演示JA4=t13d1516h2_8daaf6152771_02713d6af862,分成 JA4_a、JA4_b、JA4_c 三部分,计算的大原则是:按照规定顺序排列,忽略所有 GREASE 值

 

JA4_a

 

  • t:代表 TCP,此位置代表协议,还有q,代表 QUIC
  • 13:代表 TLS Version,这里代表 1.3,更多情况请见下表
    0x0304 = TLS 1.3 = “13”  
    0x0303 = TLS 1.2 = “12”  
    0x0302 = TLS 1.1 = “11”  
    0x0301 = TLS 1.0 = “10”  
    0x0300 = SSL 3.0 = “s3”  
    0x0200 = SSL 2.0 = “s2”  
    0x0100 = SSL 1.0 = “s1”
    Unknown = “00”

 

当我们仔细观察抓到的包时,可以发现有些包 WireShark 显示的是 TLS 1.2 但 JA4_a 中给出的却是 13,这并不是计算上的错误,是因为 JA4 计算时实际上读取的是数据包中的最高版本

 

出现 TLS Version 的部分一共有三个部分,上面出现 13 的原因就是在拓展(Extension)中有一项supported_version存在 TLS 1.3

 

 d:代表 Domain,这里的判断依据是 SNI Extensions,如果它存在则访问的是域名,不存在则说明访问的是 IP,此时为i

 

  • 15:代表 Cipher Suites 的数量,即便是单数也选择两位输出,例如 6 个就是06,最大值显示到99,忽略 GREASE 值
  • h2:代表 ALPN 值,选取第一个值,更多情况见官方文档,若报文中没有此项,则使用00

ALPN 主要负责应用层协议的协商,浏览器发送 Client Hello 报文时同时提供两种选项,若服务器支持 HTTP/2 则选择 h2,如果不支持,则从客户端支持的协议列表中选取一个它支持的协议,一般情况下选择 HTTP/1.1,体现在 JA4 指纹中就是h1

JA4_b

JA4_b 的计算根据是 Cipher Suite 值,使用,分隔不同字段(忽略 GREASE 值),但是会进行一个从小到大的排序,例如

1301,1302,1303,c02b,c02f,c02c,c030,cca9,cca8,c013,c014,009c,009d,002f,0035

按照从小到大的排序原则处理后,变为

002f,0035,009c,009d,1301,1302,1303,c013,c014,c02b,c02c,c02f,c030,cca8,cca9

对这串数据再进行 SHA256 加密,最终截取加密后字符串(小写)的前 12 位,组成 JA4_b

8daaf6152771e33e12d734f9bc6478ed341f16cde27aee3aa36f2402f2c53b44JA4_b = 8daaf6152771

这里排序的意义在于降低 “Cipher Stunting“ 的影响,关于什么是 “Cipher Stunting“ 请见【JA3 优化】部分,但是并不是说顺序不重要,这里是为了保真度所做的取舍,作者给出的原因是,在研究时发现大多数应用使用的是独特的 Cipher,而不是独特的 Cipher Suite 排序(It does but in our research we’ve found that applications and libraries choose a unique cipher list more than unique ordering)

JA4_c

JA4_c 的计算根据是 Extensions-Type 值,忽略 GREASE 值、SNI 扩展名(0000)、ALPN 扩展名(0010),这里使用的是 Extensions-Type 值的十六进制格式(不含0x

 

 

例如以下原始数据

001b,0000,0033,0010,4469,0017,002d,000d,0005,0023,0012,002b,ff01,000b,000a,0015

经过排序后(从小到大,同时去除00000010

0005,000a,000b,000d,0012,0015,0017,001b,0023,002b,002d,0033,4469,ff01

这里的排序目的和 JA4_b 类似,但主要对抗的是 Extension 随机化问题,例如 Google 在 2023 年更新了 Chrome,主要实现的就是随机化 Extension,避免开发者过于依赖此功能

 之后会再读取一个 Extension 中 signature_algorithms(签名算法) 的值,同样使用,作为分隔符

 

这里直接使用默认排序

0403,0804,0401,0503,0805,0501,0806,0601

最后将两串字符串合二为一,中间使用_分隔,处理后的 Extensions-Type 在前,未处理的 signature_algorithms 在后

0005,000a,000b,000d,0012,0015,0017,001b,0023,002b,002d,0033,4469,ff01_0403,0804,0401,0503,0805,0501,0806,0601

对这串数据再进行 SHA256 加密,最终截取加密后字符串(小写)的前 12 位,组成 JA4_c

e5627efa2ab19723084c1033a96c694a45826ab5a460d2d3fd5ffcfe97161c95JA4_c = e5627efa2ab1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720422.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsl安装教程

关于WLS的介绍1.什么是WSL?2 双系统的方法比较3 WSL1与WSL2比较 方法一: 传统手动安装1.1 windows系统版本查看及更新1.2 启用适用于Linux的Windwos子系统1.3 启用虚拟机功能1.4 重启电脑1.5 下载Linux内核更新包1.6 安装 Linux 分发版 方法二:命令符自动安装 (一行命令搞定…

Redis-4-持久化

Redis持久化 1.1 为什么 Redis是基于内存的,不保存的话,应用停止了后数据就不在了。 持久化的诉求,主要是解决以下问题: 防止数据丢失 Redis 是一个内存数据库,数据主要存储在内存中。如果没有持久化机制,一旦服务器宕机或重启,内存中的所有数据都会丢失。通过持久化,R…

Nacos配置

Nacos注册中心 目前开源的注册中心框架有很多,国内比较常见的有:Eureka:Netflix公司出品,目前被集成在SpringCloud当中,一般用于Java应用 Nacos:Alibaba公司出品,目前被集成在SpringCloudAlibaba中,一般用于Java应用 Consul:HashiCorp公司出品,目前集成在SpringCloud…

RK3308B WIFI

修改 WIFI 型号 ./device/rockchip/rk3308/rockchip_rk3308b_64bit_defconfig修改设备树 根节点 ---> wireless-wlanwireless-wlan {compatible = "wlan-platdata";rockchip,grf = <&grf>;pinctrl-names = "default";pinctrl-0 = <&wi…

WPF初学习(一)

控件模板 控件模板又包括ControlTemplate和ItemsPanelTemplate ControlTemplate(控件模板)不仅是用于来定义控件的外观、样式, 还可通过控件模板的触发器(ControlTemplate.Triggers)修改控件的行为、响应动画等。 样式定义了一些基础的样式, 背景颜色、字体颜色、边框大小、垂直…

一文搞懂Kafka,在项目里面更加得心应手的使用

1. kafka关键概念与术语 1.1 简单的例子说明kafka的使用场景 Apache kafka 是消息中间件的一种,我发现很多人不知道消息中间件是什么,在开始学习之前,我这边就先简单的解释一下什么是消息中间件,只是粗略的讲解,目前kafka已经可以做更多的事情。 举个例子:生产者消费者,…

回归模型的算法性能评价

一、概述 在一般形式的回归问题中,会得到系列的预测值,它们与真实值(ground truth)的比较表征了模型的预测能力,为有效量化这种能力,常见的性能评价指标有可解释方差(EVS)、平均绝对误差(MAE)、均方误差(MSE)、均方根误差(RMSE)、决定系数(R2)等。值得一提的是…

还在拼冗长的WhereIf吗?100行代码解放这个操作

通常我们在做一些数据过滤的操作的时候,经常需要做一些判断再进行是否要对其进行条件过滤。普通做法 最原始的做法我们是先通过If()判断是否需要进行数据过滤,然后再对数据源使用Where来过滤数据。 示例如下: if(!string.IsNullOrWhiteSpace(str)) {query = query.Where(a =…

“粘土风格”轻松拿捏,基于函数计算部署 ComfyUI实现AI生图

阿里云函数计算 FC 一键部署火爆全球工作流 AI 生图平台—— ComfyUI ,实现更高质量的图像生成,三步轻松完成“黏土”创意AI画作,晒图赢眼部按摩器等好礼! 活动地址:https://developer.aliyun.com/topic/june/fc?spm=a2c6h.29234099.J_6985717350.4.65997562KE82EH实验准…

医保“视界”大革新:可视化管理系统重塑就医体验

想象一下,在繁忙的医院里,患者和家属不再需要为了查询医保信息而四处奔波,也不再需要为了报销费用而焦头烂额。智慧医保可视化管理系统通过大数据、云计算等先进技术,将医保信息整合到一个平台上,实现了信息的实时更新和可视化展示在数字化浪潮席卷全球的今天,我们的生活…

数据安全之一 加解密介绍

一、场景信息系统不断发展,要求对于其中的数据安全性必须增加保护机制,否则数据泄露将会给企业带来不可估量的损失。基于此,数据的安全包括如下: 1)数据存储的安全存储包括:文件存储(包括含有敏感信息的图片)、数据库中的敏感数据的存储(比如:密码)、配置文件中的敏…

stm32系列--同一定时器双通道捕获

void TIM3_Cap_Init(u16 arr,u16 psc)//定时器3通道2输入捕获配置 {TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Pe…