Mots de passe : Complexité et enjeu

Les mots de passe sont parmi les plus gros enjeux du monde numérique

Introduction:

Les mots de passe , ce fameux " mot" que toute personne initiée au monde numérique de nos jours connait et en possède au moins un ... ou souvent plusieurs pour ces usages quotidiens , en effet ce fameux sésame est utilisé pour protéger nos données et applications de différentes nature en y sécurisant l’accès .

Mais comme on pouvait s'y attendre , des personnes malveillantes font au fil du temps preuve d'une ingéniosité sans pareil pour cracker ces mots de passes , dans le but d'avoir un accès non autorisé à une quelconque donnée protégée .

Ces méthodes de crack plus au moins efficaces qui sont nombreuses : par dictionnaire , par Brut Force , BackTrack ... font que la combinatoire des mots de passe joue un rôle crucial pour la résistance de ces derniers , ce qui fait que le véritable enjeu est principalement le temps de recherche nécessaire pour retrouver la combinaison idéale .

Nous présenterons dans ce qui suit le lien entre des concepts mathématiques tel que la combinatoire des mots de passe , le hachage , et la fiabilité des mots de passes via leur résistance aux différentes attaques

Pourquoi est il recommandé d'utiliser un mot de passe complexe ?

Les mots de passe sauvegardés dans une base de données d'un serveur sont souvent longs (c-à-d : supérieurs à 12 caractères), contenants des caractères spéciaux, des majuscules et minuscules ainsi que des chiffres.

Piratage du réseau social VKontakte

En effet un mot de passe qui contient toutes ces propriétés est considéré comme étant plus fiable et complexe, mais alors comment évaluer la complexité d’un mot de passe ? Ceci consiste à trouver son entropie qui revient à mesurer (en bits) son imprédictibilité, et donc la difficulté qu’un attaquant rencontrera à découvrir le mot de passe.

Une histoire de combinatoire ...

En effet plus on agrandit l'entropie mieux c'est, si un mot de passe a 40 bits d’entropie, cela signifie qu’il est aussi difficile à deviner qu’un mot de passe aléatoire composé de 40 caractères parmi {0, 1} (40 bits donc). Autrement dit, lors d’une attaque par force brute, il est nécessaire d’évaluer 2⁴⁰ possibilités pour épuiser tous les mots de passes équivalents et être sûr de découvrir le mot de passe. Cela signifie également que lorsque un mot de passe gagne 1 bit d’entropie, sa complexité est multipliée par 2 .

remarque:

L'entropie est une mesure de la robustesse d'un mot de passe qui dépend de plusieurs facteurs parmi ces derniers on compte la longueur du mot de passe

Les différentes attaques qu'un mot de passe peut subir

Résultat de recherche d'images pour "hacker"
Les pirates font preuve d'ingéniosité pour cracker les mots de passe les plus difficiles

Souvent les mots de passes sont confrontés à différentes tentatives de crackage, dans ce qui suit nous présentons les attaques les plus répandues :

1/Attaque par force brute :

Cette dernière fonctionne selon le principe d'utiliser toutes les possibilités de mots de passe, pour chaque possibilité on calcule le Hash Code du mot de passe, si c'est le même Hash Code, alors on a trouvé le mot de passe, en effet si on a un mot de passe de cinq lettres minuscules on a 26⁵ possibilités pour trouver le bon mot de passe et si on a le droit aussi a des lettres majuscules dans ce cas c'est 52⁵ et si l'on rajoutes les chiffres alors ça nous fait 62⁵ possibilités.

2/Attaque par dictionnaire:

Certains cyber pirates utilisent souvent des mots de dictionnaire, le principe est simple, si j'ai une liste de mots, je peux calculer l'empreinte numérique (hash) pour chacun de ses mots et comparer avec le hash qu'on veut craquer si c'est le même donc on a trouvé le mot de passe et plus la liste est longue plus on a la chance de le trouver et en même temps plus ça va prendre un temps plus conséquent pour parcourir la liste de tous les mots.

3/Attaque par dictionnaire avec remplacement:

C'est le même principe cité plus haut , sauf qu'on définit en plus une liste avec tous les remplacements qu'on peut rencontrer par exemple si le mot est soleil on remplace "o" par le chiffre "0"ou "i" par "1" et on calcule toutes les transformations du mot et pour chaque transformation on calcule le hash , en effet on peut en déduire que en quelque sorte c'est une façon d'optimiser le processus de recherche .

4/Attaque ciblée :

Dans ce cas on prend une liste de mots reliée a une personne puis on regarde toutes les combinaisons possibles entre les mots de la liste, pour chaque possibilité on calcule et hash et on le compare avec le hash du mot de passe .

Pourquoi les méthodes md5 et le principe du salage ne sont pas fiables ?

Le MD5, pour  Message Digest 5, est une fonction de hashage cryptographique qui permet d'obtenir l'empreinte numérique d'un fichier (on parle souvent de message). Il a été inventé par Ronald Riverst en 1991 .

En principe les mots de passe sont stockés hachés dans le serveur, et à chaque connexion le mot de passe saisi est haché et comparé au mot de passe haché stocké dans le serveur, si un pirate décide et réussit à récupérer le mot de passe stocké dans le serveur, et trouver la fonction de hachage ce qui est facile car c'est toujours la même "en utilisant les méthodes présentées dans la question précédente", dans ce cas il a réussi a récupérer le bon mot de passe .

Dans le but d’améliorer la méthode md5 et à fin de compliquer la recherche du mot de passe un sel est ajouté pour chaque utilisateur, souvent aléatoire qui est ajouté au mot de passe avant le hachage .

Lors de la connexion au site, le serveur récupère le mot de passe saisi par le client ,trouve le sel correspondant à l’utilisateur et lui applique la fonction de hachage

Le pirate n'a pas accès au sel mais seulement au mot de passe sauf si le pirate réussira à trouver le sel .

Un peu de Combinatoire ...

Combinatoire et probabilité

Sauriez-vous par exemple calculer le nombre de mots de passe possibles en combinant le jour de naissance d'une personne, son nom et son prénom?

c'est simple ! On va diviser notre travail en plusieurs parties :

  • Un jour de naissance contient 2 chiffres : un premier chiffre compris entre 0 et 3, il peut donc prendre 4 valeurs (0,1,2,3) et un deuxième entre 0 et 9. donc le nombre de combinaisons possibles est calculé comme suit: σ₁ = 2 + (³⁄₁)(¹⁰⁄ ₁)
  • Le nom et le prénom sont presque la même chose du point de vue de calcule de nombre de combinaison (c'est une suite de lettres, il y a que la taille qui change), chaque lettre du nom ( ou prénom) est choisie parmi 52 lettres 26 minuscules et 26 majuscules :


σ₂ = ∑ ( (⁵⁶⁄ ₁) )
ⁱ⁼¹ u : nombre de lettres du nom (ou prénom ) .

Une fois les sous calculs sont faits, on va juste on va obtenir : G =

ᵤ ᵥ
∑ (⁵⁶⁄ ₁ ) × ∑ (⁵⁶⁄ ₁ ) × (2 + (³⁄₁)(¹⁰⁄ ₁))
ⁱ⁼¹ ⁱ′⁼¹

u : nombre de lettres du nom ; v : nbr de lettres du prénom.

Générateur de mots de passe :

Nous présentons comme exemple ici un générateur de mots de passe a partir d'un dictionnaire donné écrit en langage Java .

Code Source :

import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;

public class PasswordGenerator {

private static final String LOWER = "abcdefghijklmnopqrstuvwxyz";
private static final String UPPER = LOWER.toUpperCase();
private static final String NUMBER = "0123456789";
private static final String OTHER_CHAR = "!@#$%&*()_+-=[]?";
static List<String> Dictionary = new ArrayList<String>();
static int nbr;


private static final String PASSWORD_BASE = LOWER + UPPER + NUMBER + OTHER_CHAR;
private static final String PASSWORD_BASE_SHUFFLE = shuffleString(PASSWORD_BASE);
private static final String PASSWORD_ALLOW = PASSWORD_BASE_SHUFFLE;

private static SecureRandom random = new SecureRandom();

public static String shuffleString(String string) {
    List<String> letters = Arrays.asList(string.split(""));
    Collections.shuffle(letters);
    return letters.stream().collect(Collectors.joining());
}

public static String generateRandomPassword(int length) {
    if (length < 1) throw new IllegalArgumentException();

    StringBuilder sb = new StringBuilder(length);
    for (int i = 0; i < length; i++) {

        int rndCharAt = random.nextInt(PASSWORD_ALLOW.length());
        char rndChar = PASSWORD_ALLOW.charAt(rndCharAt);

        // debugger 
        System.out.format("%d\t:\t%c%n", rndCharAt, rndChar);

        sb.append(rndChar);

    }

    return sb.toString();

}



public static void main(String[] args) {

    Dictionary.add("Mohand");
    Dictionary.add("Dyhia");
    Dictionary.add("Anis");
    Dictionary.add("Paris");
    System.out.println("Combien de lettres souhaitez vous rajouter:");
    Scanner sc = new Scanner(System.in);
    nbr = sc.nextInt();
    Random rand = new Random();
    String randomDictionaryElement = Dictionary.get(rand.nextInt(Dictionary.size()));

    // generate 5 random password with a dictionary word + nbr characters 
    for (int i = 0; i < 5; i++) {
        System.out.println("password : "+ randomDictionaryElement+ generateRandomPassword(nbr));
        System.out.println("\n");
    }

}

}

Exercice :

Pour ouvrir un compte sur Outlook, le site demande à l'utilisateur de créer un mot de passe contenant 6 à 8 caractères (lettres de a-z, chiffres 0-9) :

  • Combien de mots de passe différents peut-on former ?
  • Si on sait que les 4 premiers caractères sont des lettres, combien y-a-t-il de mots de passe possibles ?
  • combien de mots de passe possibles composés de 7 caractères contenants au moins un chiffre ?
  • Combien de mots de passe possibles si on sait qu'ils comportent le même préfixe (4 caractères) ?

Pour un compte Gmail, en plus des lettres de a-z et chiffres de 0-9 il exige au moins une Majuscule :

  • refaire les mêmes questions précédentes .

Sources :

Sources informations:

Sources images:

9 Cliquer pour recommander cet article