TP authentification par mot de passe

Attention John the Ripper est installé automatiquement sur les postes Fedora après reboot des machines. Le script d’installation peut prendre une dizaine de minutes. Redémarrer rapidement puis lisez le sujet en entier et commencez à répondre aux questions où il n’y a pas besoin de John the Ripper.

Exploration des mots de passe sample-1.passwd

On donne les fichiers suivants :

Question 1.1 Quel est l’algorithme utilisé pour générer ces mots de passe ? Quels sont les sels ?

Question 1.2 Pour cet algorithme, combien de mots de passe John arrive-t-il à tester par seconde sur la machine que vous utilisez ?

Nous utiliserons John the Ripper pour la casser les mots de passes. Vous pouvez aussi utiliser https://hashcat.net/hashcat/ si vous avez un GPU sur votre machine personnelle. Vous pourrez avoir besoin de liste de mots de passe supplémentaires (paramètre --wordlist ou --stdin pour john) si le fichier password.lst par défaut de john est trop court. Voir par exemple sur https://github.com/danielmiessler/SecLists/tree/master/Passwords.

Question 1.3 Utiliser John the Ripper pour retrouver le mot de passe sample-1.passwd. Le mot de passe est très mauvais, un dictionnaire de mots de passes adapté au français assez court devrait suffire. Noter le mot de passe.

Question 1.4 Avec le mot de passe précédent et le sel, retrouvez le mot de passe haché avec la commande openssl passwd, noter la commande.

Exploration des mots de passe sample-2.passwd

On peut essayer sample-2.passwd avec John et sa liste de mot de passe, mais cela ne donnera pas grand-chose. En revanche, on sait que ce mot de passe est composé de huit chiffres.

Question 2.1 Combien existent-ils de mots de passes composés d’exactement huit chiffres ? D’au plus huit chiffres ?

Question 2.2 Plus généralement, si l’alphabet est de taille n (pour les chiffres, n=10), combien y a-t-il de mots de passes de longueur au plus k ?

Question 2.3 Utiliser le mode incrémental de John pour retrouver le mot de passe. Combien faut-il prévoir de temps ? Il n’est pas nécessaire d’aller au bout maintenant, car c’est un peu long, on peut passer à la suite.

On a désormais une information supplémentaire : le mot de passe de sample-2.passwd est une date d’anniversaire au format DDMMYYYY.

Question 2.4 Combien existent-ils de mots de passes possibles ?

Question 2.5 Utiliser le script suivant https://stackoverflow.com/questions/1060279/iterating-through-a-range-of-dates-in-python pour générer des dates et retrouver le mot de passe. Noter le mot de passe.

Génération de phrases de passe

Une méthode pour générer de bons mots de passe est illustrée ci-dessous dans https://xkcd.com/936/.

Password Strength, XKCD 936

Le site https://diceware.dmuth.org/ implémente la méthode illustrée avec une liste produite par l’EFF, voir https://www.eff.org/dice pour l’explication.

Question 3.1 Avec 5 dés, combien la liste EFF contient-elle de mots ? Le vérifier.

Question 3.2 On recommande de tirer 6 mots. Quelle est la taille de l’espace des mots de passe possible ? Combien cela fait-il de bits ?

Question 3.3 Si on considère l’espace utilisé par sample-2.passwd, combien de fois est-il plus grand ? Conclure.

Bibliothèque Python de gestion de mots de passe

On considère le script Python suivant. L’enregistrer et l’exécuter.

⚠️ Le comportement de la bibliothèque crypt a des problèmes sous MacOS, voir Stack Overflow. ⚠️

from crypt import crypt, mksalt, METHOD_SHA512
from getpass import getpass
from hmac import compare_digest


def checker(plaintext, reference) -> bool:
    return compare_digest(crypt(plaintext, reference), reference)


if __name__ == "__main__":
    with open("sample-1.passwd", "rt", encoding="utf-8") as file:
        ref = file.readline().strip()
        pwd = getpass()
        print(checker(pwd, ref))

Question 4.1 Avec une version récente de Python, un avertissement sur la dépréciation de crypt est affiché. Pourquoi ce module est-il déprécié ?

Question 4.2 Pourquoi utilise-t-on deux fois reference dans la fonction checker() ?

Question 4.3 En quoi getpass() diffère-t-elle de input() ?

Question 4.4 Modifier le script pour faire la même chose, mais en utilisant https://passlib.readthedocs.io/.

On cherche à connaître la méthode utilisée pour comparer des chaînes dans compare_digest(). Le code source renvoie à hmac.py qui utilise _hashopenssl.compare_digest() dans _hashopenssl.c qui utilise _tscmp() du même fichier laquelle utilise enfin CRYPTO_memcmp() qui fait partie de OpenSSL. Si OpenSSL n’est pas disponible, alors c’est la fonction _tscmp() de _operator.c qui est utilisée.

Question 4.5 Que signifie l’abréviation tscmp ?

Question 4.6 Que fait la boucle for de _tscmp() ?

Question 4.7 Aujourd’hui, un algorithme dédié au stockage de mots de passe recommandé est Argon2. On trouve au moins deux bibliothèques Python le proposant, https://pypi.org/project/argon2/ et https://pypi.org/project/argon2-cffi/. Laquelle conseiller et pourquoi ?