HOTP: Maîtriser le HOTP et ses usages pour une authentification à usage unique robuste

Pre

Dans un monde numérique où les attaques par mot de passe sont toujours plus fréquentes, les solutions d’authentification fortes gagnent en importance. Le HOTP, ou HMAC-Based One-Time Password, est l’une des méthodes les plus utilisées pour générer des codes à usage unique sécurisés. Cet article vous propose une vue complète et pratique sur HOTP, ses principes, ses cas d’usage, son intégration et ses bonnes pratiques.

Qu’est-ce que HOTP ? Définition et principes

Le HOTP est une méthode d’authentification à mot de passe unique qui repose sur deux éléments clés : un secret partagé entre le client et le serveur, et un compteur qui évolue à chaque émission de code. Le nom HOTP reflète la combinaison de HMAC (algorithme cryptographique fondé sur une fonction de hachage et une clé secrète) et One-Time Password (mot de passe à usage unique). Dans ce cadre, on parle aussi de hotp pour désigner le terme de façon abrégée, ou HOTP en majuscules lorsque l’on veut insister sur l’acronyme.

Le principe est simple en apparence mais extrêmement robuste lorsqu’il est correctement mis en œuvre. À chaque authentification, le serveur et le client partagent secrètement la clé et utilisent un compteur commun. Le code HOTP est ensuite dérivé via HMAC-SHA1 (ou une variante) et des techniques de troncature dynamique pour obtenir un nombre de chiffres désiré (généralement 6 chiffres). Ce code est utilisé comme mot de passe à usage unique pour une session donnée ou pour une étape de MFA (multi-facteur).

Origine et cadre normatif

L’approche HOTP est décrite dans des normes publiques qui garantissent l’interopérabilité entre différents systèmes et générateurs de codes. La RFC 4226 formalise HOTP et décrit les étapes de calcul, la taille des codes, ainsi que les mécanismes de vérification côté serveur. Le HOTP s’inscrit ainsi dans le paysage des solutions d’authentification à facteur unique ou multi-facteur, en complément ou en alternative au TOTP (Time-Based One-Time Password).

Composants clés et terminologie

  • Secret partagé: une clé secrète utilisée pour le calcul du HOTP. Elle est stockée en sécurité sur le serveur et sur le dispositif client.
  • Compteur (counter): un nombre qui s’incrémente à chaque émission d’un nouveau HOTP. Il peut être un compteur global, un compteur par utilisateur, ou une autre métrique ordonnancée.
  • HMAC-SHA1: l’algorithme utilisé pour générer une empreinte cryptographique à partir du secret et du compteur converti en octets.
  • Dynamic truncation: une technique qui extrait une valeur numérique discrète à partir du digest, puis on applique une modularité pour obtenir le nombre final de chiffres.
  • Digits: nombre de chiffres du code HOTP, le plus courant étant 6, mais on peut utiliser 7, 8 ou d’autres tailles selon les politiques de sécurité.

HOTP vs TOTP: différences et cas d’usage

Deux grandes familles existent pour les mots de passe à usage unique: HOTP et TOTP. Le HOTP dépend du compteur, le TOTP dépend du temps. Voici les principales distinctions :

HOTP: fonctionnement et scénarios typiques

HOTP s’appuie sur un compteur qui évolue à chaque émission de code. Cette approche convient lorsque l’horloge du dispositif client ou du serveur n’est pas parfaitement synchronisée, ou lorsque l’émetteur et le serveur préfèrent un mécanisme basé sur des événements plutôt que sur le temps. Les scénarios HOTP peuvent inclure des systèmes où les jetons restent valables pour une période limitée ou lorsque l’horodatage est peu fiable.

TOTP: fonctionnement et scénarios typiques

TOTP repose sur le temps (par exemple, un nouveau code chaque 30 secondes). Cette approche est très populaire pour les applications d’authentification mobile et les systèmes MFA modernes grâce à leur synchronisation temporelle précise et à l’absence de dépendance à un compteur persistant. Le TOTP est largement utilisé par les anciennes et nouvelles implémentations, alors que HOTP est privilégié dans certains environnements industriels ou maillés où l’horloge des composants peut être décalée.

Avantages et inconvénients de HOTP

  • Avantages: résilience à des décalages d’horloges entre client et serveur, compatibilité historique dans certains systèmes, contrôle précis du moment où un code est émis via le compteur.
  • Inconvénients: nécessite une synchronisation du compteur et une gestion rigoureuse des increments; si le compteur est perdu ou décalé de manière significative, la validation peut échouer; moins adapté lorsque la synchronisation temporelle est facile et fiable (par ex. TOTP).

Cas d’usage où HOTP peut être privilégié

  • Solutions MFA pour des systèmes embarqués ou hors ligne où l’horloge n’est pas fiable et où l’incrément est la série logique d’actions.
  • Applications nécessitant une résistance accrue à certaines attaques basées sur le temps ou des environnements où les token ne doivent pas dépendre strictement du temps réel.
  • Situations où vous avez une infrastructure existante basée sur un compteur et vous souhaitez réutiliser des mécanismes d’authentification éprouvés sans alignement temporel.

Comment fonctionne HOTP: étape par étape

Étape 1 : génération du secret partagé

Avant toute émission de HOTP, un secret partagé est établi entre le serveur d’authentification et le dispositif utilisateur (application mobile, clé matérielle, etc.). Ce secret, généralement représenté sous forme codée en base32 ou hexadécimal, sert de clé privée pour les calculs HMAC. La sécurité de HOTP dépend fortement de la protection de ce secret; il doit être stocké de manière sécurisée et protégée contre l’exfiltration.

Étape 2 : calcul du HOTP avec HMAC-SHA1 et troncature dynamique

Pour générer un HOTP, on applique l’algorithme suivant:

HOTP = truncate(HMAC-SHA1(secret, counter_bytes)) mod 10^digits
  • counter_bytes: représentation big-endian du compteur, sur 8 octets.
  • HMAC-SHA1: produit une empreinte de 20 octets à partir du secret et du compteur.
  • Dynamic truncation: on détermine un offset à partir des 4 bits les plus bas du dernier octet du digest et on extrait un entier en utilisant les 31 bits suivants pour éviter les valeurs négatives.
  • digits: nombre de chiffres souhaité pour le HOTP final (par exemple 6).

Étape 3 : validation côté serveur

Lorsque l’utilisateur présente le HOTP, le serveur effectue le même calcul avec le secret connu et le compteur attendu. Si le code calculé correspond à celui fourni, l’authentification est acceptée, et le compteur peut être avancé. Dans une architecture robuste, le serveur peut également tolérer des décalages mineurs du compteur (par exemple ±1) pour couvrir des problèmes de synchronisation légère, selon la politique de sécurité choisie.

Intégration pratique dans une application

Intégration côté serveur

Pour implémenter HOTP côté serveur, il faut:

  • Gérer le secret partagé et son stockage sécurisé (chiffrement au repos, accès restreint).
  • Gérer le compteur par utilisateur et assurer sa cohérence entre le client et le serveur.
  • Calculer le HOTP à l’aide d’une bibliothèque crypto HMAC et vérifier les codes reçus.
  • Définir une politique de seuils (tolérance sur décalage du compteur, durée de validité, nombre d’essais autorisés).

Intégration côté client (applications mobiles, terminaux)

Du côté client, l’application doit:

  • Conserver le secret de manière sécurisée (par exemple dans un stockage chiffré, ou dans un module sécurisé).
  • Maintenir le compteur synchronisé avec le serveur ou actualiser le compteur et récupérer les valeurs lors d’une réinitialisation.
  • Afficher à l’utilisateur un code HOTP ou le transmettre directement via l’interface d’authentification, selon l’UX choisie.

Exemples de bibliothèques et guides rapides

Plusieurs bibliothèques populaires permettent d’implémenter HOTP et TOT P rapidement, avec ou sans TOTP :

  • Python : PyOTP, une bibliothèque simple et robuste pour HOTP et TOTP.
  • Java : libraries OATH, ou des implémentations simples de HOTP/HMAC dans des projets Java.
  • JavaScript/Node.js : otp, otplib, ou des wrappers autour de crypto pour calculer HOTP/TOTP.
  • Go : packages dédiés pour HOTP et TOTP, avec des exemples pour les serveurs et les clients.

Exemple pseudo-code pour HOTP en Python-like (illustratif uniquement):

def HOTP(secret, counter, digits=6):
    import hmac, hashlib
    key = base64.b32decode(secret)
    msg = counter.to_bytes(8, 'big')
    digest = hmac.new(key, msg, hashlib.sha1).digest()
    offset = digest[-1] & 0xf
    bin_code = int.from_bytes(digest[offset:offset+4], 'big') & 0x7FFFFFFF
    return bin_code % (10 ** digits)

Bonnes pratiques et sécurité autour de HOTP

Protéger le secret et stockage

Le secret partagé est le cœur de HOTP. Il doit être stocké dans un endroit sûr, équivalent à la protection d’une clé privée. Utilisez des modules sécurisés, chiffrez les données au repos, et appliquez le principe du moindre privilège pour les accès.

Gestion du compteur et synchronisation

Le compteur doit être cohérent et fiable. Prévoir une méthode de réconciliation si le compteur s’écarte (par exemple, tolérer une marge ±1). Dans certains systèmes, on stocke un historique des compteurs ou on met en place des mécanismes de réinitialisation sécurisés en cas de perte de synchronisation.

Récupération et continuité d’accès

Pour les utilisateurs finaux, proposez des méthodes de récupération (codes de secours, alternative MFA) afin d’éviter de bloquer l’accès si les codes HOTP ne fonctionnent pas pour une raison quelconque.

Limitations et protection contre les attaques

Mettre en place des mécanismes de limitation des tentatives et des contrôles d’anomalies est crucial: blocage après un certain nombre d’échecs, détection de tentatives répétées, et audit des accès suspectés.

Scénarios d’usage concrets

Entreprises et sécurité interne

Les entreprises adoptent HOTP pour sécuriser les consoles d’administration, les VPN, et les systèmes critiques. HOTP peut être intégré dans des solutions MFA internes, offrant un contrôle d’accès renforcé sans dépendre exclusivement du temps ou d’un seul facteur. Dans ces environnements, HOTP peut coexister avec d’autres mécanismes MFA pour durcir les contrôles d’identité.

Utilisateurs finaux et authentification multi-facteur

Pour l’utilisateur, HOTP s’intègre souvent dans une expérience à facteur multiple: un mot de passe, puis un HOTP ou un code HOTP généré par une application ou une clé matérielle. Cette approche améliore considérablement la sécurité des comptes en rendant les codes impossibles à deviner et à réutiliser.

IoT et appareils sans horloge fiable

Dans l’Internet des objets, certains appareils peuvent avoir une horloge défaillante ou absente. HOTP peut offrir une solution viable lorsque le compteur géré par le serveur suffit et qu’un système de synchronisation robuste peut être maintenu côté serveur.

Le HOTP peut-il expirer?

Le HOTP n’expire pas automatiquement, mais les politiques d’entreprise ou les solutions MFA peuvent imposer des contraintes sur la validité des codes et sur la fenêtre de tolérance autour du compteur pour garantir une expérience utilisateur fluide tout en restant sécurisé.

HOTP et synchronisation du compteur

La synchronisation du compteur est essentielle. En cas de perte de synchronisation, vous pouvez proposer des mécanismes de récupération – par exemple des codes de secours ou un mode de réinitialisation sécurisée – pour rétablir les codes générés et permettre l’accès sans danger.

HOTP est-il plus sûr que TOTP?

La question de la sécurité dépend du contexte. HOTP peut être plus robuste dans des environnements où l’horloge est instable ou non fiable, tandis que TOTP est très adapté lorsque l’horloge est parfaitement synchronisée et fiable. Les deux méthodes offrent un MFA efficace lorsqu’elles sont correctement déployées et protégées par des bonnes pratiques de sécurité.

Le HOTP offre une approche solide et polyvalente pour l’authentification à usage unique. En comprenant ses mécanismes, ses avantages et ses limites, vous pouvez concevoir des solutions MFA adaptées à vos besoins et à votre architecture. Que vous choisissiez HOTP, TOTP, ou une combinaison de méthodes, l’objectif demeure le même: protéger les identités, sécuriser les accès sensibles et offrir une expérience utilisateur fluide tout en restant compliant avec les exigences de sécurité. En intégrant soigneusement les secrets partagés, en assurant une gestion rigoureuse du compteur et en appliquant les meilleures pratiques, vous obtenez une architecture HOTP résiliente et prête pour les défis du numérique moderne.