Question 1Quel module utiliser pour générer un jeton de réinitialisation de mot de passe ?
random et secrets — Choisir le bon type de nombres aléatoires
Apprends les modules random et secrets de Python depuis la base. Couvre les séquences pseudo-aléatoires reproductibles avec random.choice / randint / shuffle / sample plus seed, les jetons cryptographiquement sûrs avec secrets.token_hex / token_urlsafe, et quand utiliser l'un plutôt que l'autre — avec des exercices pratiques exécutables.
Cet article couvre les deux modules de nombres aléatoires de la bibliothèque standard. random fournit des valeurs pseudo-aléatoires pour les tests, jeux et simulations (reproductibles avec seed), et secrets fournit des valeurs imprévisibles pour mots de passe, jetons de réinitialisation et clés API (tirées de la source aléatoire cryptographique de l'OS). Choisir le bon pour le travail est le sujet du reste de l'article.
En quoi random et secrets diffèrent
Les deux modules retournent des nombres aléatoires, mais le mécanisme et les usages sont complètement différents. random est construit sur le Mersenne Twister (un générateur pseudo-aléatoire largement utilisé), et appeler random.seed(valeur) te permet de reproduire la même séquence. secrets, en revanche, tire de la source aléatoire cryptographique de l'OS (comme /dev/urandom), donc il n'y a pas de notion de `seed` et les valeurs sont imprévisibles à chaque fois.
Pour des cas comme les tests ou les jeux — « ce n'est pas grave si le résultat fuit » — utilise random. Pour mots de passe, jetons et identifiants de session — « quelqu'un qui prédirait la valeur causerait un incident de sécurité » — utilise secrets.
| Aspect | random | secrets |
|---|---|---|
| Source | Mersenne Twister (algorithme) | Source crypto de l'OS (/dev/urandom, etc.) |
| Reproductibilité | Même séquence reproductible avec seed | Non reproductible (toujours différent) |
| Vitesse | Rapide | Plus lent (sans importance pour l'usage typique) |
| Meilleur usage | Tests, jeux, simulations | Jetons, mots de passe, ID de session |
random — Les bases (randint / uniform / choice)
Les bases de random sont trois choses : un entier aléatoire / un float aléatoire / choisir un élément d'une liste. random.randint(min, max) retourne un entier inclus aux deux bornes, random.uniform(min, max) retourne un float dans la plage donnée, et random.choice(liste) retourne un élément de la liste.
Commençons sans seed et observons comment ces fonctions de base se comportent.
| Fonction | Retour | Usage typique |
|---|---|---|
| random.randint(a, b) | Entier dans [a, b] (deux bornes incluses) | Lancers de dés, ID de test |
| random.uniform(a, b) | Float dans [a, b] | Bruit, simulations probabilistes |
| random.choice(seq) | Un élément de la séquence | Choisir un item dans un menu |
random — Reproductibilité par seed et opérations sur collections
Voyons maintenant la reproductibilité de tests avec `random.seed` et les fonctions d'opération sur collections (shuffle / sample). Après avoir appelé random.seed(N), la même graine produit toujours la même séquence. random.shuffle(liste) mélange les éléments de la liste sur place, et random.sample(liste, k) retourne une nouvelle liste de k éléments uniques tirés d'elle.
| Fonction | Retour | Usage typique |
|---|---|---|
| random.seed(value) | None (initialise l'état interne) | Tests reproductibles |
| random.shuffle(seq) | None (mélange la liste originale) | Randomiser l'ordre d'une liste |
| random.sample(seq, k) | Nouvelle liste de k éléments uniques | Tirer k répondants d'un sondage |
secrets — Hasard fort pour la sécurité
Le module random des sections précédentes est un générateur pseudo-aléatoire pour les tests — si son état interne fuit, les valeurs suivantes peuvent être prédites. Pour des choses comme les jetons de réinitialisation de mot de passe, les clés API et les ID de session — « si un attaquant peut prédire la valeur, tu as une vulnérabilité » — choisis le module `secrets`, qui utilise la source aléatoire cryptographique de l'OS.
secrets a une API beaucoup plus petite que random — ce sont surtout des helpers qui transforment des octets aléatoires en chaînes hex ou URL-safe.
| Fonction | Retour | Usage typique |
|---|---|---|
| secrets.token_bytes(n) | n octets aléatoires | Clés crypto, jetons binaires internes |
| secrets.token_hex(n) | Chaîne hex de longueur 2*n | ID de session de connexion |
| secrets.token_urlsafe(n) | Chaîne URL-safe (style Base64) | À intégrer dans des URLs de réinitialisation |
| secrets.choice(seq) | Un élément de seq, cryptographiquement | Quand l'ordre d'affichage ne doit pas être prévisible |
| secrets.compare_digest(a, b) | True / False (résistant aux attaques temporelles) | Comparaison de hash / jeton (à utiliser à la place de ==) |
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Après avoir appelé random.seed(42) puis random.randint(1, 100), que se passe-t-il si tu refais la même chose ?
Question 3Quelle est la meilleure option quand tu veux qu'une liste mélangée aléatoirement soit reproductible pour les tests ?