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 False
digest = generate_ja3_digest(ja3_string)
# 已知的恶意软件 JA3 指纹库
malicious_ja3 = {
"5a3c9d1b07a1f3f3c5a35f8d82d029": "Emotet 恶意软件",
"d8cd98f00b204e9800998ecf8427e4": "Mirai 僵尸网络",
}
if digest in malicious_ja3:
print(f"⚠️ 检测到恶意流量! 指纹: {digest}, 类型: {malicious_ja3[digest]}")
return True
return False
3. 反爬虫与反欺诈
网站可以通过分析 JA3 指纹识别爬虫或自动化工具:
from flask import request
def block_bots():
# 获取客户端 IP 和 JA3 指纹
client_ip = request.remote_addr
ja3_fingerprint = request.headers.get("X-JA3-Fingerprint") # 假设前端已发送
# 检查是否为已知爬虫指纹
bot_ja3_signatures = {
"3a7d9e8c7b6a5f4e3d2c1b0a987654": "常见爬虫框架",
"1234567890abcdef1234567890abcdef": "可疑自动化工具",
}
if ja3_fingerprint in bot_ja3_signatures:
return "访问被拒绝", 403
return "欢迎访问", 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'] = context
return 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:
# 指纹已存在,更新信息
pass
conn.close()
总结
JA3 指纹技术通过分析 TLS 握手的特征参数,为网络通信提供了一种可靠的身份标识方式。在 Python 中,你可以利用 ja3
库结合网络抓包、Web 开发或安全工具,实现设备识别、恶意流量检测、反爬虫等多种功能。