La taille, ça compte

Tu as dû l'entendre ou le lire des centaines de fois lors de la création de tes mots de passe sur telle ou telle plateforme… Et c'est une idée reçue bien tenace malheureusement. Mais pourquoi ?

Un ordinateur n'est pas un être humain

Au cas où tu ne l'aurais pas remarqué, même avec les pseudos progrès sur l'intelligence artificielle, un ordinateur ne « pense » pas comme un être humain. Et pourtant on continue de penser que si un mot de passe semble complexe, alors un ordinateur aura beaucoup de mal à l'hacker.

Et si on pensait autrement, avec quelques éléments de démonstration ?

Je parle ici de recherche et de tests de mots de passe avec l'aide d'un ordinateur, pas d'erreurs purement humaines. Erreurs qui consistent entre autres à utiliser le même mot de passe partout ou encore à s'envoyer des mots de passe par email… Ce n'est pas le sujet de cet article.

Parlons de l'ordinateur binaire et de sa « méthode » pour cracker un mot de passe.

De quoi on parle, et comment caractériser un mot de passe.

Avant de continuer, on va définir ce dont on parle et ce qui est distinguable dans un mot de passe :

  1. L'alphabet, ou la complexité \(c\)
  2. La longueur \(l\)

L'alphabet est la famille de caractères dont on se sert pour former le mot de passe (le fameux minuscules, majuscules, chiffres et symboles…). Plus un alphabet est fourni, plus le mot de passe sera considéré comme « compliqué ».

La longueur d'un mot de passe, c'est tout simplement le nombre de caractères qu'il contient.

Maintenant qu'on a défini ces deux éléments, on va expérimenter et voir lequel des deux est le plus important, la longueur ou la complexité ?

Une histoire de taille

La première chose, celle qui est la plus importante, c'est la taille (en tout cas pour un mot de passe). Plus le mot de passe est court et moins il y aura de combinaisons à tester, donc plus il sera aisé à cracker. Faisons un tout petit peu de combinatoire : - Si on prend l'ensemble des minuscules, on a 26 caractères (\o/) - Si on y ajoute l'ensemble des majuscules, on en a 52. - Si on y ajoute les chiffres (0-9) on a en tout 62 caractères différents. - Et enfin si on ajoute les caractères « spéciaux » (13 éléments) on se retrouve avec un ensemble de 75 caractères distincts.

Faisons un peu de maths et gardons en mémoire nos ensembles, qu'on va appeler alphabets :


\[ (A_1) = \{ abcd\dots{}wxyz \} \] \[ (A_2) = (A_1) \cup \{ ABCD\dots{}WXYZ \} \] \[ (A_3) = (A_2) \cup \{ 0123456789 \} \] \[ (A_4) = (A_3) \cup \{ \&@,;:?/\%*\#.!- \} \]


La taille minimale de notre alphabet est donc de 26 \( (A_1) \) et la taille maximale ici est de 75 \( (A_4) \)

La question à se poser en matière de décryptage de mot de passe est « en combien de temps ». Je te propose donc d'évaluer le temps que cela prendrait pour hacker un mot de passe en fonction de la complexité de son alphabet et de sa longueur.

La méthode

Pour la suite, on va noter \( n \) le nombre de mots de passe possibles pour une longueur et une complexité données.

La démonstration repose sur l'équation de combinatoire : \[(1) \quad n = c^l \]

Petite explication si tu es allergique aux mathématiques, tu verras, une fois qu'on y met du français, ça passe. Déjà ce que dit l'équation \( (1) \), c'est que \( n \), le nombre total de mots de passe possibles, est égal à la complexité \( c \), exponentiellement à la longueur \( l \). C'est encore flou ? C'est normal, je te donne un exemple :

Je me connecte sur un site et je choisis un mot de passe de 4 caractères, avec simplement des lettres minuscules (donc un choix parmi 26 caractères), j'ai donc \( c = 26 \) et \( l = 4 \) le nombre total de mots de passes différents que je peux former est défini par le processus :

  1. Je choisis 1 lettre dans les 26 pour la 1re lettre du mot de passe, j'ai 26 possibilités.
  2. Je choisis 1 lettre dans les 26 pour la 2e lettre du mot de passe, j'ai encore 26 possibilités.
  3. Je choisis 1 lettre dans les 26 pour la 3e lettre du mot de passe, j'ai toujours 26 possibilités.
  4. Je choisis 1 lettre dans les 26 pour la 4e lettre du mot de passe, j'ai... 26 possibilités.

Au final, je peux former \( 26\times26\times26\times26 = 26^4 = c^l \) mots de passes différents. Au cas où tu te demandes, cela fait \(456\ 976\) mots de passe à tester (au maximum) pour cracker mon mot de passe.

Et la différence entre l'humain et l'ordinateur se pose ici, cela peut sembler énorme, mais en vrai 450 mille possibilités pour un ordinateur, c'est que dalle. On va voir combien de temps un simple serveur AWS met pour trouver mon mot de passe.

Comme je suis un peu fainéant, et que je n'ai pas de serveur à louer pour l'expérience, je vais simplement me baser sur cet article sur Hackernoon. Pour résume, l'auteur fait l'expérience de cracker plusieurs mots de passe avec un serveur loué $0.90 de l'heure et qui peut calculer 800 millions de combinaisons cryptées par seconde.

Il a mis 14 millions de mots de passe à trouver, et a fait tourner son serveur pendant 20 heures, et en 20 heures il a cracké 11 millions de mots de passe, pour $0.90 de l'heure. Donc finalement il a dépensé $18.00 ce qui fait environ $1.60 par million de mots de passe, rentable none ?

Autrement dit, un serveur de ce type, capable de calculer 800 millions de combinaisons par seconde, pour notre mot de passe de 4 chiffres, c'est vraiment que dalle.

Le nombre de combinaisons

On va s'amuser maintenant à calculer le nombre de combinaisons de mots de passe en fonction de la longueur et de la complexité.

Petit aparté sur l'écriture des résultats pour les non-scientifiques : \(200\times10^5\) signifie 200 avec 5 zéros en plus. Donc \(2\times10^{11}\) correspond à \(200\ 000\ 000\ 000\). Oui, on va manipuler des chiffres assez gros.

Tableau récapitulatif des combinaisons possibles en fonction de la longueur et de la complexité (valeurs tronquées).

Pour simplifier je n'ai mis que les ordres de grandeur (les puissances de 10) car c'est déjà bien parlant.

\(A_1 \ (26) \) \(A_2 \ (52) \) \(A_3 \ (62) \) \(A_4 \ (75) \)
\(8\) \(26^8 \sim 10^{11}\) \(52^8 \sim 10^{13}\) \(62^8 \sim 10^{14}\) \(75^8 \sim 10^{15}\)
\(9\) \(\sim 10^{12}\) \(\sim 10^{15}\) \(\sim 10^{16}\) \(\sim 10^{16}\)
\(10\) \(\sim 10^{14}\) \(\sim 10^{17}\) \(\sim 10^{18}\) \(\sim 10^{18}\)
\(11\) \(\sim 10^{15}\) \(\sim 10^{18}\) \(\sim 10^{19}\) \(\sim 10^{20}\)
\(12\) \(\sim 10^{17}\) \(\sim 10^{20}\) \(\sim 10^{21}\) \(\sim 10^{22}\)
\(13\) \(\sim 10^{18}\) \(\sim 10^{22}\) \(\sim 10^{23}\) \(\sim 10^{24}\)
\(14\) \(\sim 10^{20}\) \(\sim 10^{24}\) \(\sim 10^{25}\) \(\sim 10^{26}\)
\(15\) \(\sim 10^{21}\) \(\sim 10^{25}\) \(\sim 10^{27}\) \(\sim 10^{28}\)

Que peut-on dire de ce tableau ?

Déjà que les différences concernant la complexité ne sont pas folles, pour une longueur de 8, on passe d'une puissance 11 à une puissance 15. Alors qu'on voit que simplement rajouter 2 lettres sur un alphabet simple fait passer d'une puissance 11 à une puissance 14. Deux lettres de plus en longueur représentent une multiplication par 1000 là où avoir le même résultat en complexité demande de rajouter 49 caractères en plus dans l'alphabet (et les utiliser, ce qui est paradoxal en un sens, comment utiliser ces 49 caractères dans une chaîne de 8 ?).

L'investissement n'est clairement pas le même.

Autrement dit, la longueur du mot de passe semble avoir beaucoup plus d'importance que sa complexité.

et c'est compréhensible en un sens, si on reprend l'équation \( (1) \ n = c^l \), le chiffre en exposant est la longueur, pas la complexité. Autrement dit \(n\) augmente exponentiellement par rapport à la longueur et linéairement par rapport à la complexité.

Mais je pense que c'est en termes de temps que les chiffres sont beaucoup plus parlants.

Temps maximal passé pour un serveur loué $0.90 par heure pour décrypter toutes les combinaisons possibles :

\(A_1 \ (26) \) \(A_2 \ (52) \) \(A_3 \ (62) \) \(A_4 \ (75) \)
\(8\) \(261\mathrm{s} \simeq 4\mathrm{min}\) \(18\mathrm{h}30\) \(3\mathrm{jours}\) \(14\mathrm{jours}\)
\(9\) \(1\mathrm{h}53\) \(40\mathrm{jours}\) \(6\mathrm{mois}\) \(2\mathrm{ans}\ 11\mathrm{mois}\)
\(10\) \(49\mathrm{h}\) \(5\mathrm{ans}\ 8\mathrm{mois}\) \(33\mathrm{ans} \) \(223\mathrm{ans}\)
\(11\) \(53\mathrm{jours}\) \(298\mathrm{ans}\) \(2062\mathrm{ans} \) \(16740\mathrm{ans}\)
\(12\) \(3\mathrm{ans}\ 9\mathrm{mois}\) \(15493\mathrm{ans}\)
\(13\) \(98\mathrm{ans}\)
\(14\) \(2556\mathrm{ans}\)

Pas mal hein ?

Pour schématiser, un mot de passe de 14 lettres, qui ne contient que des lettres minuscules (donc qu'on pense être faible) est plus robuste qu'un mot de passe de 10 caractères qui mélange lettres, chiffres et symboles spéciaux.

Et je te fais grâce du coût pour les décrypter.

Pourquoi je m'embête à te montrer ça ?

Déjà parce que j'ai lu cet article en complément de celui d'Hackernoon. Et je dois dire qu'ayant rencontré une quinzaine de fois le souci de devoir développer 15 expressions régulières pour soi-disant sécuriser les mots de passe, j'ai voulu en savoir plus sur la véracité et pas seulement me dire « bah comme tout le monde le fait, c'est que c'est sécurisé ». Bottom line, c'est de la merde.

Le nombre de clients qui nous demandent de mettre une vérification sur la complexité mais sans vérification de longueur, ou alors avec juste une longueur 8…. C'est faire la moitié du travail, et en matière de sécurité, faire la moitié du taff, c'est ne pas faire de sécurité du tout.

Et en matière de développement, faire un test de longueur, c'est toujours plus rapide, plus maintenable et beaucoup, beaucoup plus rentable que faire 15 tests qui ne riment à rien et qui suivent une mode.

Donc la prochaine fois que tu entends parler de sécurisation de mots de passe et que tes interlocuteurs parlent seulement de caractères spéciaux, tu pourras leur démontrer que se baser uniquement sur la complexité, ce n'est pas si sécurisant que ça en a l'air, tout simplement parce qu'un ordinateur ne « pense » pas comme nous. Ce n'est pas parce qu'un mot de passe est dur à lire pour un humain, qu'il sera dur à décrypter pour une machine. Comme quoi, la taille, ça compte.

Sinon pour le commun des mortels, que fait-on ?

Si tu n'es pas développeur et que tu veux simplement sécuriser tes accès, déjà merci d'avoir lu jusqu'ici. Le plus simple et le plus sécurisant selon moi, c'est d'utiliser un gestionnaire de mots de passe, on a de plus en plus tendance à s'inscrire sur 200 sites (et la tendance ne va pas aller en s'arrangeant) donc avoir un outil pour ne pas utiliser 50 fois le même mot de passe, c'est essentiel. En outre, concernant la fameuse double authentification, chacun fait comme il veut, je ne suis pas fan dans le sens ou si je perds mon téléphone, je n'ai plus aucun accès nulle part… Cependant, c'est une bonne valeur.

Conclusion

Je râle pas mal sur le sujet des mots de passe, mais qu'on soit clairs, le meilleur mot de passe possible seait un mot de passe généré par un gestionnaire de mots de passe, d'une longueur d'au moins 32 caractères pris dans un alphabet de 256 caractères distincts. Mais, le jour ou pour une raison x ou y tu dois le taper à la main parce que ton gestionnaire de mots de passe ne fonctionne pas sur telle ou telle machine… Bonne rigolade, expérience vécue récemment.

Les Sources :