jeudi 25 novembre 2021

Authentificatiopn OTP

 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. 

Configuration TOTP sur KeepassX (Linux)

Il est aussi possible d'instalelr des plugin dans mes browsers, par exemple pour "Authenticator":

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" 

$ display Test_OTP_qrcode.png
$ eog Test_OTP_qrcode.png


 Références

Ressource IETF

RFC 4226 - HOTP: An HMAC-Based One-Time Password Algorithm
https://www.rfc-editor.org/rfc/rfc4226.txt

RFC 6238 - TOTP: Time-Based One-Time Password Algorithm
https://www.rfc-editor.org/rfc/rfc6238.txt