TOTP: TD

Dans ce TD, nous allons implémenter TOTP, qui a été présenté en cours.

Installation

Vous aurez besoin de la bibliothèque Python suivante, qui nous permettra de générer des QR codes:

pip install "qrcode[pil]"

Génération d'un secret et du QR Code

Tout d'abord, nous allons écrire un script generate_secret.py qui génère un secret TOTP et affiche le QR Code correspondant.

Stockez votre secret dans une variable

secret = b"cle secrete"

Encodez votre secret en base 32

Générez une URL otpauth, que vous placerez dans un QR code.

À l'aide d'une application comme Google Authenticator, scannez le QR code. Vous devriez voir apparaître une entrée dans l'application, accompagnée d'un code à 6 chiffres.

Calcul de code TOTP

Dans un autre fichier totp.py, nous allons maintenant calculer le code TOTP, qui devrait correspondre à celui qui s'affiche dans l'application.

Calcul du compteur

Calculez le compteur, en divisant le temps UNIX par une durée de 30 secondes. Le résultat est un nombre entier.

Représentez ce nombre sous forme d'une byte string de 8 octets. Vous pouvez utiliser la fonction int.to_bytes.

Calcul du hash (HMAC)

Calculez le HASH HMAC SHA-1 du secret et du compteur.

Extraction du code (HOTP)

Référez vous aux explications du cours pour cette étape.

Extrayez les 4 derniers bits du hash, et calculez la valeur correspondante (entre 0 et 15).

Extrayez un entier de 32 bits du hash, en utilisant l'indice obtenu précédemment.

Retirez le bit de signe (le bit de poids fort).

Calcul du code à 6 chiffres

Représentez la valeur obtenue en décimal modulo \(10^6\) (en ne gardant que les 6 derniers chiffres). Si il n'y a pas 6 chiffres, ajoutez des zéros à gauche.

Vérifiez que le code obtenue correspond à celui affiché dans l'application.

Reverse engineering

En novembre 2024, ce TD a été rédigé. Pour tester, l'URL suivante a été utilisée:

otpauth://totp/gregwar?secret=NV4SA43FMNZGK5BB&issuer=Sécurité+IUT

Le code affiché à l'écrant était: 626 343

Quand ces lignes ont t-elles été écrites?