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.
Pour générer un code TOTP, il est nécessaire de définir les points suivants :
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 :
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 :
md5('AAAAAAAAA') = 6c9395cacd317eed2777f669103b7181md5('6c9395cacd317eed2777f669103b7181') = 103b13b93587b32a254f2a165b006e4a202e8989f3ab50515056b0f09e15b872On peut dès lors en déduire le code :
02e8989f3ab50515056b0f09e15b8702e8989f3a,
b50515056b, 0f09e15b8712492250938,
777474344299, 64590273415389915.Le code de validation, valable jusqu’à 12h 44min est donc
389915.
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.