Good Carder
Professional
- Messages
- 261
- Reaction score
- 239
- Points
- 43
JA4 fingerprinting is a modern, passive TLS (Transport Layer Security) client fingerprinting technique that analyzes the ClientHello message during the initial TLS handshake to generate a stable, interpretable identifier for the connecting client (browser, script, bot, library, or tool). Developed by John Althouse and the team at FoxIO (the same creator behind JARM), JA4 was publicly released in September 2023 as a robust successor to the older JA3 standard from Salesforce (2017). By 2026, JA4 has become a widely adopted industry standard in anti-bot systems, WAFs (Web Application Firewalls), CDNs (e.g., Cloudflare, Akamai, AWS), threat intelligence platforms (VirusTotal, GreyNoise), and fraud detection tools.
It forms the core of the broader JA4+ suite, a collection of modular, human- and machine-readable network fingerprints covering TLS, HTTP, TCP, SSH, certificates, and latency. These fingerprints help detect bots, malware C2 (command-and-control) infrastructure, proxies/VPNs/tunnels, automated scripts, and anomalous clients without decrypting the encrypted traffic payload.
Major problems with JA3:
JA4 improvements address these directly:
These changes drastically reduce the number of unique fingerprints for legitimate clients (e.g., the same Chrome version across sessions) while making spoofing harder without matching the underlying TLS library/stack.
Example (common for modern Chrome on Linux/TCP, TLS 1.3):t13d1516h2_8daaf6152771_b186095e22b6
Part A: Metadata Prefix (Human-Readable, ~10-12 characters)
This segment encodes observable protocol details directly (no hashing here):
Full Part A example: t13d1516h2→ TLS 1.3 over TCP, with domain SNI, offering 15 ciphers and 16 extensions, preferring HTTP/2.
This prefix makes JA4 immediately interpretable: you can quickly see the protocol, version, and preferences without tools.
Part B: Sorted Cipher Suites Hash (12 hexadecimal characters)
This part is stable even if the client offers ciphers in different orders.
Part C: Sorted Extensions + Signature Algorithms Hash (12 hexadecimal characters)
Full calculation flow (passive, from the raw ClientHello packet):
The entire process is fast, passive, and works on encrypted traffic at the network edge (before any JavaScript or application data).
The modular design allows analysts to pivot on partial fingerprints (e.g., JA4_ac when only ciphers change) or combine multiple JA4+ components with IP reputation, behavior, and JA3 (for legacy).
Licensing: Core JA4 is under BSD 3-Clause (open and free). Many JA4+ components use the FoxIO License (permissive for most uses but with commercial restrictions).
Systems like IPQS incorporate similar TLS signals alongside their honeypot/abuse velocity data for higher-confidence proxy detection.
Limitations:
JA4+ represents a significant evolution in network fingerprinting, shifting detection toward interpretable, multi-layer signals that make isolated spoofing much harder while improving threat hunting.
If you'd like concrete examples of JA4 values for specific browsers/tools (Chrome, Firefox, Python requests, curl), code snippets for generating/analyzing them (e.g., in Python with Scapy or tlsfingerprint tools), details on a specific JA4+ component (JA4H, JA4T, etc.), or how it integrates with IPQS/Scamalytics in proxy evaluation, provide more details and I can expand! For the most authoritative source, refer to the FoxIO GitHub repository (github.com/FoxIO-LLC/ja4) and their technical documentation.
It forms the core of the broader JA4+ suite, a collection of modular, human- and machine-readable network fingerprints covering TLS, HTTP, TCP, SSH, certificates, and latency. These fingerprints help detect bots, malware C2 (command-and-control) infrastructure, proxies/VPNs/tunnels, automated scripts, and anomalous clients without decrypting the encrypted traffic payload.
Why JA4 Was Needed: Key Limitations of JA3
JA3 generates a single 32-character MD5 hash from the TLS ClientHello by concatenating (in appearance order):- TLS version
- Cipher suites
- Extensions
- Elliptic curves / supported groups
- Point formats (sometimes)
Major problems with JA3:
- Extremely sensitive to order of ciphers and extensions. Modern browsers (Chrome, Firefox) often randomize extension order for security and flexibility, or include GREASE values (random padding to prevent protocol ossification). This causes the same client to produce many different JA3 hashes.
- Opaque single hash: Hard to interpret or partially analyze (e.g., you can't easily see if only ciphers changed).
- Vulnerable to simple shuffling or minor modifications by attackers.
- Limited context: No built-in support for QUIC/HTTP/3, ALPN details, or SNI type.
- Higher collision risk with MD5.
JA4 improvements address these directly:
- Sorting/normalization: Ciphers and extensions are sorted (by ID/type) before hashing, making the fingerprint largely order-independent and stable against randomization or GREASE.
- More contextual metadata in a structured, human-readable format.
- Uses truncated SHA256 (first 12 hex characters) for better collision resistance while keeping fingerprints compact.
- Includes additional fields like ALPN preference, SNI type (domain vs. IP), and cipher/extension counts.
- Modular design: Easy to analyze partial fingerprints (e.g., just the "a+c" parts) for threat hunting when one segment changes.
These changes drastically reduce the number of unique fingerprints for legitimate clients (e.g., the same Chrome version across sessions) while making spoofing harder without matching the underlying TLS library/stack.
Detailed Structure of a JA4 Fingerprint
A standard JA4 fingerprint is a 36-character string in the format:a_b_c (three parts separated by underscores).Example (common for modern Chrome on Linux/TCP, TLS 1.3):t13d1516h2_8daaf6152771_b186095e22b6
Part A: Metadata Prefix (Human-Readable, ~10-12 characters)
This segment encodes observable protocol details directly (no hashing here):
- Protocol type (1 character): t = TLS over TCP (most common), q = QUIC (HTTP/3 over UDP), d = DTLS.
- TLS version (2 characters): 13 = TLS 1.3 (the highest supported, ignoring GREASE), 12 = TLS 1.2, etc.
- SNI type (1 character): d = domain name in Server Name Indication (standard for browsers), i = raw IP address only (no domain, more common in scripts/bots).
- Cipher count (2 digits): Number of cipher suites offered in the ClientHello (e.g., 15).
- Extension count (2 digits): Number of TLS extensions offered (e.g., 16).
- ALPN (abbreviated, often 2 characters): First/preferred Application-Layer Protocol Negotiation value (e.g., h2 for HTTP/2, h3 for HTTP/3, http/1.1).
Full Part A example: t13d1516h2→ TLS 1.3 over TCP, with domain SNI, offering 15 ciphers and 16 extensions, preferring HTTP/2.
This prefix makes JA4 immediately interpretable: you can quickly see the protocol, version, and preferences without tools.
Part B: Sorted Cipher Suites Hash (12 hexadecimal characters)
- Extract all cipher suites from the ClientHello.
- Sort them (typically numerically by ID).
- Ignore GREASE values.
- Concatenate the sorted list into a string.
- Compute SHA256 hash of that string.
- Truncate to the first 12 hexadecimal characters.
This part is stable even if the client offers ciphers in different orders.
Part C: Sorted Extensions + Signature Algorithms Hash (12 hexadecimal characters)
- Extract TLS extensions by type/ID.
- Sort extensions by type (not by appearance order).
- Concatenate with signature algorithms (sig algs kept in their original order of appearance).
- Ignore GREASE.
- Compute SHA256 hash.
- Truncate to the first 12 hexadecimal characters.
Full calculation flow (passive, from the raw ClientHello packet):
- Parse the handshake message.
- Normalize fields (sort ciphers/extensions where specified, strip GREASE).
- Build Part A from raw counts/flags/ALPN.
- Hash sorted ciphers → Part B.
- Hash sorted extensions + sig algs → Part C.
- Join with underscores.
The entire process is fast, passive, and works on encrypted traffic at the network edge (before any JavaScript or application data).
The JA4+ Suite: Modular Extensions
JA4 is only the TLS client fingerprint. JA4+ extends the same readable a_b_c (or similar) style to other layers for richer, correlated analysis:- JA4S (JA4Server): Fingerprints the ServerHello/response and session parameters (selected cipher, extensions, ALPN). Useful for identifying servers, load balancers, or proxy chains.
- JA4H (JA4HTTP): HTTP client fingerprinting — analyzes header order, cookies (sorted), User-Agent patterns, etc. Often has more segments for granularity.
- JA4L (JA4Latency) / JA4LS: Measures client-to-server (or server-to-client) latency/"light distance" — helps detect tunnels, VPNs, proxies, or unusual network paths.
- JA4T (JA4TCP) / JA4TS: TCP client/server stack fingerprinting (MSS, window size, TCP options) — identifies OS/device, hosting characteristics, or tunneling/VPN/proxy effects.
- JA4X (JA4X509): X.509 certificate fingerprinting (issuer, subject, extensions hashes) — detects how certificates are generated (malware C2, phishing sites).
- JA4SSH: SSH traffic fingerprinting.
- Others (in development or variants): JA4D (DHCP), scan-specific variants, etc.
The modular design allows analysts to pivot on partial fingerprints (e.g., JA4_ac when only ciphers change) or combine multiple JA4+ components with IP reputation, behavior, and JA3 (for legacy).
Licensing: Core JA4 is under BSD 3-Clause (open and free). Many JA4+ components use the FoxIO License (permissive for most uses but with commercial restrictions).
Usage in Proxy Detection and Anti-Bot Systems (2026 Context)
In the context of residential proxies, fraud prevention, and your earlier questions on IP fraud scores/proxy detection:- Correlation with IP/Behavior: A browser-like JA4 (e.g., matching Chrome) from a datacenter IP, high-fraud IPQS score, or mismatched latency (JA4L) is highly suspicious. Real residential/mobile users produce consistent JA4s tied to their TLS stack.
- Adoption: Widely integrated by Cloudflare (in Bot Management, WAF, and JA4 Signals for inter-request patterns), Akamai (edge detection), AWS WAF, DataDome, and others. It helps catch automation libraries (Python requests, curl defaults) that produce distinctive fingerprints unlike real browsers.
- Proxy/VPN/Tunnel Detection: JA4T (TCP) and JA4L (latency) reveal tunneling artifacts (altered stack or added jitter). Combined with IP reputation, it flags even "clean" residential proxies if the underlying client library doesn't perfectly match.
- Stability Advantage: Rotation of IPs or headers is less effective because the TLS stack (library used by the scraper/bot) often leaks the same JA4 unless deeply emulated (e.g., via uTLS or browser impersonation tools).
- Evasion Challenges: Sophisticated anti-detect browsers or tools (httpcloak, curl-impersonate, utls) attempt to match real JA4s, but subtle mismatches in counts, ALPN, or combined signals still trigger alerts. Overused or poorly maintained proxy setups often show anomalous patterns when fused with behavioral analysis.
Systems like IPQS incorporate similar TLS signals alongside their honeypot/abuse velocity data for higher-confidence proxy detection.
Strengths and Limitations
Strengths:- Stable against extension randomization and GREASE.
- Human-readable and modular — easier threat hunting and partial matching.
- Extensible across protocols (JA4+).
- Passive, fast, and privacy-friendly (no decryption needed).
- Reduces false positives compared to JA3 by providing context and granularity.
- Widely supported in 2026 tools (Zeek, ntop, Cloudflare, etc.).
Limitations:
- Still fingerprints the TLS library/stack, not the full browser/device (best combined with canvas/WebGL/audio fingerprints, behavioral biometrics, and IP checks).
- Popular browsers share similar JA4s across versions/OS; differentiation relies on counts, combinations, and correlations.
- Requires visibility into the handshake (edge/WAF level).
- Advanced emulation (custom TLS stacks) can mimic common fingerprints, though perfect spoofing is difficult and often introduces other detectable artifacts.
Practical Relevance to Residential Proxy Users and Testing
For evaluating "clean" residential proxies (e.g., Decodo, Oxylabs, SOAX, NodeMaven):- Prefer setups that produce common, real-browser JA4s (e.g., Chrome-like t13d...h2 patterns) consistently across sessions.
- Combine with anti-detect tools that spoof matching TLS stacks, realistic JA4H (HTTP), low IPQS fraud scores (<75), residential connection type, and natural behavioral patterns.
- Test rigorously: Use online JA4 checkers, proxy testers, or tools like Wireshark/Zeek to extract fingerprints. Check consistency under load and against strict platforms (Cloudflare, Akamai).
- Mismatched JA4 + residential IP can still raise flags if latency (JA4L) or TCP stack (JA4T) looks off.
JA4+ represents a significant evolution in network fingerprinting, shifting detection toward interpretable, multi-layer signals that make isolated spoofing much harder while improving threat hunting.
If you'd like concrete examples of JA4 values for specific browsers/tools (Chrome, Firefox, Python requests, curl), code snippets for generating/analyzing them (e.g., in Python with Scapy or tlsfingerprint tools), details on a specific JA4+ component (JA4H, JA4T, etc.), or how it integrates with IPQS/Scamalytics in proxy evaluation, provide more details and I can expand! For the most authoritative source, refer to the FoxIO GitHub repository (github.com/FoxIO-LLC/ja4) and their technical documentation.