
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 oathtool
nunca devuelve el mismo valor que Authenticator. Y el código del Autenticador funciona, el oathtool
otro 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 oathtool
el 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 oathtool
comando 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 $SECRET
arriba 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...
oathtool
y 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 oathtool
y para GA son intervalos de 30 segundos (tamaño de "paso de tiempo") y 1970-01-01 00:00:00 UTC. Para ser claros, oathtool
GA 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 -s
para 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 -y
comparar 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.
--now
y --epoch
utilizar 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}""