当前位置: 首页 > news >正文

Python 与JA3 库的应用

Python JA3 库在网络安全、流量分析、爬虫开发等领域有广泛应用,以下是几个典型场景:

1. 识别网络中的设备类型

通过分析 TLS 握手的 JA3 指纹,可以识别客户端使用的浏览器、操作系统或设备类型。例如:

from ja3 import parse_ja3_string, generate_ja3_digest# 解析 JA3 字符串并生成指纹
ja3_string = "771,4865-4866-4867-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-51-57-47-53,0-23-65281-10-11-35-16-5-51-43-13-45-28-21,29-23-24-25-256-257,0"
digest = generate_ja3_digest(ja3_string)
print(f"JA3 指纹: {digest}")  # 输出 MD5 哈希值# 通过预定义指纹库匹配设备类型
device_mapping = {"297025c9d1b07a1f3f3c5a35f8d82d0": "Chrome 91 on Windows 10","d41d8cd98f00b204e9800998ecf8427e": "Firefox 89 on macOS",
}
device_type = device_mapping.get(digest, "Unknown")
print(f"设备类型: {device_type}")

2. 检测异常或恶意流量

将捕获的 JA3 指纹与已知恶意软件的指纹库比对,识别潜在威胁:

# 模拟从网络流量中提取 Client Hello 数据包并计算 JA3
def detect_malicious_traffic(packet):ja3_string = extract_ja3_from_packet(packet)  # 自定义函数解析数据包if not ja3_string:return Falsedigest = generate_ja3_digest(ja3_string)# 已知的恶意软件 JA3 指纹库malicious_ja3 = {"5a3c9d1b07a1f3f3c5a35f8d82d029": "Emotet 恶意软件","d8cd98f00b204e9800998ecf8427e4": "Mirai 僵尸网络",}if digest in malicious_ja3:print(f"⚠️ 检测到恶意流量! 指纹: {digest}, 类型: {malicious_ja3[digest]}")return Truereturn False

3. 反爬虫与反欺诈

网站可以通过分析 JA3 指纹识别爬虫或自动化工具:

from flask import requestdef block_bots():# 获取客户端 IP 和 JA3 指纹client_ip = request.remote_addrja3_fingerprint = request.headers.get("X-JA3-Fingerprint")  # 假设前端已发送# 检查是否为已知爬虫指纹bot_ja3_signatures = {"3a7d9e8c7b6a5f4e3d2c1b0a987654": "常见爬虫框架","1234567890abcdef1234567890abcdef": "可疑自动化工具",}if ja3_fingerprint in bot_ja3_signatures:return "访问被拒绝", 403return "欢迎访问", 200

4. 模拟特定浏览器行为

爬虫开发中,可以通过生成特定的 JA3 指纹伪装成真实浏览器:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context# 自定义 SSL 上下文,模拟 Chrome 的 JA3 指纹
class ChromeAdapter(HTTPAdapter):def init_poolmanager(self, *args, **kwargs):context = create_urllib3_context(ciphers="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384",ssl_version=ssl.PROTOCOL_TLSv1_3,  # 模拟 Chrome 支持的 TLS 版本)kwargs['ssl_context'] = contextreturn super(ChromeAdapter, self).init_poolmanager(*args, **kwargs)# 使用自定义适配器发送请求
session = requests.Session()
session.mount('https://', ChromeAdapter())
response = session.get('https://example.com')

5. 流量监控与分析

结合网络抓包工具(如 Scapy)实时分析 TLS 流量:

from scapy.all import *
from ja3 import *def packet_callback(packet):if packet.haslayer("TCP") and packet.haslayer("Raw"):payload = packet["Raw"].load# 检查是否为 TLS Client Hello 包if payload.startswith(b'\x16\x03'):try:ja3_dict = parse_tls_payload(payload)if ja3_dict:ja3_string = dict_to_ja3_string(ja3_dict)digest = generate_ja3_digest(ja3_string)print(f"源 IP: {packet['IP'].src}, JA3 指纹: {digest}")except Exception as e:pass# 开始抓包
sniff(filter="tcp port 443", prn=packet_callback, store=0)

6. 构建 JA3 指纹数据库

存储和管理不同客户端的 JA3 指纹,用于后续比对:

import sqlite3# 创建 JA3 指纹数据库
def create_ja3_db():conn = sqlite3.connect('ja3_fingerprints.db')c = conn.cursor()c.execute('''CREATE TABLE IF NOT EXISTS fingerprints(id INTEGER PRIMARY KEY, digest TEXT UNIQUE, device_type TEXT,first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')conn.commit()conn.close()# 添加新指纹
def add_fingerprint(digest, device_type):conn = sqlite3.connect('ja3_fingerprints.db')c = conn.cursor()try:c.execute("INSERT INTO fingerprints (digest, device_type) VALUES (?, ?)", (digest, device_type))conn.commit()except sqlite3.IntegrityError:# 指纹已存在,更新信息passconn.close()

总结

JA3 指纹技术通过分析 TLS 握手的特征参数,为网络通信提供了一种可靠的身份标识方式。在 Python 中,你可以利用 ja3 库结合网络抓包、Web 开发或安全工具,实现设备识别、恶意流量检测、反爬虫等多种功能。

http://www.lryc.cn/news/590348.html

相关文章:

  • 接口幂等性设计:用Redis避免接口重复请求
  • 前端技术之---应用国际化(vue-i18n)
  • 中医文化学习软件,传承国粹精华
  • Java全栈面试实录:从电商支付到AIGC的深度技术考察
  • 什么是数据仓库?数据库与数据仓库有什么关系?
  • 基于WebRTC构建应用的可复用模块
  • Ansible 查看PostgreSQL的版本
  • Rocky9安装Ansible
  • Android CameraX使用
  • PyCharm高效入门指南
  • 深度解析:如何在 Windows 系统中高效配置 Android MCP 服务
  • 【Unity】IL2CPP相关理论知识学习
  • CSS:transition语法
  • 网络安全初级(XSS-labs 1-8)
  • 【黑客与安全】windows平台的BurpSuite的安装
  • Opencv---cv::minMaxLoc函数
  • API Gateway HTTP API 控制客户端访问 IP 源
  • [硬件电路-28]:从简单到复杂:宇宙、芯片与虚拟世界的共通逻辑
  • Linux 716 数据库迁移
  • 汽车电子功能安全标准ISO26262解析(二)——需求部分
  • 网络编程(数据库)
  • ST表及数学归纳法
  • LLM OCR vs 传统 OCR:解锁文档处理的未来
  • 统一日志格式规范与 Filebeat+Logstash 实践落地
  • LeetCode 3201.找出有效子序列的最大长度 I:分类统计+贪心(一次遍历)
  • 跟着Carl学算法--回溯【2】
  • Python高级编程技巧探讨:装饰器、Patch与语法糖详解
  • Android动态获取当前应用占用的内存PSS,Java
  • x86版Ubuntu的容器中运行ARM版Ubuntu
  • 消息中间件(Kafka VS RocketMQ)