Générateur de chaînes aléatoires en PHP : sous le capot

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment fonctionne réellement un générateur de chaînes aléatoires en PHP ? Regardons sous le capot



Avez-vous déjà réfléchi à ce qui se passe lorsque vous cliquez sur « Générer un mot de passe » sur un site ? Ou lorsque le système crée un identifiant unique pour votre session ? Dans neuf cas sur dix, derrière cela se cache un générateur de chaînes aléatoires en PHP. Cela semble simple : prendre un tableau de caractères, le mélanger, afficher le résultat. Mais le diable, comme toujours, se cache dans les détails.



Sur Stack Overflow, la question « PHP random string generator » a recueilli des milliers de vues. Et ce n'est pas un hasard. Les débutants écrivent des solutions artisanales avec rand(), les expérimentés utilisent random_int(), et les gourous débattent de l'entropie. Comprenons comment tout cela fonctionne réellement et écrivons notre générateur idéal.



Pourquoi rand() est-il un mal ? (spoiler : prévisibilité)



La méthode « enfantine » la plus populaire consiste à utiliser rand() dans une boucle :



<?phpfunction generateRandomString($length = 10) {    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';    $charactersLength = strlen($characters);    $randomString = '';    for ($i = 0; $i < $length; $i++) {        $randomString .= $characters[rand(0, $charactersLength - 1)];    }    return $randomString;}echo generateRandomString(); // Affiche : "aB3kL9xQ2m"?>


Le code fonctionne. Mais seulement si la sécurité ne vous importe pas. La fonction rand() utilise un générateur linéaire congruentiel (LCG). C'est un algorithme déterministe : connaissant l'état actuel, on peut prédire tous les nombres suivants. De plus, rand() est initialisé par défaut à un, si vous n'avez pas appelé srand(). Et si vous l'appelez, la graine est souvent tirée de time(), ce qui ne donne que 2 à 3 millions de possibilités. Leur énumération prend quelques secondes.



Conclusion : rand() convient pour les jeux et le choix aléatoire d'un avatar, mais ne convient absolument pas pour la génération de jetons, de mots de passe ou de clés API.



Voici mt_rand() — plus rapide, mais pas plus sûr



En PHP 4, mt_rand() est apparu, basé sur le Mersenne Twister. Il est plus rapide et a une meilleure période (2^19937 contre 2^31 pour rand). Beaucoup l'utilisent encore comme une version « avancée » :



<?phpfunction generateTokenMtRand($length = 32) {    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';    $token = '';    for ($i = 0; $i < $length; $i++) {        $token .= $chars[mt_rand(0, strlen($chars) - 1)];    }    return $token;}?>


Mais il y a un piège. Le Mersenne Twister est cryptographiquement non sécurisé. À partir d'une séquence de 624 nombres générés, on peut reconstituer l'état interne du générateur et prédire toutes les valeurs futures. Pour une attaque sur un jeton de réinitialisation de mot de passe, c'est plus que suffisant.



Morale : mt_rand() est un excellent choix pour les simulations et les tests, mais pas pour la sécurité.



La sainte trinité : random_int(), CSPRNG et entropie



Depuis PHP 7.0, nous avons random_int() et random_bytes(). Ce sont des générateurs de nombres pseudo-aléatoires cryptographiquement sécurisés (CSPRNG). Qu'est-ce que cela signifie en pratique ?



  • Entropie : PHP collecte le « bruit » du système : le temps entre les frappes de touches, les mouvements de la souris, les paquets réseau, les interruptions de disque. Sous Linux, /dev/urandom est utilisé, sous Windows, CryptGenRandom.
  • Imprévisibilité : Même en connaissant l'algorithme, on ne peut pas reconstituer la graine ou prédire le nombre suivant.
  • Distribution uniforme : Chaque octet apparaît avec une probabilité exacte de 1/256.


Voici à quoi ressemble un générateur de chaînes aléatoires correct en PHP

Blogs

Book Recommendations