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/.
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 ?