L'authentification OTP (One Time Password)
Les OTP ou mot de passe à usage unique - pendant un fenêtre temporelle - sont la forme la plus commune des authentifications à multiple facteur (MFA) ou second facteur (2FA).
Les sites utilisant un code envoyé par SMS à 6 ou 8 chiffres utilise un OTP. Aujourd'hui deux catégories d'OTP sont utilisés : HOTP basé sur un compteur incrémental et son évolution TOTP basé sur validité dans une une fenêtre temporelle de 30 ou 60 secondes.
HOTP
HOTP (HMAC-based One-Time Password) est un algorithme défini par le groupe de travail OATH et également publié par l’IETF dans la RFC 4226. HOTP est un algorithme d’OTP simple basé sur une fonction HMAC utilsiant la fonction à sens unique SHA-1.
HOTP fonctionne sur un compteur incrémenté à chaque utilisation, sans requéri d'entrée utilisateur. Il peut être implémenté sur des dispositifs à faible ressource (clef USB,carte à puce). Le principe repose sur un secret partagé avec la ressource à accéder. Ce secret est utilisé pour dériver un OTP avec le compteur incrémental et la fonction HMAC-SHA-1. L'inconvénient principal est de resynchroniser la partie cliente lorsqu'une désynchronisation du compteur survient.
TOTP
TOTP (Time-based One-Time Password) est un algorithme défini dans la RFC 6238. Il s'agit d'un évolution de HOTP dans laquelle le compteur est remplacée par un timestamp Unix. La synchronisation entre chaque partie s'appuie sur le temps universel UTC. La fenêtre temporelle de validité d'un OTP est de 30 ou 60 secondes. A chaque nouvelle période, le code OTP change. TOTP permet égalemen,t d'utiliser SHA256 ou SHA512 dans le processus de dérivation HMAC.
Mode d'usage
Ces codes OTP sont souvent associés à une authentification traditionnelle par mot de passe (premier facteur). Ensuite, il est demandé à l'utilisateur un OTP (second facteur ou multiple facteur).
L'avantage de ces modèles d'authentification permet de s'affranchir d'un problème de couverture réseau mobile pour les codes envoyés par SMS. Un token physique ou une application sur l'ordinateur permette de générer le code OTP. La seule contrainte reste la synchronisation (compteur ou temporelle).
Une procédure initiale permet de configurer le secret partagé entre les deux parties, ainsi que les paramètres cryptographiques associés.
OTP indirects connectés (swipe)
Pour améliorer l’expérience utilisateur en évitant la recopie du code à 6 ou 8 chiffres du téléphone à l’ordinateur, la technique du « swipe » a vu le jour. Elle impliquant un accès au réseau, et après saisie du login/password, le smartphone reçoit une notification demandant de valider la connexion par un simple bouton « OK ». Sous le manteau, c'est le smartphone qui effectue l’authentification en parallèle de l'authentification par mot de passe (cf. Google Authenticator).
Remarque : En 2017, le NIST (National Institute of Standards and Technology) a officiellement considéré les OTP par SMS comme non sécurisés. En effet, ces modes sont vulnérables à des attaques de re-routage dans les réseau SS7 ou de Man in The Middle. https://pages.nist.gov/800-63-3/sp800-63b.html
Applications soft token
Les applications (soft-tokens) sur smartphone se doivent d’être robustes et convenablement implémentées. Une récente étude menée par des experts en sécurité a révélé de nombreuses faiblesses d’implémentation dans des applications de génération d’OTP répandues.
Une application TOTP pour Smartphone est disponible (FreeOTP). KeepassX sous Linux dispose d'un module OTP. Il suffit de configurer la clef au format base32 ainsi que la période (30 ou 60 secondes). Une commande en ligne existe également : oathtool ou des libraires C ou Python.
Il est aussi possible d'instalelr des plugin dans mes browsers, par exemple pour "Authenticator":
- firefox: https://addons.mozilla.org/fr/firefox/addon/auth-helper
- chrome: https://chrome.google.com/webstore/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai/related?hl=fr
D'autres solutions existent https://alternativeto.net/software/freeotp
La configuration d'une application smartophone recourent à un QR Code.
Le QR Code dernier contient les éléments d'authentification :
- le type hotp ou totp,
- le compte utilisateur associé,
- le nom de l'émetteur,
- le secret partagé en hexadécimal ou, le plus souvent, en base32 sans le padding terminal,
- l'algorithme SHA1/SHA256/SHA512,
- le nombre de chiffres de l'OTP (6 ou 8)
- la durée de la période temporelle (30 ou 60 secondes).
Ces éléments sont combiné dans une URI selon le format suivant (source : https://github.com/google/google-authenticator/wiki/Key-Uri-Format)
otpauth://TYPE/LABEL?PARAMETERS
PARAM |
SUB
PARAM |
Desciption |
TYPE |
Counter : hotp or time :
topt |
|
LABEL |
label = accountname / issuer
(“:” / “%3A”) *”%20” accountname Example:include
Example:alice@gmail.com, Provider1:Alice%20Smith or
Big%20Corporation%3A%20alice%40bigco.com |
|
PARAMETER |
SECRET |
REQUIRED. Encoded in Base32
according to RFC 3548, padding shoudl be omitted |
ISSUER |
Strongly recommended. If both
issuer parameter and issuer label prefix are present, they should be equal. examples: •
issuer=Example •
issuer=Provider1 •
issuer=Big%20Corporation. |
|
ALGORITHM |
OPTIONAL: •
SHA1 (Default) •
SHA256 •
SHA512 |
|
DIGITS |
values
6 or 8, default is 6 |
|
COUNTER |
if type is hotp: The counter
parameter is required when provisioning a key for use with HOTP |
|
PERIOD |
OPTIONAL only if type is totp: The
period parameter defines a period that a TOTP code will be valid for, in
seconds. The
default value is 30. |
Pour générer un QR Code, il faut encodé en base64 le secret partagé en supprimant le padding ('=').
$ echo -n DEABEEFDEABEEFDEABEEFDEABEEF |
xxd -r -p | base32 | tr -d '='
32V657PKX3X55K7O7XVL53Y
Puis, il faut construire l'URI et générer le QR Code
$ qr 'otpauth://totp/Test%20TOTP:bob@totp.net?algorithm=SHA1&secret=32V657PKX3X55K7O7XVL53Y&period=30&digits=6&issuer=Test%20TOTP'
Les facteurs comportementaux
Les facteurs comportementaux peuvent s’ajouter aux autres facteurs explicites comme le couple login/password et un OTP. Ces facteurs sont souvent vérifiés lors de mécanisme d’authentification adaptative :
- si une tentative d’authentification est réalisée depuis un poste de confiance, dans un lieu de confiance, à une heure normale, seul le premier facteur est nécessaire ;
- si la tentative est faite depuis un autre pays, en pleine nuit, à partir d’un poste et d’un navigateur inconnus jusqu’à présent, alors l’authentification va s’adapter au contexte en imposant d’autres facteurs (OTP par exemple).
Outil en ligne de commande oathtool
Installer oathtool
$
sudo apt install oathtool zbar-tools xclip
Utiliser l'aide de la commande ou le man.
$ oathtool --totp=sha1 --time-step-size=30
--digits=6 --base32
32V657PKX3X55K7O7XVL53Y
$ oathtool --totp=sha1 --time-step-size=30
--digits=6 DEABEEFDEABEEFDEABEEFDEABEEF
Récuperer les paramètres d'un QR code d'un site
Depuis un smartphone avec une app QR code, il suffit de lire le QR code.
Depuis une ligne de commande, il faut utiliser les tools zbar
$ sudo apt install zbar-tools
$ zbarimg Test_OTP_qrcode.png
QR-Code:otpauth://totp/Test%20TOTP:bob@totp.net?algorithm=SHA1&secret=32V657PKX3X55K7O7XVL53Y&period=30&digits=6&issuer=Test%20TOTP
Il est aussi possible d'écrire un code python pour décoder un QR Code.
$ cat qr_decode.py
#!/usr/bin/python3
import os, sys
import qrtools
prog = os.path.basename(sys.argv[0])
if len(sys.argv) != 2:
print("Error: argument missing")
print("Syntax: %s <qrcode file>" % prog)
sys.exit(1)
filename = sys.argv[1]
print("[*] Reading QR Code in '%s'" % filename)
qr = qrtools.QR()
qr.decode(filename.encode())
print("[+] Data embedded: %s" % qr.data)
$ qr_decode.py Test_OTP_qrcode.png
[*] Reading QR Code in 'Test_OTP_qrcode.png'
[+] Data embedded: otpauth://totp/Test%20TOTP:bob@totp.net?algorithm=SHA1&secret=32V657PKX3X55K7O7XVL53Y&period=30&digits=6&issuer=Test%20TOTP
Encoder une URI OATH
$ qrencode -o Test_OTP_qrcode.png "otpauth://totp/Test%20TOTP:bob@totp.net?algorithm=SHA1&secret=32V657PKX3X55K7O7XVL53Y&period=30&digits=6&issuer=Test%20TOTP"
Aucun commentaire:
Enregistrer un commentaire