</Principe>
Un code TOTP est un code unique basé sur le temps et une clé secrète partagée entre le client et le serveur. Cela permet de générer un code unique qui n’est valide que 30 secondes. Ce code est généralement utilisé pour augmenter la sécurité d’un compte en demandant de le renseigner après la saisie du mot de passe. Comme le code change régulièrement, même si un pirate obtient votre mot de passe, sans cette clé, il ne pourra pas générer le code actuel et donc ne pourra pas se connecter.
</Avantages>
Cela rajoute un mot de passe supplémentaire à vos comptes. De plus ce mot de passe n’est partagé qu’une seule fois lors de la mise en place du TOTP sur le compte. Ce qui le rends impossible à récupérer lors des prochaines authentifications. Cet algorithme est standardisé via la norme RFC 6238 ce qui rends l’utilisation de sécurité accessible avec les GAFAM et tout autre logiciel implémentant cette sécurité.
</Algorithme>
1. Récupération de la période (Epoch / Intervalle)
2. Faire un hash (SHA-1) de la période avec la clé secrète
3. Récupérer l’offset de troncage dynamique (4 derniers bits du hash)
4. Récupérer les octets via le troncage dynamique (4 octets depuis l’offset sans le premier bit de signe)
5. Faire un modulo 106 de la valeur obtenue
6. Rajouter des 0 à gauche si besoin pour avoir 6 caractères
</Spécificités>
Le nombre de digits demandés est variable, il suffit de changer la puissance (6 par défaut) dans les étapes 5 et 6. L’intervalle est également variable pour passer à 60 secondes par exemple. Les fonctions côté serveur, peuvent également prévoir un offset de ±1 période. Cela permet de rendre votre expérience plus agréable car si le code vient à changer alors que vous n’avez pas fini de le taper il sera quand même validé par le serveur. Cet offset permet également de pouvoir palier à un éventuel souci de synchronisation de temps entre le client et le serveur. Le secret initial est généré puis converti en BASE32 avant d’être transmis à l’utilisateur. C’est pourquoi il faut décoder le secret de la BASE32 en chaine binaire.