Vous pensez que la mise en œuvre des nonces est simple ? Détrompez-vous. Que vous construisiez des protocoles on-chain ou une infrastructure off-chain, une bonne mise en œuvre des nonces est l'un des aspects les plus délicats de la sécurité cryptographique. Plongeons dans les raisons pour lesquelles la protection contre les rejets est plus difficile qu'il n'y paraît 👇
2/ Tout d'abord, comprenons les signatures numériques. Dans la cryptographie à clé publique (comme BLS), vous avez une clé privée qui signe les messages et une clé publique qui les vérifie. Dans Ethereum : adresse = hachage de la clé publique message = hachage de la transaction signature = 64 octets de preuve cryptographique
3/ Voici le problème : les mathématiques dans la plupart des protocoles de cryptographie à clé publique ne limitent pas le nombre de fois qu'une signature peut être vérifiée par rapport au même message. Une fois que vous avez une signature valide, vous pouvez la rejouer indéfiniment. Cela ouvre la porte aux attaques par rejeu.
4/ Entrez le nonce : un "nombre utilisé une fois" qui empêche les attaques par rejeu. Lorsqu'un consommateur reçoit un message avec un nonce, il vérifie si ce nonce a déjà été utilisé. Si oui → rejeter. Les transactions Ethereum utilisent ce modèle.
5/ Mais l'implémentation des nonces est trompeusement complexe. Exigences clés : - Les nonces ne doivent JAMAIS être réutilisables (sur cette chaîne ou d'autres) - Doivent prévenir les attaques de répétition de manière permanente - Besoin de mécanismes pour gérer la croissance du stockage - Doivent être résistants aux attaques de front-running
6/ La solution naïve : stocker tous les nonces dans une base de données pour toujours. Cela pose deux problèmes majeurs : a) Croissance de stockage illimitée (surtout avec les attaques par spam) b) Vulnérabilité aux attaques de front-running Le problème (a) est plus facile à résoudre que (b). Commençons par le stockage...
7/ Les nonces basés sur des horodatages résolvent la croissance du stockage ! Utilisez un horodatage + une période d'expiration. Les nonces de plus de 5 minutes sont supprimés de la base de données. Mais que faire des messages simultanés du même compte ? Ils partagent un horodatage. Solution : horodatage + random_bytes pour une unicité granulaire.
8/ Le front-running est la partie délicate. Des acteurs malveillants peuvent intercepter des signatures valides, les utiliser pour marquer les nonces comme utilisés, puis l'appel de l'utilisateur légitime est rejeté. Cela pose problème sur la chaîne avec des opérations groupées si une mauvaise signature rejette l'ensemble du lot. Pour hors chaîne : utilisez le chiffrement TLS ! Ne laissez jamais un acteur malveillant voir le nonce ou la signature.
9/ N'oubliez pas la persistance ! Si votre cache de nonce est uniquement en mémoire, les attaquants peuvent rejouer de vieux nonces après un redémarrage du système. Persistez toujours l'état du nonce dans un stockage durable et rechargez-le au démarrage. Les caches uniquement en mémoire = fenêtre de vulnérabilité de replay.
10/ Nonces uniques par consommateur ! Lors de la diffusion à plusieurs utilisateurs, chacun doit recevoir un message/une signature différente. Sinon, vous êtes vulnérable aux attaques de type Man-in-the-Middle où un récepteur transmet le message en se faisant passer pour l'expéditeur original.
11/ Les nonces incrémentaux (comme Ethereum, nonce = nonce précédent + 1) ont leur place, mais attention ! Ils créent d'énormes défis pour l'infrastructure hors chaîne : messages hors ordre, problèmes de synchronisation et scénarios de récupération complexes. Utilisez-les uniquement si vous êtes sûr que les messages arriveront (ou doivent arriver) dans l'ordre.
Résumé - Liste de contrôle pour l'implémentation des nonces : ✅ Utiliser des nonces pour prévenir les attaques par rejeu ✅ Persister l'état des nonces à travers les redémarrages ✅ Mettre en œuvre des mécanismes d'expiration (timestamp + nettoyage) ✅ Rendre les nonces uniques par récepteur ✅ Protéger contre le front-running avec des canaux chiffrés ✅ Éviter les nonces incrémentaux à moins que l'ordre ne soit garanti La sécurité est dans les détails ! 🛡️
1,43K