% Comment sécurisé ses mots de passe

# Introduction

Aujourd’hui, les mots de passe sont une partie intégrante de notre quotidien que ce soit pour accéder à notre boîte mail, notre compte bancaire, les réseaux sociaux, ou n’importe quels sites ou applications mobiles nécessitant un compte…
La sécurité de l'accès à tous ces sites repose bien souvent sur les mots de passe.

Malheureusement face à cette profusion de mots de passe, la tentation de réutiliser un même mot de passe sur plusieurs sites et de plus en plus importante ou pire d’utiliser des mots de passe plus courts et moins complexes pour mieux les retenir.
En effet ces mauvaises pratiques simplifient le travail d'individus malveillant qui pourraient accéder à vos comptes et vos données personnelles

![](https://external-preview.redd.it/qtVK8EXZh-WWgIqsk2S6xVuQuHKwuVoXGWxDtvDewxY.jpg?width=640&crop=smart&auto=webp&v=enabled&s=dd988230d32b19b5bcd4e5f443dd42e49a2bcd54)

# Comment les attaquants peuvent-ils accéder à vos mots de passe ?

Il existe plusieurs méthodes pour accéder à vos mots de passes, les trois plus connues sont les suivantes:

1. Le phishing
2. Le piratage de site
3. Le brute force

## Le phishing

Le phishing ou hameçonnage en français est une technique qui consiste à vous envoyer un message ou un mail qui se fait passer pour un site officiel et vous redirige avec un lien vers une fausse page de connexion contrôlée par les pirates. Quand vous rentrez votre mot de passe sur le site vous l’envoyer, en réalité, aux pirates.

## Le piratage de site

La technique de piratage de site consiste à compromettre le site, par exemple en trouvant une vulnérabilité sur celui-ci, la plus connue étant l’injection **SQL**. Elle permet de récupérer la base de donnée contenant tous les identifiants et les mots de passe. Il faut cependant savoir que par sécurité les mots de passe sont stockés sous forme de hash.

Le hachage est un processus de cryptographie qui prend un texte en entrée (un mot de passe ici) et produit une chaîne de caractères de longueur fixe (appelée hachage) qui est supposée être unique pour chaque entrée. Le même mot de passe entré plusieurs fois donnera toujours le même hash. Ainsi, lorsqu'un utilisateur entre un mot de passe, il est haché avant d'être envoyé à un serveur pour vérification. Le serveur stocke alors le hash du mot de passe au lieu du mot de passe en clair.

Ainsi, lorsque les pirates informatiques accèdent à la base de données, ils ne peuvent pas lire les mots de passe originaux car ils sont **hashés**. Pour vérifier si un utilisateur entre le bon mot de passe, le serveur hash le mot de passe entré par l'utilisateur et le compare au hash stocké dans la base de données. Si les deux sont identiques, cela signifie que le mot de passe entré est correct.

Le hachage est donc très utile pour protéger les mots de passe car il permet de vérifier l'identité d'un utilisateur sans avoir à stocker les mots de passe en clair et il rend les mots de passe illisibles pour les personnes non autorisées. Cependant, il est important de noter qu'il est possible de cracker les hash en utilisant des **dictionnaires de mots de passe** ou des méthodes de **force brute**, il est donc important d'utiliser des algorithmes de hachage sécurisés.

L'algorithmes de hachage le plus connu est surement **md5** mais il est très facile à casser. Les algorithmes de hachage les plus utilisés aujourd'hui sont **bcrypt**, **scrypt** et **argon2**. Par exemple le site [haveibeenpwned](https://haveibeenpwned.com/) utilise bcrypt pour hacher les mots de passe.

## Le brute force

La méthode de **brute force** peut aussi être utlisée pour tester des mots de passe directement sur la page de login d'un site web. C'est une méthode très simple mais qui est très **longue** et qui nécessite **beaucoup de ressources**. Elle consiste à tester tous les mots de passe possibles jusqu'à trouver le bon.

![www.hivesystems.io complexité des mots de passe](https://images.squarespace-cdn.com/content/v1/5ffe234606e5ec7bfc57a7a3/f3de51e0-6a28-4004-a604-4da9e0c43f69/*2018+MD5+%281xRTX2080%29.png?format=1000w)

Pour limiter le nombre de mots a tester, on peut utiliser un dictionnaire de mots de passe. Il existe plusieurs dictionnaires de mots de passe, le plus connu est [rockyou](https://en.wikipedia.org/wiki/RockYou) qui contient plus de 14 millions de mots de passe.

Dans ce cas les attaquant simule les requêtes de connexion en envoyant des requêtes avec des mots de passe différents. Si le site renvoie un message d'erreur, cela signifie que le mot de passe est incorrect. Si le site renvoie un message de succès, cela signifie que le mot de passe est correct.

Voici un exemple de script envoyant des requetes POST de connexion a un site hébergé localement:
```python
import requests

url = "http://localhost:5000/login"
data = {"username": "admin", "password": None}

passwords = []
with open("rockyou.txt", "r") as f:
    passwords = f.readlines()

for password in passwords:
    data["password"] = password
    r = requests.post(url, data=data)
    if "Invalid password" in r.text:
        print("Invalid password:", password)
    else:
        print("Valid password:", password)
```

# Comment sécuriser ses mots de passe ?

Il existe plusieurs méthodes pour sécuriser ses mots de passe, les plus connues sont les suivantes:

1. Utiliser un gestionnaire de mots de passe
2. Utiliser un générateur de mots de passe
3. Utiliser un mot de passe long et complexe
4. Utiliser un mot de passe unique pour chaque site
5. Activer la double authentification


## Utiliser un gestionnaire de mots de passe

Un **gestionnaire de mots de passe** est un logiciel qui permet de stocker tous vos mots de passe de manière sécurisée. Il permet de générer des mots de passe complexes et de les stocker de manière sécurisée. Il permet aussi de les synchroniser entre plusieurs appareils. Il existe plusieurs gestionnaires de mots de passe, les plus connus sont:

- [KeePassXC](https://keepassxc.org/) (open source)
- [Bitwarden](https://bitwarden.com/) (open source)
- [LastPass](https://www.lastpass.com/fr) (piraté en récemment)
- [1Password](https://1password.com/fr/)

## Utiliser un générateur de mots de passe

Un **générateur de mots de passe** est un logiciel qui permet de générer des mots de passe **complexes**. Un mot de passe fort est au minimum, selon l’ANSSI[^anssi], un mot de passe de 16 caractères comportant des chiffres, des minuscules, des majuscules et des caractères spéciaux.

[^anssi]: ANNSI: Agence Nationale de la Sécurité des Systèmes d'Information [Site web](https://www.ssi.gouv.fr/)


Voici un exemple de générateur de mots de passe en C:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define PASSWORD_LENGTH 16
#define CHAR_COUNT 94 // number of printable characters

int main() {
    srand(time(NULL)); // initialize random seed

    char *chars = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
    char password[PASSWORD_LENGTH + 1]; // +1 for null terminator
    int index;
    
    for (int i = 0; i < PASSWORD_LENGTH; i++) {
        index = rand() % CHAR_COUNT;
        password[i] = chars[index];
    }

    password[PASSWORD_LENGTH] = '\0';
    printf("Mot de passe: %s\n", password);
    return 0;
}
```

Pour tester la complexité d'un mot de passe, on peut utiliser les sites suivants:

- [howsecureismypassword.net](https://howsecureismypassword.net/)
- [www.ssi.gouv.fr](https://www.ssi.gouv.fr/administration/precautions-elementaires/calculer-la-force-dun-mot-de-passe/)

Ou utiliser la formule mathématique suivante:
$E = L \times \log_2(C)$

| Variable |                       Signification                        |
| :------: | :--------------------------------------------------------: |
|   $E$    |              entropie du mot de passe en bits              |
|   $L$    |                la longueur du mot de passe                 |
|   $C$    | nombre de caractères uniques utilisés dans le mot de passe |

Par exemple, si un mot de passe utilise un ensemble de caractères de 26 lettres minuscules, 26 lettres majuscules, 10 chiffres et 10 caractères spéciaux.Alors avec une longueur de 8 caractères, son entropie serait :\
$E = L \times \log_2(C)$ \
$E = 8 \times \log_2(26 + 26 + 10 + 10)$\
$E = 48.7$

Plus l'entropie d'un mot de passe est élevée, plus il est complexe et donc plus difficile à deviner.

## Utiliser un mot de passe unique pour chaque site

Il est important d'utiliser un mot de passe **unique** pour chaque site. Si un site est piraté, les pirates ne pourront pas accéder à vos autres comptes. On peut verifier si un site a été piraté en utilisant le site [haveibeenpwned](https://haveibeenpwned.com/). Il permet de verifier si un email ou un mot de passe a été piraté.

## Activer la double authentification

La **double authentification** est une méthode qui permet de sécuriser l'accès à un compte. Elle consiste à demander un code d'authentification supplémentaire lors de la connexion. Ce code peut être envoyé par **SMS** ou généré par une **application mobile**.
Ce systeme permet de sécuriser l'accès à un compte en cas de piratage du mot de passe. En effet, si un pirate parvient à pirater le mot de passe, il ne pourra pas accéder au compte car il ne possède pas le code d'authentification.


# Pandoc

Commande Bash utlisée pour convertir le fichier markdown en pdf:
```bash
pandoc -s -N --toc --mathjax -o index.html .\rapport.md
```

# Sources

- [https://www.ssi.gouv.fr/administration/precautions-elementaires/calculer-la-force-dun-mot-de-passe/](https://www.ssi.gouv.fr/administration/precautions-elementaires/calculer-la-force-dun-mot-de-passe/)
- [https://www.hivesystems.io/blog/are-your-passwords-in-the-green](https://www.hivesystems.io/blog/are-your-passwords-in-the-green)
- [https://fr.wikipedia.org/wiki/Rainbow_table](https://fr.wikipedia.org/wiki/Rainbow_table)
- [https://fr.wikipedia.org/wiki/Fonction_de_hachage](https://fr.wikipedia.org/wiki/Fonction_de_hachage)
- [https://docs.djangoproject.com/fr/4.1/topics/auth/passwords/](https://docs.djangoproject.com/fr/4.1/topics/auth/passwords/)
- [https://www.reddit.com/r/Bitwarden/comments/neet29/the_struggle/](https://www.reddit.com/r/Bitwarden/comments/neet29/the_struggle/)


<style>
    body {
        margin: 0 auto;
        max-width: 1000px;
        font-family: serif;
        font-size: 15px;
        line-height: 1.5;
    }
    h1, h2, h3, h4, h5, h6 {
        font-family: sans-serif;
        font-weight: bold;
    }

    /* ajout bordures */
    th, td {
        border-collapse: collapse;
        border: solid 1px #999;
        padding: 3px;
    }

    /* taille des images */
    img {
        max-height: 500px;
    }
    
</style>