Google Authenticator est une alternative à SMS pour la vérification en 2 étapes, en installant une application sur Android où les codes seront envoyés).
Cela fonctionne sans aucune connectivité; il fonctionne même en mode avion. Voilà ce que je ne comprends pas. Comment est-il possible que cela fonctionne sans connectivité? Comment le téléphone portable et le serveur se synchronisent-ils pour savoir quel code est valide à ce moment précis?
Google Authenticator prend en charge les algorithmes HOTP et TOTP pour générer des mots de passe à usage unique.
Avec HOTP, le serveur et le client partagent une valeur secrète et un compteur, qui sont utilisés pour calculer un mot de passe à usage unique indépendamment des deux côtés. Chaque fois qu'un mot de passe est généré et utilisé, le compteur est incrémenté des deux côtés, permettant au serveur et au client de rester synchronisés.
TOTP utilise essentiellement le même algorithme que HOTP avec une différence majeure. Le compteur utilisé dans TOTP est remplacé par l'heure actuelle. Le client et le serveur restent synchronisés tant que les heures système restent les mêmes. Cela peut être fait en utilisant Network Time Protocol .
La clé secrète (ainsi que le compteur dans le cas de HOTP) doit être communiquée à la fois au serveur et au client à un moment donné. Dans le cas de Google Authenticator, cela se fait sous la forme d'un URI codé QRCode. Voir: KeyUriFormat pour plus d'informations.
Authenticator implémente l'algorithme TOTP (Time-Based One-Time Password). Il contient les ingrédients suivants:
• Un secret partagé (une séquence d'octets)
• Une entrée dérivée de l'heure actuelle
• Une fonction de signature
Secret partagé: Le secret partagé est ce que vous devez obtenir pour configurer le compte sur votre téléphone. Soit vous prenez une photo d'un code QR à l'aide de votre téléphone, soit vous pouvez saisir le secret manuellement.
Entrée (heure actuelle): La valeur de l'heure d'entrée que vous obtiendrez simplement de votre téléphone, aucune autre interaction avec le serveur n'est requise une fois que vous avez obtenu le secret. Cependant, il est important que l'heure de votre téléphone soit exacte car le serveur répétera essentiellement ce qui se passe sur votre téléphone en utilisant l'heure actuelle connue par le serveur.
Fonction de signature: La fonction de signature utilisée est HMAC-SHA1. HMAC signifie Hash-based message authentication code et c'est un algorithme qui utilise une fonction de hachage unidirectionnelle sécurisée (SHA1 dans ce cas) pour signer une valeur. L'utilisation d'un HMAC nous permet de vérifier l'authenticité - seules les personnes connaissant le secret peuvent générer la même sortie pour la même entrée (l'heure actuelle).
Pseudo-code:
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret)))
input = CURRENT_UNIX_TIME() / 30 // sets a constant value for 30 seconds
hmac = SHA1(secret + SHA1(secret + input)) //apply hashing
offset = hmac[len(hmac)-1] & 0x0F //Last nibble
four_bytes = hmac[offset : offset+4] //takes a subset of 4 bytes from 20 bytes
large_integer = INT(four_bytes) //Covert four bytes to integer
small_integer = large_integer % 1,000,00 //gives 6 digit code
Référence: https://garbagecollected.org/2014/09/14/how-google-authenticator-works/
Consultez également ce projet github pour la mise en œuvre de GO: https://github.com/robbiev/two-factor-auth/blob/master/main.go
Cela fonctionnera sur une graine en fonction du temps, donc c'est similaire à la façon dont les porte-clés RSA fonctionnent. c'est-à-dire qu'ils ne nécessitent également aucune connectivité.
Je viens de jeter un coup d'œil et on y répond ici: https://stackoverflow.com/questions/8340495/how-rsa-tokens-works
Si l'on strace
s le démon sshd
, on peut voir comment le serveur "connaît" la clé secrète, en lisant le fichier de configuration des utilisateurs:
#strace -f -v -e open /usr/sbin/sshd -p 2222 -dddd -f /etc/ssh/sshd_config 2>&1 | grep -i goog
> > [pid 2105] open("/home/myuser/.google_authenticator", O_RDONLY) = 4
> > [pid 2105] open("/home/myuser/.google_authenticator~",
> > O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_NOFOLLOW, 0400debug3:
> > mm_sshpam_respond: pam_respond returned 1 [preauth]
Le téléphone portable le sait déjà; vous l'avez numérisé via QR ou l'avez tapé.