# Générateur de mots de passe aléatoires

Un générateur de mots de passe aléatoires (en anglais, random password generator) est un programme informatique ou un périphérique informatique qui prend en entrée un générateur de nombres aléatoires ou pseudo-aléatoires et génère automatiquement un mot de passe.
Des mots de passe aléatoires peuvent être générés manuellement, à l'aide de sources aléatoires simples, telles que des dés ou des pièces de monnaie, ou à l'aide d'un ordinateur en utilisant un programme approprié.
Bien qu'il existe de nombreux générateurs de mots de passe aléatoires disponibles sur Internet, la génération de caractères aléatoires peut être délicate et de nombreux programmes ne génèrent pas des caractères aléatoires assurant une sécurité forte. Une recommandation courante consiste à utiliser des générateurs de mots de passe aléatoires open source dans la mesure du possible, car ils permettent de contrôler la qualité des méthodes utilisées.
Notez que le simple fait de générer un mot de passe de manière aléatoire ne garantit pas que le mot de passe est un mot de passe fort, car il est possible, bien que très improbable, qu'un mot de passe généré aléatoirement soit facile à deviner ou à décrypter. En fait, un mot de passe n'a pas besoin d'être généré par un processus parfaitement aléatoire : il suffit qu'il soit suffisamment difficile à deviner.
Un générateur de mots de passe aléatoires peut faire partie d'un gestionnaire de mots de passe. Lorsqu'on veut utiliser des mots de passe implantant des règles complexes, il peut être plus facile de laisser la génération et la mémorisation des mots de passe à un gestionnaire de mots de passe.

## Une approche naïve et inadéquate

Un programmeur ne connaissant pas les limites des générateurs de nombres aléatoires des bibliothèques logicielles pourrait implémenter un générateur du type suivant :
Dans ce cas, la fonction rand, qui est un générateur de nombres pseudo-aléatoires, est initialisé à l'aide de la fonction time. Selon la norme ANSI C, la fonction time retourne une valeur définie par l'implémentation, mais le plus souvent il s'agit d'un entier de 32 bits contenant le nombre de secondes depuis le 1er janvier 1970 (voir : Heure Unix). Il y a environ 31 millions de secondes dans une année, donc un attaquant qui connaît l'année de création du mot de passe (une information connue dans les cas où la modification fréquente du mot de passe est imposée par une politique des mots de passe) et le processus de création du mot de passe fait face à un nombre relativement petit, par des normes cryptographiques, des possibilités à tester. Si l'attaquant sait plus précisément quand le mot de passe a été généré, cela réduit encore plus le nombre de mots à tester, ce qui constitue une grave faiblesse de cette implémentation.
Dans les cas où l'attaquant peut obtenir une version chiffrée du mot de passe, des tests vérifiant quelques millions de mots de passe potentiels peuvent être effectués en quelques secondes. Voir l'article Cassage de mot de passe.
La fonction rand a une autre faiblesse. Tous les générateurs de nombres pseudo-aléatoires ont une mémoire interne, aussi appelée état. La taille de cet état détermine le nombre maximal de valeurs différentes qu'il peut générer : un état de n bits peut produire au plus $2^{n}$ valeurs différentes. Sur de nombreux systèmes, l'état est enregistré sur 31 ou 32 bits, ce qui constitue une limitation de sécurité importante. La documentation de Microsoft ne décrit pas l'état de la fonction rand dans Visual C++ , mais elle n'a que 32767 sorties possibles (15 bits). Microsoft recommande l'utilisation d'une fonction différente, plus sécurisée, la fonction rand_s. Selon Microsoft, la sortie de rand_s est sécurisée sur le plan cryptographique et n'utilise pas le germe utilisé par la fonction srand. Cependant, son interface de programmation diffère de rand.
Certaines fonctions renvoient l’horodatage Unix en microsecondes, par exemple, la fonction PHP microtime. Cela augmente le nombre de possibilités, mais quelqu'un ayant une bonne idée du moment où le mot de passe a été généré, par exemple la date à laquelle un employé a été embauché, fait face à un espace de recherche relativement petit. De plus, certains systèmes d’exploitation ne fournissent pas le temps avec une résolution en microsecondes, ce qui réduit considérablement le nombre de valeurs à essayer. Enfin, la fonction rand de PHP utilise généralement la fonction rand du langage C qui peut avoir un nombre limité d'états, en fonction de la manière dont elle est implémentée.
Un autre générateur de nombres aléatoires, mt_rand, basé sur le générateur de nombres pseudo-aléatoires Mersenne Twister, est disponible en PHP, mais il possède également un état de 32 bits. Il existe des propositions pour ajouter une fonction de génération de nombres aléatoires forts à PHP.

## De meilleures méthodes
### De meilleurs logiciels

Il existe des logiciels pour générer des mots de passe aléatoires forts, sécurisés de manière cryptographique. Sur les plateformes Unix, /dev/random et /dev/urandom sont couramment utilisés, soit par programme, soit conjointement avec un programme tel que makepasswd.
Les programmeurs Windows peuvent utiliser la fonction CryptGenRandom (en) de la Cryptographic Application Programming Interface. Le langage de programmation Java inclut une classe appelée SecureRandom. Une autre possibilité consiste à générer un nombre aléatoire en mesurant un phénomène externe, tel que le temps entre la réception de deux caractères du clavier de l'ordinateur.
De nombreux systèmes informatiques ont déjà une application (généralement appelée apg) pour implémenter la norme fédérale de traitement de l'information du gouvernement américain FIPS 181 - Automated Password Generator définie en 1993. Cette norme décrit un processus de conversion de bits aléatoires (provenant d'un générateur de nombres aléatoires matériel) en mots relativement prononçables, convenant à une phrase secrète. Cependant, dès 1994, une attaque contre l'algorithme FIPS 181 a été découverte, de sorte qu'un attaquant peut s'attendre, en moyenne, à casser 1 % des mots de passe basés sur cet algorithme, après avoir recherché seulement 1,6 million de mots de passe. Cela est dû à la non-uniformité dans la distribution des mots de passe générés. Cette faiblesse de l'algorithme peut être amoindrie en utilisant des mots de passe plus longs ou en modifiant l'algorithme$^,$.

### Une méthode mécanique

Une autre méthode efficace consiste à utiliser des dispositifs physiques tels que des dés pour générer des caractères aléatoires. Une méthode simple consiste à utiliser une table de caractères de dimensions 6 sur 6. Le premier jet d'un dé sélectionne une ligne de la table et le second une colonne. Ainsi, un résultat de 2 suivi d'un résultat de 5 sélectionne la lettre k du tableau ci-dessous.
Pour générer des caractères majuscules, des caractères minuscules ou certains symboles, on peut utiliser une pièce de monnaie, avec la convention que pile donne une majuscule et face donne une minuscule. Pour les chiffres, pile conserve le chiffre et face remplace le chiffre par le symbole au-dessus du chiffre sur un clavier d'ordinateur.
    123456 1 a b c d e f 2 g h i j k l 3 m n o p q r 4 s t u v w x 5 y z 0 1 2 3 6 4 5 6 7 8 9

## Robustesse du mot de passe généré

La robustesse d'un mot de passe est la mesure de la capacité d'un mot de passe à résister à une attaque par force brute. La robustesse d'un mot de passe est le nombre moyen de tentatives nécessaires à un attaquant n'ayant pas accès direct au mot de passe pour le découvrir. La robustesse d'un mot de passe est une fonction de sa longueur, du nombre de caractères permis dans le mot de passe et du caractère aléatoire des caractères dans le mot de passe.

## Programmes générateurs de mots de passe et Internet

Un grand nombre de générateurs de mots de passe aléatoires sont disponibles sur Internet. Leur qualité varie grandement et cette qualité est difficile à évaluer en absence d'une description claire de la source des caractères aléatoires utilisés et si le code source n’est pas disponible pour permettre le contrôle des allégations des éditeurs des générateurs.
Plus important encore, transmettre des mots de passe sur Internet soulève des problèmes de sécurité évidents, en particulier si la connexion au site de génération de mots de passe n'est pas correctement sécurisée ou si le site est compromis d'une manière ou d'une autre. Sans canal sécurisé, il est impossible d'empêcher l'écoute clandestine, en particulier sur des réseaux publics tels qu'Internet.
Une solution à ce problème consiste à générer le mot de passe sur l'ordinateur de l'utilisateur à l'aide d'un langage de programmation tel que JavaScript. L'avantage de cette approche est que le mot de passe généré reste sur l'ordinateur de l'utilisateur et n'est pas transmis vers ou depuis un serveur externe.