Anti-Bot

    JA3 / JA3S

    Mis à jour le 1 février 2026

    Définition

    JA3 et JA3S sont des méthodes de fingerprinting réseau développées par Salesforce. JA3 génère un hash MD5 à partir des paramètres du ClientHello TLS (version SSL, cipher suites, extensions). JA3S fait de même pour le ServerHello. Ces signatures permettent d'identifier précisément le client HTTP utilisé, même si les headers sont falsifiés.

    Deep Dive

    JA3/JA3S : L'ADN de votre connexion HTTPS

    Composition du hash JA3

    Le hash JA3 est calculé à partir de 5 paramètres du ClientHello, concaténés et séparés par des virgules :

    1. **SSLVersion** : Version TLS (ex: 771 pour TLS 1.2)

    2. **Ciphers** : Liste des cipher suites supportées

    3. **Extensions** : Extensions TLS activées

    4. **EllipticCurves** : Courbes elliptiques pour ECDHE

    5. **EllipticCurvePointFormats** : Formats de points des courbes

    Exemple de calcul

    ```

    Input: 771,4865-4866-4867-49195-49199,0-23-65281-10-11-35-16-5-13-18-51-45-43,29-23-24,0

    Hash MD5: bd0bf25947d4a37404f0424edf4db9ad

    ```

    Bases de données JA3

    Des services comme ja3er.com maintiennent des bases de données de hashes connus, permettant d'identifier :

  1. Navigateurs (Chrome, Firefox, Safari avec leurs versions)
  2. Bibliothèques (Python requests, Node.js axios)
  3. Bots malveillants
  4. Limites du JA3

  5. Peut varier selon l'OS et la configuration
  6. TLS 1.3 réduit les informations disponibles
  7. Nécessite une mise à jour constante des bases
  8. Code Playground

    Calcul du hash JA3 à partir des paramètres ClientHello TLS

    python
    # Calculer le hash JA3 d'une connexion
    import hashlib
    
    def compute_ja3(client_hello):
        """
        Calcule le hash JA3 à partir des paramètres ClientHello
        """
        # Extraction des paramètres
        ssl_version = client_hello.get('version', 771)
        ciphers = ','.join(map(str, client_hello.get('cipher_suites', [])))
        extensions = ','.join(map(str, client_hello.get('extensions', [])))
        curves = ','.join(map(str, client_hello.get('elliptic_curves', [])))
        point_formats = ','.join(map(str, client_hello.get('ec_point_formats', [])))
        
        # Construction de la chaîne JA3
        ja3_string = f"{ssl_version},{ciphers},{extensions},{curves},{point_formats}"
        
        # Hash MD5
        ja3_hash = hashlib.md5(ja3_string.encode()).hexdigest()
        
        return ja3_hash, ja3_string
    
    # Exemple
    client_hello = {
        'version': 771,
        'cipher_suites': [4865, 4866, 4867, 49195],
        'extensions': [0, 23, 65281, 10, 11],
        'elliptic_curves': [29, 23, 24],
        'ec_point_formats': [0]
    }
    
    ja3_hash, ja3_raw = compute_ja3(client_hello)
    print(f"JA3 Hash: {ja3_hash}")
    print(f"JA3 Raw: {ja3_raw}")

    Avis d'Expert 2026

    JA3/JA3S restent en 2026 le standard de facto pour l'identification TLS. Cependant, l'adoption croissante de TLS 1.3 avec ses extensions chiffrées (ECH) pourrait réduire l'efficacité de cette technique d'ici 2027. Les équipes anti-fraude combinent désormais JA3 avec l'analyse comportementale.

    Besoin d'aide sur JA3 / JA3S ?

    Nos experts peuvent vous accompagner sur vos projets de crawling et d'optimisation GEO.

    Contactez l'expert Crawlers.fr
    4.6/5 (73 avis d'experts)