Comment les chaînes aléatoires sont créées
Chaque caractère est tiré indépendamment parmi les caractères que vous avez choisis, avec crypto.getRandomValues, le générateur de nombres aléatoires cryptographiquement sûr du navigateur, la même source que pour les clés de chiffrement. Un simple nombre aléatoire modulo le nombre de caractères rendrait certains caractères un peu plus probables ; cette page tire de nouveau chaque fois qu’une valeur aléatoire tombe dans le reste inégal, de sorte que chaque caractère a exactement la même probabilité. La solidité d’une chaîne se mesure en bits d’entropie :
bits = length × log2(characters to choose from) 32 × log2(62) = 32 × 5.954 ≈ 190.5 bits
Chaque bit double le nombre d’essais dont un attaquant a besoin. Un préfixe comme sk_ n’apporte rien, car il est identique dans chaque chaîne ; exclure les caractères qui se ressemblent retire un peu, car il y a moins de caractères parmi lesquels choisir. Math.random(), que beaucoup de générateurs rapides utilisent, n’est pas sûr : sa sortie peut être prédite à partir des valeurs précédentes.
Exemple
Une chaîne de 32 caractères faite de lettres et de chiffres offre 62 choix par caractère, soit 32 × log2(62) ≈ 190,5 bits : bien au-delà de ce qu’on peut deviner. 32 caractères hexadécimaux portent 32 × 4 = 128 bits, comme 16 octets aléatoires. Base64url utilise 64 caractères de 6 bits chacun : 43 d’entre eux contiennent 258 bits, ce que donne l’encodage de 32 octets aléatoires. Un code à 6 chiffres n’a qu’un million de possibilités (19,9 bits) : dans une liste de 500 codes de ce genre, la probabilité que deux soient identiques est déjà d’environ 11,7 %.
Sur le serveur
Pour créer des chaînes aléatoires sur un serveur Linux ou dans un script de déploiement, utilisez la source aléatoire sécurisée du système, /dev/urandom, via openssl ou tr :
openssl rand -hex 16 # 32 hex characters
openssl rand -base64 32 | tr '+/' '-_' | tr -d '='
head -c 500 /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32Questions
Ces chaînes aléatoires sont-elles sûres ?
Oui. Elles viennent de crypto.getRandomValues, le générateur de nombres aléatoires cryptographiquement sûr de votre navigateur, et chaque caractère est tiré sans biais. Elles sont créées sur votre appareil et jamais envoyées à un serveur : personne d’autre ne les voit. Pour des clés et des jetons, utilisez au moins 128 bits d’entropie, par exemple 22 lettres et chiffres ou 32 caractères hexadécimaux.
Comment générer une chaîne aléatoire de 32 caractères ?
Réglez la longueur sur 32, la valeur par défaut, et choisissez les caractères : les lettres et chiffres donnent environ 190 bits, l’hexadécimal exactement 128. Sur un serveur, openssl rand -hex 16 affiche 32 caractères hexadécimaux aléatoires. En Python : secrets.token_hex(16), ou secrets.token_urlsafe(24) pour 32 caractères Base64url.
Quelle longueur pour une clé d’API ou un jeton aléatoire ?
Au moins 128 bits d’entropie : ni la clé ni le jeton ne peuvent alors être devinés, même avec des milliards d’essais par seconde. Cela fait 22 lettres et chiffres, 32 caractères hexadécimaux ou 22 caractères Base64url. De nombreux services utilisent 32 à 40 caractères avec un préfixe comme sk_ qui indique à quoi sert la clé, ce qui aide les outils de détection de secrets à trouver les clés divulguées.
Quelle est la différence entre une chaîne hexadécimale et une chaîne Base64url ?
L’hexadécimal utilise 16 caractères (0–9 et a–f), donc chacun porte 4 bits. Base64url en utilise 64 (lettres, chiffres, - et _), donc chacun porte 6 bits et la chaîne est d’un tiers plus courte pour la même solidité. Les deux sont sûrs dans les URL, les noms de fichiers et les fichiers de configuration. L’hexadécimal est plus facile à lire ; Base64url est plus compact.
Deux chaînes générées peuvent-elles être identiques ?
Avec assez de longueur, pratiquement jamais : avec des chaînes de 128 bits, il en faudrait environ 2^64, soit 18 milliards de milliards, avant qu’une répétition devienne probable. Les chaînes courtes se répètent plus vite qu’on ne le croit, à cause du paradoxe des anniversaires : parmi 500 codes à six chiffres, deux sont identiques environ 12 % du temps. La page vous avertit quand une répétition est probable dans votre liste.