oathtool nunca está de acuerdo con Google Authenticator

oathtool nunca está de acuerdo con Google Authenticator

Actualmente uso Google Authenticator para 2FA, cosas como conectarme a VPN, etc. Quería ver si podía obtener el código de seis dígitos en mi caja OSX pero por alguna razón oathtoolnunca devuelve el mismo valor que Authenticator. Y el código del Autenticador funciona, el oathtoolotro no.

Curiosamente, también lo probé en un simulador de iOS conhttps://github.com/mattrubin/Authenticatoren el mismo sistema y el código que produce coincide con oathtoolel Autenticador y no.

Sospeché que tal vez se trataba de un problema de sincronización horaria, pero después de sincronizar manualmente mi hora OSX, el código es el mismo. Me pregunto si tal vez haya parámetros predeterminados en el algoritmo TOTP que no coincidan, pero no sé cuáles serían.

El oathtoolcomando genera algo como lo siguiente

% oathtool --verbose --base32 --totp "$SECRET"
Hex secret: ...
Base32 secret: ...
Digits: 6
Window size: 0
Step size (seconds): 30
Start time: 1970-01-01 00:00:00 UTC (0)
Current time: 2016-10-20 22:27:22 UTC (1477002442)
Counter: 0x2EF3E06 (49233414)

(Tenga en cuenta que $SECRETarriba se muestra el mismo valor utilizado para generar el código QR que utilizó el Autenticador).

¿Alguna razón por la que estos no estarían de acuerdo?

Actualizar

Intenté jugar con el tiempo 30 segundos a cada lado del tiempo de mi sistema usando

oathtool --now "$(perl -e'use DateTime; print DateTime->now()->subtract(seconds=>30)->strftime( "%Y-%m-%d %H:%M:%S %Z" )')" -b --totp $SECRET -w 20|sort

El Perl anterior genera tiempo en el formato de

2016-10-20 23:36:15 UTC

También generé 20 números cada vez, pero ninguno de ellos parecía coincidir con lo que tengo en Authenticator.

Respuesta1

Dado que la búsqueda de "Google Authenticator oathtool" lo lleva hasta aquí, y la respuesta está en parte en los comentarios, para mayor comodidad y exhaustividad...

oathtooly Google Authenticator son implementaciones deRFC 6238 TOTP. TOTP produce una salida de 6 dígitos utilizando un HMAC. Aunque el cliente oficial de Android ya no es de código abierto, no es porque la implementación TOTP haya cambiado o sea "secreta".

Hay 2 entradas para el HMAC, un número y un secreto. En TOTP, el número es el recuento de intervalos de tiempo de una época; los valores predeterminados para GA oathtooly para GA son intervalos de 30 segundos (tamaño de "paso de tiempo") y 1970-01-01 00:00:00 UTC. Para ser claros, oathtoolGA estará de acuerdo siempre que los parámetros coincidan: la época y el tiempo deben estar lo suficientemente cerca, y el paso de tiempo y el secreto deben coincidir.

Cuando sea necesario (por ejemplo, algunos tokens TOTP de hardware usan un intervalo de 60 segundos), puede usarlo -spara establecer el tamaño del intervalo y, para adaptarse al desplazamiento/deriva, puede anular lo que oathtool cree que es "ahora" (o modificar la época).

Para solucionar problemas, lo siguiente es útil:

oathtool -v --now  "now -30 minutes" -w 120 --totp $SECRET

Para un intervalo de 30 segundos, esto generará una hora completa de valores, desde hace 30 minutos hasta 30 minutos en el futuro. A partir de esto, puede deducir un desplazamiento del token o un desplazamiento del reloj ( diff -ycomparar las salidas una al lado de la otra puede ser útil). TOTP usa "hora Unix", por lo que las zonas horarias no deberían ser un problema a menos que una zona horaria esté "ocultando" un gran desplazamiento de un reloj incorrecto.

--nowy --epochutilizar el robusto analizador de fecha y hora GNU y admitir especificaciones de tiempo relativas, así como marcas de tiempo absolutas, --now "30 min ago"también funciona.

Como determinó el OP, para la época y el paso de tiempo predeterminados, si la hora es correcta, entonces debe ser el secreto el que no lo es.

Respuesta2

Sincronicé Google Authenticator y Oathtool:

secret=`echo 1234567812345678 | base32`
oathtool -v --totp -b $secret
qrencode -t ANSI "otpauth://totp/test?secret="${secret}""

información relacionada