Générateur de jetons

Génère des secrets avec le générateur cryptographique du navigateur : hex, base64url ou votre alphabet, et phrases de passe EFF, avec l’entropie en bits.

Génération…
Entropie192.0 bits

Durée moyenne pour le trouver, à trois vitesses de devinette. L’écart entre elles dépasse toute différence que fait le secret lui-même.

  • Face à une connexion qui limite les tentatives — 10 essais/s10^49 ans
  • Face à une empreinte lente fuitée (bcrypt, argon2) — 10⁴/s10^46 ans
  • Face à une empreinte rapide fuitée (SHA-256, MD5) — 10¹²/s10^38 ans

Tirage parmi 64 caractères : chacun porte donc 6.00 bits.

Ce que fait cet outil

Il produit des secrets : des valeurs dont la seule défense est que personne ne peut les deviner. Choisissez un alphabet et une longueur pour une clé d’API ou un mot de passe de base de données, ou passez à une phrase de passe tirée d’une liste publiée pour ce qu’une personne devra saisir. Chaque résultat est produit dans votre navigateur et affiché avec le seul chiffre qui décrit honnêtement sa force.

C’est un autre métier que celui du générateur d’UUID de ce site. Un UUID doit être unique, pour que deux enregistrements n’entrent jamais en collision ; un secret doit être indevinables, ce qui est une exigence plus forte et une défaillance différente. Un identifiant prévisible est sans danger. Un secret prévisible est une porte ouverte.

D’où vient l’aléa

Tout ici est tiré de crypto.getRandomValues, le générateur d’aléa cryptographiquement sûr du navigateur, alimenté par le réservoir d’entropie du système d’exploitation — la source même dont se servent openssl rand et /dev/urandom.

L’autre possibilité, Math.random, n’est pas une fonction de sécurité et ne l’a jamais prétendu. C’est un générateur pseudo-aléatoire rapide à petit état interne, et dans tous les moteurs actuels cet état se retrouve à partir d’une courte suite de sorties, après quoi toutes les valeurs passées et futures sont connues. Un jeton bâti là-dessus paraît exactement aussi aléatoire qu’un vrai ; la différence n’apparaît que lorsque quelqu’un prend la peine de regarder.

On peut légitimement se demander si une page web est le bon endroit pour produire un secret de production. La production elle-même est saine : c’est le CSPRNG de la plateforme, la page est statique et rien n’est transmis. Ce qui mérite réflexion, c’est ce qui l’entoure — un secret passé par le presse-papiers peut être lisible par d’autres applications, et un secret collé dans un terminal finit d’ordinaire dans l’historique du shell. Ce sont les mêmes considérations qu’avec n’importe quelle autre méthode.

Le biais caché dans l’implémentation évidente

Transformer des octets aléatoires en caractères ressemble à une seule ligne : prendre un octet, le réduire modulo la taille de l’alphabet, indexer. C’est subtilement faux pour tout alphabet dont la taille ne divise pas 256 exactement, et la sortie n’en laisse rien paraître.

Avec 62 caractères alphanumériques, 256 ne se divise pas exactement : 62 entre quatre fois dans 256 et il reste 8. Ces 8 valeurs d’octet restantes — 248 à 255 — se replient sur les 8 premiers caractères de l’alphabet, si bien que chacun d’eux reçoit cinq chances sur 256 quand les autres en reçoivent quatre. Les huit premiers caractères sont environ 25 % plus probables que les autres.

Le remède est l’échantillonnage avec rejet : écarter un tirage qui tombe dans la queue restante et retirer, plutôt que de le replier. Cela coûte à peu près un tirage supplémentaire sur trente-deux pour un alphabet de 62 caractères, et rien du tout pour hex ou base64url, dont les tailles sont des puissances de deux et qui n’ont donc pas de queue. Cet outil rejette ; l’effet ne se voit sur aucun jeton pris isolément, ce qui est précisément pourquoi il vaut la peine d’être dit.

L’entropie, seule mesure honnête

L’entropie en bits dit quelle est la taille de l’espace des secrets également probables : n bits signifient 2^n possibilités. Elle est additive et facile à comparer, et elle ne dit rien de la vitesse à laquelle quelqu’un peut parcourir cet espace — ce qui est une qualité, car cette partie dépend de choses qu’un générateur ne peut pas connaître.

L’arithmétique est volontairement simple. Chaque caractère apporte log2(taille de l’alphabet) bits, et chaque mot apporte log2(taille de la liste), donc :

  • Un caractère hex vaut 4 bits, donc un jeton hex de 32 caractères vaut exactement 128 bits — une clé AES-128 écrite en toutes lettres.
  • Un caractère base64url vaut 6 bits, donc 22 caractères franchissent 128 bits et 43 franchissent 256.
  • Un caractère alphanumérique vaut environ 5,95 bits ; exclure les sosies ramène l’alphabet à 58 et le caractère à 5,86, ce qui coûte à peu près un caractère de longueur tous les douze.
  • Un mot de la liste longue de l’EFF vaut 12,925 bits, car la liste compte 7776 entrées, soit 6^5 — cinq lancers de dé.
  • Un mot de la liste courte vaut 10,34 bits, sur 1296 entrées, soit 6^4.

Une cible courante est 128 bits, le point où la force brute cesse d’être une stratégie au lieu d’être seulement coûteuse. Cela fait 32 caractères hex, 22 caractères base64url, ou 10 mots de la liste longue de l’EFF.

Pourquoi il n’y a pas de « temps de cassage » unique

Un secret n’a pas de temps de cassage. Le couple formé par le secret et ce qui le garde en a un, et le gardien pèse bien plus lourd que le secret. La même valeur qu’il faudrait plus que l’âge de l’univers pour retrouver à travers un formulaire de connexion tombe en un après-midi si elle a été stockée en SHA-256 sans sel et que la base a fuité.

On affiche donc trois vitesses plutôt qu’un nombre, chacune nommée :

  • Dix essais par seconde, face à une connexion qui limite le débit. C’est le plafond réaliste pour qui doit passer par votre service.
  • Dix mille essais par seconde, face à une empreinte de mot de passe fuitée conçue pour être lente — bcrypt à un coût moderne, ou argon2. Cette lenteur est toute la raison d’être de ces fonctions.
  • Mille milliards d’essais par seconde, face à une empreinte fuitée qui n’a jamais été prévue pour des mots de passe. SHA-256 et MD5 sont conçus pour être rapides, et une grappe de GPU l’est prodigieusement.

Les vitesses sont arrondies à des puissances de dix à dessein. Plus précis, cela suggérerait la mesure d’un attaquant particulier, alors que l’information utile tient dans les onze ordres de grandeur qui séparent la première ligne de la dernière. Si un secret est à l’aise sur les trois, la question est réglée sans qu’il faille les chiffres exacts.

Chaque chiffre est la moyenne, c’est-à-dire la moitié de l’espace et non sa totalité — une recherche trouve la réponse à mi-parcours en moyenne. Et au-delà du million d’années la réponse est donnée en ordre de grandeur, car « quatre cents billions d’années » n’est pas une durée comparable par qui que ce soit. L’univers a environ 10^10 ans, ce qui fait un repère utile pour les lignes qui vont aussi loin.

Les phrases de passe, et d’où vient vraiment leur force

Une phrase de passe est forte pour une seule raison : plusieurs mots ont été choisis au hasard dans une grande liste. Elle n’est pas forte parce qu’elle est longue, ni parce qu’elle ressemble à de la langue. Six mots au hasard dans une liste de 7776 valent environ 77 bits ; six mots trouvés par une personne valent bien moins, car les gens ne choisissent pas uniformément et un attaquant sait sur les expressions courantes exactement ce que vous en savez.

Les deux listes proposées viennent de l’EFF : ce sont les listes diceware publiées, téléchargées sans modification. Ce ne sont pas des listes assemblées ici, et cela compte : une liste de mots inventée a une taille inconnue, un recouvrement inconnu avec d’autres listes, et aucun moyen de vérifier l’entropie qu’on lui prête.

  • La liste longue compte 7776 mots, un par lancer de cinq dés, et donne 12,925 bits par mot.
  • La liste courte compte 1296 mots, un par lancer de quatre dés, et donne 10,34 bits par mot. Ses mots sont plus courts — aucun ne dépasse cinq lettres — ce qui facilite la saisie au prix de plus de mots pour la même force.

Un mot répété dans une phrase n’est pas un défaut et n’est pas retiré ici. Chaque tirage est indépendant, donc telle paire de mots est exactement aussi probable que n’importe quelle autre ; refuser les répétitions rétrécirait l’espace des phrases possibles et les rendrait un peu plus faibles, pas plus fortes.

Les deux listes de l’EFF contiennent une poignée d’entrées à trait d’union : t-shirt, yo-yo, drop-down, felt-tip. Si le séparateur est lui aussi un trait d’union, une phrase qui en contient une ne peut plus être redécoupée en mots sans ambiguïté. C’est un problème d’affichage et non de sécurité, et choisir une espace ou un point comme séparateur l’évite complètement.

Les options qui coûtent de l’entropie, et celle qui n’en coûte pas

Exclure les caractères sosies échange de la force contre de la lisibilité, et l’échange est visible. Retirer 0, O, I et l fait passer l’alphabet alphanumérique de 62 caractères à 58 — soit exactement l’alphabet base58 qu’emploie Bitcoin, et pour la même raison. Chaque caractère tombe de 5,95 à 5,86 bits, donc un jeton a besoin d’environ un caractère de plus tous les douze pour rester aussi fort. Cela vaut généralement la peine pour tout ce qu’une personne lira à l’écran pour le saisir ailleurs.

L’option n’est proposée que là où elle a un sens. Hex et base64url sont des encodages, pas des jeux de caractères : leurs alphabets sont fixés par une spécification, et un hex sans 0 n’est plus du hex — plus rien ne saurait le décoder.

Mettre une majuscule à chaque mot d’une phrase n’ajoute strictement rien, et le chiffre de force ne bouge délibérément pas quand vous l’activez. C’est la même transformation appliquée à chaque fois : elle ne crée pas une seule possibilité nouvelle, et un attaquant qui sait que la phrase est capitalisée en est exactement au même point. L’option existe parce que des champs de mot de passe réclament encore une majuscule, non parce qu’elle aide.

Choisir une longueur

Pour tout ce qu’une machine manipule — clés d’API, jetons de session, secrets de webhook, mots de passe de base de données — aucune raison d’être économe. 32 caractères hex ou 22 caractères base64url donnent 128 bits, et aller plus loin ne coûte que des octets dans un fichier de configuration.

Pour tout ce qu’une personne saisit, la contrainte est autre et une phrase de passe est en général la meilleure forme. Six mots de la liste longue sont plus forts qu’un mot de passe aléatoire de douze caractères et bien plus faciles à réussir du premier coup, ce qui compte plus qu’il n’y paraît : un secret que les gens saisissent de travers est un secret que les gens notent quelque part.

Pour un code numérique, la lecture honnête est que quatre chiffres font 13 bits et s’épuisent en quelques secondes face à tout ce qui ne limite pas le débit. Un code PIN n’est sûr que grâce à la politique de blocage qui l’entoure, jamais par sa propre force.

Questions fréquentes

Quelle longueur pour une clé d’API ?
Visez 128 bits d’entropie ou plus, le point où la force brute cesse d’être une stratégie. Cela fait 32 caractères hex, 22 caractères base64url, ou 43 caractères base64url pour 256 bits. Pour une valeur que seul un logiciel manipule, l’option la plus longue ne coûte rien.
Est-ce plus sûr que de produire un secret avec Math.random ?
Oui, et la différence n’est pas de degré. Math.random est un générateur pseudo-aléatoire à petit état, que les moteurs actuels laissent retrouver à partir d’une courte suite de sorties, après quoi toutes les valeurs qu’il produira sont connues. Cet outil utilise crypto.getRandomValues, le CSPRNG de la plateforme, la source même dont se sert openssl rand.
Pourquoi n’affichez-vous pas un « temps de cassage » unique ?
Parce qu’un tel nombre n’existe pas. Le même secret est hors d’atteinte derrière une connexion qui limite le débit et tombe vite derrière une empreinte rapide fuitée — onze ordres de grandeur d’écart. Un chiffre unique doit choisir une hypothèse puis la masquer, et le lecteur retient le chiffre, pas l’hypothèse. Trois vitesses nommées mettent l’hypothèse là où on la voit.
Les phrases de passe sont-elles plus faibles qu’une chaîne aléatoire ?
Non : la force ne dépend que du nombre de mots tirés et de la taille de la liste, et les deux sont affichés. Six mots de la liste longue de l’EFF font environ 77 bits, plus qu’un mot de passe aléatoire de dix caractères. Ce qui affaiblit une phrase, c’est d’en choisir les mots soi-même, ce qui n’est pas le cas ici.
Faut-il exclure les caractères sosies ?
Si une personne va lire le secret à l’écran pour le saisir ailleurs, oui : le coût est faible et un jeton mal lu devient un ticket de support. Si seul un logiciel le manipule, aucune raison. Retirer 0, O, I et l ramène l’alphabet de 62 à 58 caractères — exactement l’alphabet base58 — et coûte environ un caractère de longueur tous les douze.
La capitalisation rend-elle une phrase de passe plus forte ?
Non. C’est le même changement appliqué à chaque fois : il n’ajoute pas une seule possibilité à l’espace des phrases. Le chiffre d’entropie reste immobile quand vous l’activez, ce qui est le comportement exact. L’option est là parce que certains champs de mot de passe exigent encore une majuscule.
Ce que je génère est-il envoyé à un serveur ?
Non. La génération s’exécute entièrement dans votre navigateur avec le générateur d’aléa de la plateforme ; rien n’est téléversé ni journalisé, et cela fonctionne sans connexion réseau. Les jetons ne sont stockés nulle part : recharger la page en produit de nouveaux et les anciens ont disparu.