Use our free JA3 fingerprint lookup tool to instantly detect your TLS Client Hello fingerprint. See your JA3 hash, cipher suites, SSL extensions, and TLS version — the invisible cryptographic signature that websites use for bot detection and browser fingerprint testing. Unlike your IP address, your JA3 fingerprint stays the same even behind a VPN.
Quick Answer: What Is a JA3 Fingerprint?
A JA3 fingerprint is a unique MD5 hash generated from your browser's TLS handshake parameters — specifically the TLS version, cipher suites, SSL extensions, elliptic curves, and point formats sent in the Client Hello packet. Created by Salesforce researchers in 2017, JA3 gives every browser and application a consistent TLS client identity that WAF systems like Cloudflare and Akamai use for bot detection and malicious traffic identification.
TLS Version Detected
TLS 1.2 (771)
Cipher Suites Offered
11 ciphers
Extensions Count
15 extensions
Your JA3 MD5 Hash
5c38df56e8eb8728afac571bdcd847e1
Raw JA3 String
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-21,29-23-24,0
Cipher Suites
4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172
Elliptic Curves
29-23-24
Summary
Your browser uses TLS 1.2 and offers 11 cipher suites with 15 SSL extensions. Your JA3 hash (5c38df56e8eb8728afac571bdcd847e1) is a persistent TLS client identity that remains the same even when using a VPN. For a complete privacy audit, check your Browser Leak Test and WebRTC Leak Detector.

Cybersecurity Threat Researcher
Jessica specializes in TLS fingerprinting, browser forensics, and bot detection analysis. She helps security teams identify malicious traffic patterns using JA3/JA4 hashing techniques and WAF configuration for enterprise threat mitigation.
View All Articles by Jessica WrightA JA3 fingerprint is a method for creating a unique identifier from a client's TLS handshake configuration. When your browser connects to any HTTPS website, it sends a Client Hello packet — the opening message in the TLS handshake — that contains specific technical parameters about your cipher suites, SSL extensions, TLS version, and supported elliptic curves. Our free JA3 fingerprint lookup tool captures these parameters and generates a consistent MD5 hash that serves as your browser's cryptographic identity.
Unlike your IP address (which changes with VPNs or network switches), your JA3 hash stays the same because it depends on your browser's internal TLS library — not your network location. This makes JA3 a powerful tool for bot detection, malicious traffic identification, and browser fingerprint testing. Every browser (Chrome, Firefox, Safari), every operating system (Windows, macOS, Linux), and every automated tool (Python requests, cURL, Scrapy) produces a different Client Hello fingerprint.
According to Wikipedia's article on Transport Layer Security, the TLS handshake is the foundation of secure internet communication, and the Client Hello message contains all the cryptographic preferences that make JA3 fingerprinting possible.
Key Fact: Your JA3 fingerprint is generated from 5 fields in the Client Hello packet: TLS version number, cipher suite list, extension list, elliptic curve groups, and elliptic curve point formats. These are concatenated with commas and dashes, then hashed with MD5 to produce the 32-character JA3 hash you see above.
The name "JA3" comes from its three creators: John Althouse, Jeff Atkinson, and Josh Atkins — security researchers at Salesforce who published the method in 2017. Before JA3, identifying malicious traffic on encrypted connections was extremely difficult because HTTPS encryption hides the actual content of communications.
The breakthrough insight was that while the encrypted payload is invisible, the TLS handshake itself happens before encryption begins and is sent in plaintext. Every client announces its cryptographic capabilities differently — and these differences are consistent enough to serve as a reliable fingerprint. By extracting the Client Hello parameters and computing an MD5 hash, Salesforce engineers created a simple, fast method to identify clients regardless of their IP address or User-Agent string.
This revolutionized threat intelligence. Before JA3, an attacker could rotate IP addresses and fake User-Agent headers to evade detection. With TLS fingerprinting, security teams could track the same bot or malware across thousands of different IPs because the underlying TLS library produces the same Client Hello fingerprint every time. Today, JA3 is a standard feature in major WAF (Web Application Firewall) platforms including Cloudflare, Akamai, and AWS WAF.
Understanding what goes into your JA3 fingerprint helps you interpret the results from our TLS fingerprinting tool. The JA3 hash is generated from exactly 5 fields extracted from the Client Hello packet, separated by commas.
The numeric identifier for your TLS version. Common values: 771 = TLS 1.2, 772 = TLS 1.3. Our tool detected your browser using TLS 1.2 (code 771). Modern browsers use TLS 1.3 encryption by default, but the Client Hello is sent as TLS 1.2 for backward compatibility, which is why most JA3 hashes show version 771.
Cipher suites are the cryptographic algorithms your browser is willing to use for encryption. Your browser offered 11 cipher suites. Each cipher is identified by a numeric code (e.g., 4865 = TLS_AES_128_GCM_SHA256). Bots typically offer fewer ciphers than real browsers, making this a key differentiator for bot detection.
SSL extensions are additional capabilities announced during the handshake — things like SNI (Server Name Indication), supported groups, and signature algorithms. Your browser sent 15 extensions. Automated tools often have a minimal or different set of extensions compared to real browsers.
Elliptic curves define the mathematical groups used for key exchange. Common values include 29 (x25519), 23 (secp256r1), and 24 (secp384r1). These vary significantly between operating systems — Windows, macOS, and Linux each support different curve combinations.
Elliptic curve point formats specify how the curve points are encoded. Most modern clients use "0" (uncompressed format). This field is small but contributes to making each JA3 fingerprint unique.
# JA3 String Structure:
TLSVersion,CipherSuites,Extensions,EllipticCurves,PointFormats
# Example breakdown:
771,4865-4866-4867-49195-49199,0-23-65281-10-11,29-23-24,0
│ │ │ │ │
│ │ │ │ └ Point Formats
│ │ │ └ Elliptic Curves
│ │ └ SSL Extensions
│ └ Cipher Suites
└ TLS 1.2 (771)
# Final JA3 Hash = MD5 of the above string
A common question from our users is: what is the difference between JA3 and JA3S? While both use the same TLS fingerprinting concept, they capture different sides of the conversation.
| Feature | JA3 (Client) | JA3S (Server) |
|---|---|---|
| Captures | Client Hello packet (your browser) | Server Hello packet (the website) |
| Identifies | Browser, bot, or application | Web server TLS configuration |
| Use Case | Bot detection, client identification | Server profiling, C2 tracking |
| Combined Use | JA3 + JA3S together identify the exact client-server communication pattern — essential for malware C2 (Command and Control) tracking | |
Security researchers combine both JA3 and JA3S hashes to create a "conversation fingerprint." This is particularly valuable for identifying malware that communicates with specific command servers. Even if the malware rotates through hundreds of IP addresses, the JA3+JA3S pair remains constant because the same TLS libraries are used on both ends. For checking your own server's fingerprint, use our DNS Lookup Tool.
JA4 is the successor to JA3, designed to address limitations that became apparent with the widespread adoption of TLS 1.3 encryption. While JA3 remains widely deployed and supported, JA4+ offers more granular fingerprinting for modern encrypted connections.
In TLS 1.3, many of the extensions and cipher suites that JA3 relies on are encrypted or removed. The Client Hello in TLS 1.3 is more standardized, which means different browsers produce more similar JA3 hashes — reducing the fingerprint's uniqueness.
The JA4 fingerprint uses a different hashing approach. Instead of a single MD5 hash, JA4+ produces multiple hash components that capture the protocol type (QUIC vs TCP), TLS version, cipher count, extension count, ALPN values, and signature algorithms. This structured format survives TLS 1.3 changes and provides better differentiation between similar clients.
# JA3 format: Single MD5 hash
cd09876543210ef...
# JA4 format: Structured multi-part hash
t13d1516h2_8daaf6152771_b0da82dd1658
│ │ │ │ │
│ │ │ │ └ Extension hash
│ │ │ └ Cipher hash
│ │ └ SNI type (h=hostname)
│ └ TLS 1.3, 15 ciphers, 16 extensions
└ TCP transport
Current Status: JA3 remains the most widely deployed TLS fingerprinting standard — supported by Cloudflare, Suricata, Zeek, and most WAF platforms. JA4 adoption is growing but not yet universal. Our tool reports your JA3 hash for maximum compatibility with existing security tools.
Bot detection is the primary commercial use case for JA3 fingerprinting. Major WAF (Web Application Firewall) providers including Cloudflare, Akamai, and Imperva use JA3 as a core signal in their bot mitigation systems.
The most effective JA3-based bot detection technique is fingerprint mismatch analysis. Here is how it works: a request arrives at a web server claiming to be "Chrome 120 on Windows 11" in the User-Agent header. The WAF checks the JA3 hash against a database of known browser fingerprints. If the hash matches "Python requests/2.31" instead of Chrome, the request is flagged as a bot — regardless of what the User-Agent claims.
Security teams maintain databases of JA3 hashes associated with known attack tools, scrapers, and malware families. When a request's hash matches a known malicious traffic pattern, the WAF can block it instantly. Popular databases include Abuse.ch's JA3 feed and community-maintained threat intelligence lists.
Some advanced firewalls apply rate limiting per JA3 hash rather than per IP address. This catches distributed bots that rotate through thousands of IPs but all use the same underlying TLS library. To test what other data your browser reveals, use our Browser Leak Test and Canvas Fingerprint Test.
Important: If your JA3 hash matches a known bot or outdated TLS library, you may encounter more CAPTCHAs, access blocks, or slower connections on protected websites. Keeping your browser updated ensures your TLS client identity matches current legitimate browser signatures.
One of the most powerful applications of JA3 fingerprinting is tracking malware families across the internet. Because malware authors use specific, hard-coded TLS libraries for their C2 (Command and Control) communications, the JA3 hash of malware traffic remains consistent even when server IP addresses rotate hourly.
Malware like Dridex, Emotet, and TrickBot communicate with command servers using encrypted HTTPS connections. While the content is encrypted, the TLS handshake is not. Security analysts capture the Client Hello fingerprint from infected machines and create JA3 signatures for each malware family. Network monitoring tools like Suricata and Zeek then flag any connection matching these known malicious JA3 hashes.
Organizations like Abuse.ch publish JA3 hash databases of known malware TLS fingerprints. Security teams integrate these feeds into their firewalls and SIEM (Security Information and Event Management) systems for automated malicious traffic identification. A single JA3 hash can track a malware campaign across thousands of victim IPs worldwide.
# Example: Known malware JA3 hashes (from Abuse.ch)
# Emotet malware C2 communication:
JA3: 51c64c77e60f3980eea90869b68c58a8
# Dridex banking trojan:
JA3: 72a589da586844d7f0818ce684948eea
# Legitimate Chrome browser:
JA3: b32309a26951912be7dba376398abc3b
# Python requests library:
JA3: 3b5074b1b5d032e5620f69f9f700ff0e
For checking whether your IP address has been associated with malware activity, use our IP Blacklist Checker and IP Fraud Score Checker.
For legitimate web scraping and automated testing, JA3 fingerprinting presents a significant challenge. If your scraping tool's JA3 hash does not match a real browser, WAF systems will block your requests. Here are the proven methods to produce a legitimate TLS client identity.
Tools like Playwright and Puppeteer launch a real Chromium browser, so the TLS handshake is performed by the actual browser's TLS stack — producing a genuine Chrome JA3 hash. This is the most reliable bypass method because the fingerprint is indistinguishable from a real user.
The open-source project curl-impersonate rebuilds cURL with the exact TLS settings of Chrome, Firefox, or Safari. It produces matching cipher suites, SSL extensions, and elliptic curve configurations — generating a browser-matching JA3 fingerprint.
# Using curl-impersonate to match Chrome's JA3:
curl_chrome116 https://example.com
# Using curl-impersonate to match Firefox's JA3:
curl_ff117 https://example.com
# Standard cURL (detectable — different JA3 hash):
curl https://example.com
Specialized proxies intercept the TLS handshake from your script and re-negotiate it with the target server using a standard browser signature. The target server sees a legitimate Client Hello fingerprint while your actual client can be any tool.
Google's GREASE (Generate Random Extensions And Sustain Extensibility) protocol adds random dummy values to SSL extensions and cipher suites in the Client Hello. Modern JA3 fingerprint lookup engines filter out GREASE values before hashing, but the presence of GREASE itself is a signal that the client is a modern browser.
Your JA3 fingerprint is a stateless fingerprint — it does not use cookies, local storage, or any client-side data. It is purely derived from your network-level TLS handshake. However, it still has significant privacy implications.
If two different websites both log your JA3 hash, they can determine with high probability that the same browser visited both sites — even if you used a VPN, cleared cookies, or used incognito mode. Combined with other browser fingerprinting signals (canvas, WebGL, fonts), the JA3 hash significantly increases tracking accuracy.
A JA3 fingerprint alone cannot identify you personally. It cannot reveal your name, email, location, or any personal data. It identifies your browser type and version — millions of users share the same JA3 hash if they use the same browser version on the same operating system. It is a group identifier, not a unique personal ID.
For a complete privacy assessment, combine this tool with our WebRTC Leak Detector, Canvas Fingerprint Test, and Font Fingerprint Audit.
For years, changing the User-Agent header was enough to disguise a bot as a real browser. In 2026, JA3 fingerprinting has made simple header spoofing obsolete. Here is why User-Agent vs JA3 is not even a fair comparison.
| Feature | User-Agent Header | JA3 Fingerprint |
|---|---|---|
| Can Be Faked | Yes — one line of code to change | No — requires changing TLS library |
| Layer | Application layer (HTTP) | Transport layer (TLS) |
| Identifies | Claimed browser identity | Actual TLS library identity |
| Bot Detection Power | Weak (easily spoofed) | Strong (hard to replicate) |
A Python script can set its User-Agent to "Chrome/120" in a single line, but its JA3 hash will still match Python's urllib or requests library — not Chrome. This mismatch is exactly what WAF systems flag. The only way to produce a matching TLS client identity is to use the actual browser's TLS stack, which is why tools like Playwright and Puppeteer have become essential for legitimate web automation.
Developers building security tools, bot detection systems, or network monitoring dashboards often need to capture and analyze JA3 hashes programmatically. Here are methods to implement TLS fingerprinting in your applications.
# Nginx module: nginx-ssl-ja3
# After compilation, access JA3 in config:
server {
listen 443 ssl;
# Pass JA3 hash to application via header
proxy_set_header X-JA3-Hash $http_ssl_ja3_hash;
proxy_set_header X-JA3-String $http_ssl_ja3;
}
# Using pyja3 library for packet analysis
pip install pyja3
import ja3
from scapy.all import sniff
def process_packet(pkt):
if pkt.haslayer('TLS Client Hello'):
ja3_digest = ja3.process_pcap(pkt)
print(f"JA3 Hash: {ja3_digest}")
sniff(filter="tcp port 443", prn=process_packet)
# Zeek (formerly Bro) logs JA3 automatically
# Check ssl.log for ja3 and ja3s fields:
cat ssl.log | zeek-cut ja3 ja3s server_name
# Filter for known malware JA3 hash:
grep "51c64c77e60f3980eea90869b68c58a8" ssl.log
For testing your API endpoints and server configuration, use our Port Scanner and MTU Test alongside JA3 monitoring.
Here is a quick reference of JA3 hashes associated with popular browsers and common automation tools. This helps security teams quickly classify traffic during bot detection and incident response.
| Client | Type | JA3 Behavior |
|---|---|---|
| Chrome (latest) | Browser | Includes GREASE values, 15-17 ciphers, many extensions |
| Firefox (latest) | Browser | No GREASE, different cipher order than Chrome, unique extension set |
| Safari (macOS) | Browser | Apple's own TLS stack, unique elliptic curves, fewer extensions |
| Python requests | Library | Uses OpenSSL defaults, 5-8 ciphers, minimal extensions |
| cURL (default) | CLI Tool | OpenSSL/GnuTLS defaults, easily identifiable hash |
| Go net/http | Library | Go's crypto/tls package, unique cipher ordering |
| Tor Browser | Privacy | Standardized to match Firefox ESR, uniform across all Tor users |
Note that JA3 hashes change with browser updates, so specific hash values are not permanent. The patterns above describe general characteristics. To check your full browser fingerprint, try our Browser Leak Test.
A JA3 fingerprint is a unique MD5 hash generated from your browser's TLS Client Hello parameters — TLS version, cipher suites, SSL extensions, elliptic curves, and point formats. Every browser and application produces a different hash based on its TLS library configuration.
No. A VPN changes your IP address but your browser still performs the TLS handshake directly with the destination server through the encrypted tunnel. The server sees the same Client Hello parameters and calculates the same JA3 hash.
JA3 fingerprints the client (your browser) from the Client Hello. JA3S fingerprints the server from the Server Hello response. Combined, they identify the exact client-server communication pattern — essential for C2 (Command and Control) tracking of malware.
JA4 is JA3's successor designed for TLS 1.3. JA3 uses a single MD5 hash. JA4+ uses a structured multi-part format with protocol type, cipher count, extension count, and ALPN values — providing better differentiation when TLS 1.3 standardizes many Client Hello parameters.
Use our free JA3 fingerprint lookup tool above. It automatically captures your TLS Client Hello parameters when you visit this page and displays your JA3 hash, raw string, TLS version, cipher count, and extension details. No installation needed.
Yes. WAF systems like Cloudflare and Akamai compare the JA3 hash against the claimed User-Agent. If a request says "Chrome" but the hash matches "Python requests," it is flagged as a bot. This fingerprint mismatch analysis is the most effective bot detection method.
Use browser automation (Playwright/Puppeteer) that uses real browser TLS stacks, TLS spoofing libraries like curl-impersonate, or specialized proxies that re-negotiate the TLS handshake with a standard browser signature. Simply changing the User-Agent header is not enough.
Yes. Malware families use hard-coded TLS libraries for C2 communications. Their JA3 hash stays consistent even when server IPs change. Security teams maintain databases of known malicious JA3 hashes (e.g., Abuse.ch feeds) for automated malicious traffic identification.
Complete your privacy audit with our free toolkit.
Your JA3 fingerprint is the invisible signature that follows you across the internet — even behind VPNs. Use our free TLS fingerprinting tool to audit your Client Hello parameters, detect your JA3 hash, and understand what WAF systems see when your browser connects.