Spécification du TOTP

Introduction

Ce système de TOTP fournit un système de MFA (Multi-Factor Authentication) obligatoire pour tout accès à nos services. Ce système est implémenté dans une application mobile accessible sur notre magasin, mais cette spécification permet à une tierce-partie de fournir sa propre implémentation sur le support de son choix.

Génération du TOTP

Pré-requis

Pour générer un code TOTP, il est nécessaire de définir les points suivants :

Calcul

Le calcul implique plusieurs itérations du calcul de l’empreinte du secret. Le nombre d’itérations (count) dépend de la date courante (now). Il s’agit du nombre de fois où le code a changé depuis une date de référence, en l’occurrence Epoch Unix, le 1er janvier 1970 (epoch)). Le count dépend évidemment de la durée ou période du code interval. Ainsi, avec toutes les unités exprimées en seconde :

count = (now - epoch) / interval

Notez qu’il s’agit d’une division entière, puisque count doit être un nombre entier.

Une fois count déterminé, l’algorithme nécessite de calculer l’empreinte du secret par la fonction MD5, répété count fois. La première itération calcule l’empreinte du secret, puis extrait le résultat sous forme hexadécimale. La deuxième itération calcule l’empreinte de ce résultat, et ainsi de suite, jusqu’à obtenir count itérations. Le résultat est appelé dans la suite digest.

Il reste à convertir le digest (une chaîne de 32 digits hexadécimaux) en un code à 6 chiffres décimaux. La méthode est la suivante :

  1. on élimine les premier et dernier digits du digest, pour n’en conserver que 30.
  2. on coupe les 30 digits restants en 3 chaînes hexadécimales de 10 digits chacune.
  3. on convertit ces 3 chaînes hexadécimales en 3 entiers décimaux.
  4. on réduit ces 3 entiers par un modulo 100 pour obtenir 3 nombres compris entre 0 et 99.
  5. enfin, on concatène ces 3 valeurs pour obtenir le code de validation.

Exemple

Prenons l’exemple du calcul du code pour le secret AAAAAAAAA (sa taille importe peu) à la date du 24 décembre 2005 à 12h, 43 min et 30s (UTC).

Le nombre de secondes entre Epoch Unix et cette date est de 1135428210, donc pour une durée de 30 secondes, count vaudra 37847607.

On va itérer le calcul de l’empreinte 37847607 fois :

On peut dès lors en déduire le code :

  1. suppression des digits : 02e8989f3ab50515056b0f09e15b87
  2. découpage en trois parties : 02e8989f3a, b50515056b, 0f09e15b87
  3. conversion en entiers : 12492250938, 777474344299, 64590273415
  4. modulo 100 et concaténation : 389915.

Le code de validation, valable jusqu’à 12h 44min est donc 389915.

Notes

Malgré tous nos efforts, notre spécification n’a pas été retenue par les groupes de travail ayant conduit à la standardisation du mécanisme TOTP, dont les travaux définitifs sont décrits par la RFC 6238 de l’IETF. Ainsi, le système aujourd’hui couramment utilisé par les autres fournisseurs est incompatible avec la solution décrite ici.