Bon, petit cours sur les mots de passes. Mettez votre ceinture et avalez un aspirine 
La sécurité d’un mot de passe se base principalement sur 2 choses :
-
le mot de passe utilisé en lui-même : “1234” sera bien plus facile à trouver que “x7kG9éa#”) ;
-
l’algorithme de hashage utilisé : comme je l’ai expliqué, le MD5 ne vaut plus grand chose à l’heure actuelle comparé au SHA-256.
Comme c’est précisé sur le second site que je t’ai passé, il existe 3 méthodes pour retrouver un mot de passe (en excluant le keylogger, le flingue sur la tempe ou choses de ce genre bien sûr) :
-
le brute force : on teste les mots de passes un à un ; très long, mais fini par fonctionner dans 100% des cas si on a assez de temps (et donc de ressources) ;
-
le dictionnaire : si on utilise un mot comme “bonjour1234”, il est très probable qu’il soit dans des dictionnaires préétablis ;
-
les rainbow tables : une fois qu’un hash a été calculé, on l’enregistre dans une table avec sa correspondance en clair, ce qui permet à n’importe qui d’utiliser par la suite ces associations pour retrouver instantanément le mot de passe en clair à partir du hash.
Pour tester la résistivité du mot de passe au brute force, il suffit de définir des règles simples du style : inclure au moins 2 minuscules + 2 majuscules + 2 chiffres + 2 caratères spéciaux, avec une longueur totale d’au moins 15 caractères. Là on est sûr d’avoir un mot de passe difficilement crackable par brute force, car il faudra utiliser tout le jeu de caractères disponibles sur une longueur importante pour trouver le mot de passe. C’est très coûteux en temps, ou alors en ressources si on souhaite diminuer le temps (à chaque caractère qu’on rajoute, cela augmente le temps de brute force de manière exponentielle).
Ensuite le dictionnaire : la règle est de n’utiliser aucun mot de passe qui puisse être compris par un être humain, ou aucune suite facile à retenir. Les attaques par dictionnaires peuvent être intelligentes, c’est-à-dire combiner plusieurs mots de passes du dictionnaire pour en former d’autres, ou utiliser des mots de passes du dictionnaire en rajoutant un bout de brute force. Ainsi, utiliser “bonjour7Gx” est moins sécurisé que d’utiliser “1éFkg2”, bien que le premier soit plus long que le deuxième. Evidemment, il faut absolument bannir tout mot de passe du style “coucou”, “pouet”, etc., les attaques par dictionnaires étant les premières réalisées sur un mot de passe grâce à la rapidité d’exécution qu’elles procurent.
Enfin, les attaques par rainbow tables : il faut dans un premier temps regarder quel algorithme de hashage a été utilisé.
S’il s’agit du MD5, les tables complètent existent en téléchargement gratuit, donc il faut partir du principe qu’un cybercriminel désireux de pirater vos comptes se sera payé le luxe d’avoir quelques disques de 1 To pour stocker la totalité des rainbow tables du MD5, et pourra donc retrouver n’importe quel mot de passe MD5 en quelques minutes.
Il existe alors différents algorithmes de hashage plus ou moins sécurisés. Et leur sécurisation ne dépend pas uniquement de la taille du hash, car il existe des failles mathématiques qui permettent dans certains cas d’accélérer les calculs de hashes, ce qui permet de gagner du temps dans la génération des hashes, ou par exemple si on trouve une relation du style “si le hash contient un ‘k’, alors le mot de passe contient au moins un ‘z’”. Ainsi, l’algorithme de hashage reconnu comme étant le plus sûr actuellement est SHA-512. Il mesure 512 bits, soit 64 caractères alphanumériques, ce qui donne 36^64 combinaisons de mots de passes différents, soit 40 milliards de milliards de fois le nombre d’atomes dans l’univers… Bon courage à celui qui voudrait générer la rainbow table ! Il est tout simplement impossible de stocker les résultats en entier (à moins de disposer d’un ordinateur quantique, mais on n’en est pas là). Attention toutefois : en règle générale, plus le hashage est sécurisé, plus il faut de ressources pour générer le hash, ce qui peu être coûteux en performances dans certains cas (si on a beaucoup de comptes à gérer en même temps sur un serveur notamment).
On peut également ajouter que les algorithmes de hashage peuvent être fortement améliorés en rajoutant ce que l’on appelle une graine entre le mot de passe en clair et le hash. J’explique : si le hash de “azerty” est “1234abcd” (je dis n’importe quoi pour l’exemple), alors si on connaît le hash on va pouvoir dire que le mot de passe est “azerty”. Mais si avant de calculer le hash j’ai rajouté une lettre au mot de passe pour former par exemple “azertyx” (“x” étant la graine), le hash sera modifié et deviendra par exemple “4567plom”. Et la personne qui regardera ce qui se trouve en face de “4567plom” tombera sur un mot de passe en clair qui est “azertyx”, alors que le mot de passe d’origine est “azerty”. Donc on ne retrouve pas le mot de passe d’origine grâce à une rainbow table dans ce cas ! Et si on change de graîne pour chaque nouveau mot de passe, alors il faudrait générer toutes les rainbow tables à nouveau pour chaque nouveau mot de passe, ce qui finalement revient à faire du brute force. Mais attention : si le pirate est capable de deviner quelle graîne est utilisée, il pourra peut être retrouver facilement le mot de passe en clair (il n’aura qu’à enlever la graine pour retrouver le mot de passe d’origine). Ou même, si la graine est trop facile comme dans notre exemple, il lui suffira de prendre quelques secondes de plus pour retrouver le bon mot de passe. Après on peut toujours améliorer le crackage en découvrant des failles mathématiques, mais ça complique quand même sacrément la chose ! Au passage, inutile de vous dire quel OS utilise une graîne et lequel n’en utilise pas…
Donc en conclusion, pour vérifier si un mot de passe peut tenir le choc, il faut vérifier que :
- la longueur du mot de passe est suffisamment grande ;
- le mot de passe contient différents types de caractères ;
- le mot de passe ne contient aucune expression contenue dans un dictionnaire ;
- l’algoritme de hashage est suffisamment sûr ;
- le système de gestion des mots de passe utilise une graine.
Dans le cas où on voudrait savoir si un mot de passe est résistant de manière générale (ie. sans connaître le système sur lequle il sera utilisé), il faut tester les 3 premiers points, les 2 derniers ne dépendant généralement pas de l’utilisateur final. Et c’est souvent là le problème, car on peut avoir le meilleur mot de passe du monde, s’il est stocké en clair dans un fichier c’est moyen…
Un dernier conseil : changer régulièrement de mot de passe aide à se prémunir des vols. En effet, si quelqu’un arrive un jour à dérober le mot de passe, on peut toujours espérer qu’il n’arrivera pas à dérober le prochain ou que cela lui demande trop de temps pour qu’il soit encore valide quand il voudra l’utiliser.
Donc lol, pour ton projet, le mieux c’est que tu testes la longueur du mot de passe, les types de caractères qu’il contient, et enfin que tu installes des dictionnaires pour effectuer une attaque par dictionnaires sur le mot de passe (c’est relativement rapide).
Pour les 2 derniers points, tu ne peux malheureusement rien prédire si tu ne connais pas le système sur lequel le mot de passe sera utilisé.