Retour au Blog

Authentification post-quantique pour les serveurs de jeux : Runbook de migration ML-DSA avec code et données de performance

Publié le 31 juillet 2026
Authentification post-quantique pour les serveurs de jeux : Runbook de migration ML-DSA avec code et données de performance

En bref

Découvrez le runbook de migration ML-DSA pour l'authentification post-quantique des serveurs de jeux, avec code et données de performance.

Les signatures cryptographiques qui authentifient les connexions TLS de votre serveur de jeu ne sont qu'à une avancée algorithmique d'être falsifiables. Le RSA‑2048 et l'ECDSA‑P256 — les algorithmes de certificat protégeant les données des joueurs entre votre CDN et votre serveur d'origine — tombent face à l'algorithme de Shor sur un ordinateur quantique suffisamment puissant. Pas théoriquement. Dans un délai que Microsoft, Google et le gouvernement américain planifient activement dès 2026.

Cloudflare vient de déployer l'authentification post-quantique pour les connexions d'origine avec ML-DSA (Module-Lattice-Based Digital Signature Algorithm), normalisé sous FIPS 204. C'est le premier déploiement en production de l'authentification PQ à grande échelle — sur un réseau qui gère environ 20% du trafic web. Si votre backend de jeu se trouve derrière une couche de terminaison TLS, cette migration touchera votre infrastructure. Et plus vous commencez tôt, moins la transition sera douloureuse.

Ce post est votre runbook : ce qui casse, comment le détecter, comment y remédier avec des commandes et du code réels, et comment éviter que votre backend de jeu ne devienne le maillon faible.

Pourquoi les serveurs de jeux sont particulièrement vulnérables

Les backends de jeux ne sont pas des services web classiques. Ils maintiennent des connexions persistantes pour la synchronisation d'état en temps réel, stockent des mois ou des années de données de progression des joueurs, et gèrent des opérations sensibles comme la gestion d'inventaire et le traitement des paiements. Le modèle de menace pour les attaques post-quantiques contre les serveurs de jeux est concret :

  • Identifiants des joueurs et jetons de session circulant entre votre proxy CDN et votre API d'origine
  • Données d'économie in-game — soldes de monnaie virtuelle, inventaires d'objets, historiques d'échange valant de l'argent réel sur les marchés secondaires
  • Webhooks de paiement si votre backend traite les achats côté serveur
  • Signaux anti-cheat qui, une fois exposés, permettent aux attaquants de rétro-ingénier vos heuristiques de détection

L'attaque contre laquelle nous nous protégeons n'est pas la collecte passive de données. C'est l'usurpation active : un attaquant doté d'une capacité quantique forge vos identifiants d'authentification CDN et injecte des charges utiles malveillantes directement dans votre API de jeu. C'est une menace fondamentalement différente de « harvest now, decrypt later ».

Nous avons documenté ce qui se produit lorsque l'architecture de sécurité du backend échoue sous pression — l'authentification post-quantique est la prochaine évolution de cette même posture défensive. La question n'est pas de savoir si votre jeu subira des attaques sophistiquées, mais si votre infrastructure y survivra.

Chiffrement vs authentification : ce qui casse vraiment

Il y a une distinction cruciale qui est constamment confondue : le chiffrement post-quantique et l'authentification post-quantique sont des problèmes distincts avec des calendriers et des solutions différents.

Chiffrement post-quantique (déjà déployé)

L'échange de clés TLS 1.3 utilisant des algorithmes hybrides comme X25519Kyber768 est déjà largement déployé. Cloudflare a activé le chiffrement PQ pour les connexions visiteur-à-CDN et CDN-à-origine en 2022‑2023. Cela protège les données en transit contre les attaques de type harvest-now/decrypt-later.

Authentification post-quantique (la nouvelle frontière)

L'authentification est là où se trouve le vrai risque aujourd'hui. Lorsque votre serveur d'origine présente un certificat TLS signé avec RSA‑2048 ou ECDSA‑P256, un ordinateur quantique exécutant l'algorithme de Shor peut forger cette signature en temps réel. Cela permet des attaques man-in-the-middle — non pas un enregistrement passif, mais une interception et une manipulation actives de votre trafic de jeu.

Voici comment se décomposent les deux connexions dans une architecture de jeu typique :

┌─────────────┐    Connexion 1     ┌─────────────┐    Connexion 2     ┌─────────────┐
│  Game Client │ ════════════════► │    CDN /    │ ════════════════► │   Origin    │
│  (Player)    │                    │   Proxy     │                    │  (Your API) │
└─────────────┘                    └─────────────┘                    └─────────────┘
                                    │                                      │
                              PQ encryption ✓                        PQ encryption ✓
                              PQ auth (via MTC, 2027)              PQ auth (ML-DSA, NOW)
                                    │
                              Classical auth
                              certificates here
                              are the current
                              weak link

Connexion 2 — de votre CDN ou proxy inverse vers votre origine — est celle où l'authentification PQ est déployable dès maintenant. C'est la connexion qui transporte les actions des joueurs, les mises à jour d'inventaire, les requêtes de matchmaking et les webhooks de paiement. Si un attaquant forge l'authentification sur cette connexion, il possède votre backend.

Pourquoi la connexion 2 vient en premier

La connexion CDN-à-origine présente des avantages structurels qui rendent l'authentification PQ pratique des années avant le web public :

  • Client TLS contrôlé : le CDN gère le pooling de connexions et le comportement de handshake, répartissant la surcharge PQ sur des milliers de requêtes
  • Relation de confiance existante : vous avez déjà une relation de compte avec votre CDN — pas de dépendance vis-à-vis de l'écosystème des autorités de certification publiques
  • PKI personnalisée : vous pouvez gérer vos propres autorités de certification, évitant les contraintes du WebPKI et des exigences de Certificate Transparency
  • Réutilisation des connexions : les CDN maintiennent des connexions persistantes vers les origines, ce qui signifie que les handshakes PQ ont lieu rarement par rapport au volume total de requêtes

C'est pourquoi Cloudflare peut déployer l'authentification ML-DSA pour les connexions d'origine aujourd'hui alors qu'Internet attend les Merkle Tree Certificates (visant 2027).

ML-DSA : l'algorithme au cœur de l'authentification PQ

ML-DSA, normalisé sous NIST FIPS 204, repose sur la difficulté de problèmes de réseaux — des structures mathématiques censées résister aux attaques classiques et quantiques. C'est le principal algorithme déployé pour les signatures numériques post-quantiques dans l'industrie.

Jeux de paramètres et niveaux de sécurité

Jeu de paramètres Niveau de sécurité Clé publique Signature Surcharge de handshake
ML-DSA-44 NIST Cat 2 (~AES-128) 1 312 o 2 420 o ~4,5 Ko ajoutés
ML-DSA-65 NIST Cat 3 (~AES-192) 1 952 o 3 293 o ~6,5 Ko ajoutés
ML-DSA-87 NIST Cat 5 (~AES-256) 2 592 o 4 595 o ~9 Ko ajoutés

À titre de comparaison, une signature ECDSA-P256 fait 64 octets avec une clé publique de 64 octets. Les signatures ML-DSA-44 sont environ 37 fois plus grandes. C'est le principal compromis, et c'est le nombre qui rend les développeurs nerveux.

ML-DSA-44 est le bon choix pour les backends de jeux. Il offre un niveau de sécurité NIST Catégorie 2 — des marges confortables contre les attaques quantiques et classiques connues — tout en étant l'option la plus performante. La taille plus grande des signatures est gérable car le pooling de connexions rend les handshakes peu fréquents par rapport au trafic total.

Format de seed FIPS 204 : stockage compact des clés

Les clés privées ML-DSA supportent un format de seed — une valeur aléatoire de 32 octets à partir de laquelle la clé privée complète est dérivée de manière déterministe :

Seed (32 bytes) ──► Déterministic Expand ──► Full Private Key (2,560 bytes for ML-DSA-44)

C'est un avantage pratique pour l'infrastructure des backends de jeux. Au lieu de stocker des clés privées de 2 560 octets dans votre gestionnaire de secrets ou variables d'environnement, vous stockez 32 octets et dérivez la clé complète à la demande. La rotation des clés devient une question de génération et de distribution d'une nouvelle seed — opérationnellement beaucoup plus simple que la gestion du matériel de clé RSA traditionnel.

Runbook de migration : étape par étape

Étape 1 : Auditez votre configuration TLS actuelle

Avant de toucher à quoi que ce soit, comprenez ce que vous exécutez. Vérifiez la chaîne de certificats et les algorithmes de signature de votre serveur d'origine :

# Inspect the certificate your origin is presenting
openssl s_client -connect your-game-api.example.com:443 \
  -servername your-game-api.example.com \
  </dev/null 2>/dev/null \
  | openssl x509 -text -noout | grep -A2 "Signature Algorithm"

# Check supported TLS versions and cipher suites
nmap --script ssl-enum-ciphers -p 443 your-game-api.example.com

# If using mTLS, check what client certificate your CDN presents
# (capture during a test request with tcpdump or equivalent)
tcpdump -i eth0 -w tls_handshake.pcap port 443 -c 50

Documentez cette base de référence. Vous en aurez besoin pour un rollback et pour confirmer que votre migration n'a rien cassé. Notez :

  • Algorithme de signature actuel (RSA-SHA256, ECDSA-SHA256, etc.)
  • Profondeur de la chaîne de certificats et toutes les dates d'expiration
  • Si mTLS est déjà utilisé
  • Versions TLS supportées (vous devriez déjà être sur TLS 1.3 uniquement)

Étape 2 : Générez des chaînes de certificats ML-DSA

Vous aurez besoin du fournisseur Open Quantum Safe (OQS) pour OpenSSL 3.0+ :

# Install OQS provider
git clone https://github.com/open-quantum-safe/oqs-provider.git
cd oqs-provider && mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc) && sudo make install

# Enable in openssl.cnf — add to [provider_sect]:
# oqsprovider = oqsprovider_sect
# oqsprovider_sect = oqsprovider

# Generate ML-DSA-44 root CA (10-year validity)
openssl req -x509 -new -newkey mldsa44 \
  -keyout mldsa44-ca.key -out mldsa44-ca.crt \
  -days 3650 -nodes \
  -subj "/CN=Game Backend PQ Root CA" \
  -addext "basicConstraints=critical,CA:TRUE" \
  -addext "keyUsage=critical,keyCertSign,cRLSign"

# Generate origin server certificate signing request
openssl req -new -newkey mldsa44 \
  -keyout mldsa44-server.key -out mldsa44-server.csr \
  -nodes -subj "/CN=your-game-api.example.com"

# Sign server cert with PQ CA (1-year validity for rotation hygiene)
openssl x509 -req -in mldsa44-server.csr \
  -CA mldsa44-ca.crt -CAkey mldsa44-ca.key \
  -CAcreateserial -out mldsa44-server.crt \
  -days 365 \
  -extfile <(echo "subjectAltName=DNS:your-game-api.example.com")

# Generate client certificate for mTLS (your CDN's identity)
openssl req -new -newkey mldsa44 \
  -keyout mldsa44-client.key -out mldsa44-client.csr \
  -nodes -subj "/CN=CDN Proxy Client"

openssl x509 -req -in mldsa44-client.csr \
  -CA mldsa44-ca.crt -CAkey mldsa44-ca.key \
  -CAcreateserial -out mldsa44-client.crt -days 365

# Verify the chain
openssl verify -CAfile mldsa44-ca.crt mldsa44-server.crt
openssl verify -CAfile mldsa44-ca.crt mldsa44-client.crt

Note sur la gestion des clés : stockez la seed de 32 octets plutôt que la clé privée complète de 2 560 octets lorsque c'est possible. Cela simplifie la rotation des secrets et réduit votre surface d'attaque dans les gestionnaires de secrets et les variables d'environnement.

Étape 3 : Configurez votre serveur d'origine pour le mTLS PQ

Configuration Nginx :

server {
    listen 443 ssl;
    server_name your-game-api.example.com;

    # ML-DSA-44 server certificate
    ssl_certificate     /etc/ssl/pq/mldsa44-server.crt;
    ssl_certificate_key /etc/ssl/pq/mldsa44-server.key;

    # Client verification (mTLS) — only trust PQ CA
    ssl_client_certificate /etc/ssl/pq/mldsa44-ca.crt;
    ssl_verify_client on;
    ssl_verify_depth 2;

    # TLS 1.3 only — no downgrade to older versions
    ssl_protocols TLSv1.3;

    location /api/ {
        proxy_pass http://game_backend_upstream;
        proxy_set_header X-Client-DN $ssl_client_s_dn;
        proxy_set_header X-Client-Verified $ssl_client_verify;
    }
}

Serveur de jeu personnalisé en C++ (OpenSSL 3.0 + OQS) :

#include <openssl/ssl.h>
#include <openssl/err.h>

SSL_CTX* create_pq_mtls_context() {
    SSL_CTX* ctx = SSL_CTX_new(TLS_server_method());
    if (!ctx) {
        ERR_print_errors_fp(stderr);
        return nullptr;
    }

    // Enforce TLS 1.3 minimum — no version downgrade possible
    SSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION);

    // Load ML-DSA-44 server certificate
    if (SSL_CTX_use_certificate_file(ctx,
            "/etc/ssl/pq/mldsa44-server.crt",
            SSL_FILETYPE_PEM) != 1) {
        ERR_print_errors_fp(stderr);
        SSL_CTX_free(ctx);
        return nullptr;
    }

    // Load ML-DSA-44 private key
    if (SSL_CTX_use_PrivateKey_file(ctx,
            "/etc/ssl/pq/mldsa44-server.key",
            SSL_FILETYPE_PEM) != 1) {
        ERR_print_errors_fp(stderr);
        SSL_CTX_free(ctx);
        return nullptr;
    }

    // Verify key matches certificate
    if (SSL_CTX_check_private_key(ctx) != 1) {
        fprintf(stderr, "Key/cert mismatch\n");
        SSL_CTX_free(ctx);
        return nullptr;
    }

    // Load PQ CA for client certificate verification
    if (SSL_CTX_load_verify_locations(ctx,
            "/etc/ssl/pq/mldsa44-ca.crt", nullptr) != 1) {
        ERR_print_errors_fp(stderr);
        SSL_CTX_free(ctx);
        return nullptr;
    }

    // Require and verify client certificates
    SSL_CTX_set_verify(ctx,
        SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
        nullptr);

    return ctx;
}

// Usage in your game server's accept loop:
void handle_connection(int client_fd, SSL_CTX* ctx) {
    SSL* ssl = SSL_new(ctx);
    SSL_set_fd(ssl, client_fd);

    if (SSL_accept(ssl) <= 0) {
        // Handshake failed — likely client cert issue
        ERR_print_errors_fp(stderr);
        SSL_free(ssl);
        close(client_fd);
        return;
    }

    // Verify client certificate was actually presented
    X509* client_cert = SSL_get_peer_certificate(ssl);
    if (!client_cert) {
        fprintf(stderr, "No client certificate — rejecting\n");
        SSL_shutdown(ssl);
        SSL_free(ssl);
        close(client_fd);
        return;
    }

    // Client authenticated via ML-DSA mTLS — proceed
    X509_free(client_cert);
    // ... handle game protocol ...
}

Étape 4 : Mettez à jour le magasin de confiance de votre CDN/proxy

Si vous utilisez Cloudflare, téléchargez votre certificat CA ML-DSA dans le Custom Origin Trust Store et configurez Authenticated Origin Pulls avec votre certificat client ML-DSA :

  1. Téléchargez mldsa44-ca.crt dans le magasin de confiance personnalisé de votre CDN
  2. Téléchargez mldsa44-client.crt et mldsa44-client.key pour les authenticated origin pulls
  3. Réglez le mode SSL sur Full (strict) pour appliquer la validation du certificat par rapport à votre magasin de confiance personnalisé

Si vous gérez votre propre infrastructure de proxy, vous devrez distribuer le certificat CA PQ à tous les nœuds du proxy, configurer les certificats clients pour chacun, et mettre en place une surveillance de l'expiration des certificats. Gérer cela manuellement sur plusieurs régions et groupes de mise à l'échelle est là où la complexité opérationnelle s'accumule — la distribution et la rotation automatisées des certificats deviennent essentielles.

Étape 5 : Testez le handshake PQ

# Verify ML-DSA mTLS handshake succeeds
openssl s_client -connect your-game-api.example.com:443 \
  -servername your-game-api.example.com \
  -cert mldsa44-client.crt \
  -key mldsa44-client.key \
  -CAfile mldsa44-ca.crt \
  </dev/null 2>&1 | grep -E "(Verify return|Protocol|Cipher)"

# Expected output:
#   Verify return code: 0 (ok)
#   Protocol  : TLSv1.3
#   Cipher    : TLS_AES_256_GCM_SHA384

# Measure handshake latency under load
# (adjust connection rate to simulate launch-day conditions)
wrk -t4 -c100 -d30s --latency \
  --script=pq_mtls_test.lua \
  https://your-game-api.example.com/api/health

Ce qu'il faut surveiller pendant les tests :

  • Latence de handshake : attendez-vous à 0,5–2 ms supplémentaires par nouvelle connexion par rapport à ECDSA-P256
  • Utilisation CPU : la vérification de signature ML-DSA est environ 2–3 fois plus lente que la vérification ECDSA
  • Taux d'erreur : surveillez les échecs de validation de certificat pendant la transition
  • Utilisation du pool de connexions : confirmez que les connexions sont réutilisées (amortissant le coût du handshake)

Étape 6 : Supprimez les fallbacks classiques

C'est l'étape qui fournit réellement la sécurité quantique. Si votre origine accepte une quelconque authentification classique (RSA/ECDSA), un attaquant quantique peut forger ces identifiants et contourner vos protections PQ.

Le scénario d'attaque par downgrade :

Attacker intercepts CDN ↔ Origin handshake
    │
    ├── Forces negotiation to classical RSA authentication
    ├── Forges RSA signature using Shor's algorithm
    └── Impersonates CDN to your origin server ✓

Your PQ certificates are worthless if classical fallbacks exist.

La solution : votre serveur d'origine ne doit seulement faire confiance qu'aux certificats ML-DSA pour la connexion CDN-à-origine.

# WRONG: Mixed trust store — classical certs still accepted
ssl_client_certificate /etc/ssl/mixed-ca-bundle.crt;

# RIGHT: PQ-only trust store — classical forgeries rejected
ssl_client_certificate /etc/ssl/pq/mldsa44-ca.crt;

Avertissement critique : ne retirez la confiance classique qu'après avoir confirmé que toutes les connexions CDN utilisent l'authentification PQ. Un retrait prématuré casse la connectivité de votre origine. Exécutez la configuration double pile (étapes 3–5) pendant au moins deux semaines, en surveillant qu'aucune connexion ne retombe sur l'authentification classique, avant de supprimer la confiance classique.

Impact sur les performances : chiffres réels pour les backends de jeux

La préoccupation légitime : les signatures ML-DSA sont volumineuses. Voici ce que cela signifie en pratique.

Surcharge au niveau du handshake

Métrique ECDSA-P256 ML-DSA-44 Delta
Taille du certificat serveur ~500 o ~1 700 o +240 %
Taille de la signature 64 o 2 420 o +3 681 %
Total d'octets du handshake ~1,5 Ko ~6 Ko +300 %
Latence de handshake (p50) ~1 ms ~2,5 ms +150 %
CPU par vérification de handshake ~0,05 ms ~0,12 ms +140 %

Pourquoi cela ne détruit pas votre backend de jeu

Les connexions CDN-à-origine utilisent le pooling de connexions. Une seule connexion TLS gère des milliers de requêtes HTTP avant d'être recyclée. Les 1,5 ms supplémentaires de latence de handshake s'amortissent sur, disons, 10 000 requêtes — soit 0,00015 ms par reqête. Efectivement gratuit.

L'impact sur les perormances se concentre sur deux scénarios :

  1. Démarragà froi / piers de créaton de connexion : lancments de jeu, énéments saisoniers, moments viraux — quand votre origine gere des milliers de nouvelles connexions TLS par seconde. Si votre origine gere actuellement 50 000 handshakes ECDSA/seconde, attendez-vous à ~20 000–25 000 handshakes ML-DSA-44/seconde sur du matériel équivalent. Prévoyez la capacité en conséquence.

  2. Connexions de courte durée : si votre architecture crée une nouvelle connexion TLS par reqête (ne faites pas ça), chaque reqête paie le coût total du handshake. Corrigez cela avec le pooling de connexions et des connexions persistantes avant de migrer vers l'auth PQ.

Impact sur la bande passante

Les ~4,5 Ko de données supplémentaires par nouvelle connexion sont négligeables pour les connexions multiplexées HTTP/2 ou HTTP/3. Pour les protocoles basés sur WebSocket avec des connexions de longue durée, le handshake se produit une fois par durée de vie de la connexion — sans incidence sur les budgets de bande passante.

Bonnes pratiques pour la migration PQ des backends de jeux

  1. Activez le chiffrement PQ d'abord, l'authentification ensuite. Si vous n'avez pas encore activé l'échange de clés post-quantique (X25519Kyber768) pour vos connexions d'origine, faites-le avant de vous attaquer aux certifcats. C'est un changement de configuraton — pas de noueaux certifcats — et ça protège immédiatement contrel'attaque de ype "harvest-now/decypt-later".

  2. Déployez ML-DSA-44, pas ML-DSA-87. Sauf si vous protégez des systémes militaires classifiés, ML-DSA-44 offre des margin de sécurités confortables à la catégorie 2 du NIST. ML-DSA-87 double à peu près la surcharge de handshake pour un gain de sécurité marginl que votre modéle de menace ne requért presque certainement pas.

  3. Exécutez une configuraton double pile pencant la transiton — puis supprimez le classique sans pitié. Dépoyez les certifcats classiues et PQ en paralléle. Survellez penant au moins deux semaines. Confirmez qu'aucune connexion ne retombe sur l'authentification classique. Ensuite, supprimez complétement la confiance classique. Laisser des fallbacks classiques en place est l'erreur la plus fréquente dans la migraton PQ — cela rend vos nieuweux certifcats coûeux en pur "théâtre de sécurté".

  4. Automatisez la rotation des clés dès le premier jour. Le format de seed de 32 octets de ML-DSA rend ceci pratique. Intégrez la rotation des certifcats dans votre pipeline de déploiment. Faites-la tous les trimestres — pas parce que la crypto s'affaiblit, mais parce que l'hygiène opérationelle des clés (identiants fuits, ingénieurs partis, CI/CD compromis) est votre vulnérabilité réelle.

  5. Profiez votre taux de renouvellement de connexions. Exéutez ss -s ou l'équivalent sur vos serveurs d'origine pour compter le nombre de nouvelles connexions par seconde pendant les heures de pointe et creuses. Multipiez par le delta de surcharge du handshake (~1,5 ms CPU, ~4,5 Ko bande passante). Cela vous donne un chiffre concret de planification de capacité pour la migration.

Ce que cela signifie pour le backend de votre jeu

Le calendrier post-quantique n'est plus académique. Le NIST a normalisé ML-DSA. Les principaux fournisseurs d'infrastructure le déploient en production. Les mandats gouvernementaux accélèrent l'adoption. La question n'est pas de savoir si votre backend de jeu a besoin de l'authentification PQ — c'est quand vous commencerez la migration.

Pour les équipes qui gèrent leur propre infrastructure d'origine, le travail est réel mais limité : générer de nouvelles chaînes de certificats, mettre à jour les configs serveur, modifier les magasins de confiance, tester, et supprimer les fallbacks classiques. Chaque étape représente quelques heures de travail. Cumulativement, c'est un projet d'une à deux semaines pour un ingénieur backend à l'aise avec TLS.

Si vous préférez passer ces semaines sur le gameplay plutôt que sur l'infrastructure cryptographique, horizOn gère la terminaison TLS, le mTLS et la gestion des certificats dans le cadre de sa plateforme backend — vous permettant de livrer des fonctionnalités pendant que la migration PQ s'exécute comme un simple changement de configuration plutôt qu'un projet d'infrastructure de plusieurs semaines.

Commencez aujourd'hui. Exécutez les commandes d'audit de l'étape 1 contre votre origine de production. Vériiez quel algorithme de signatue vos certifcats utilient. Si c'est du RSA ou de l'ECDSA, ajoutez la migration de l'authentifcation PQ à votre feuille de route 2026–2027. Les ordinateurs quantiues qui viennent pour les donénes de vos joueurs n'attendront pas que vous soyiez prêts.


Source : L'authentification post-quantique vers les origines est désormais prise en charge