Google Authenticator - Counter Based [duplicado]

2

Estoy tratando de entender cómo funciona el autentificador de google - basado en contador. He intentado buscar en Google una demostración o al menos cómo funciona esto. Entiendo que es una contraseña de una sola vez, pero no como TOTP. Ya estoy trabajando en TOTP pero estoy terriblemente teniendo problemas con la sincronización de tiempo, porque estoy trabajando en una PC sin conexión. Entonces, el tiempo de las ventanas - bueno, cada 2 días aproximadamente, el tiempo sigue avanzando dos o tres segundos por delante.

De todos modos, estoy buscando un código PHP para HOTP basado en contador. He encontrado uno o dos ejemplos, pero tienen muchos archivos faltantes.

Por favor, me gustaría encontrar un tutorial sobre eso en lenguaje PHP o al menos una idea básica para empezar. Por cierto, encontré este enlace .

    
pregunta Alihamra 29.09.2013 - 23:17
fuente

2 respuestas

1

TOTP es una variante basada en el tiempo de HOTP . En ambos casos, la secuencia de posibles contraseñas se deriva de una clave secreta y un "valor cambiante". Con TOTP, el "valor cambiante" es la hora actual, que ambos extremos del protocolo supuestamente saben (la hora actual es de conocimiento público). En HOTP, el "valor cambiante" es un contador, que se incrementa después del uso. Ambas partes (cliente y servidor) recuerdan el último valor de contador utilizado.

Si el cliente y el servidor se desincronizan (por ejemplo, el cliente envió una contraseña e incrementó su contador, pero un problema de red interrumpió la conexión y el servidor nunca la recibió), entonces hay un proceso para la resincronización: al recibir una contraseña, el servidor no lo compara con la siguiente contraseña (según su contador), sino con las siguientes 100 o más contraseñas, lo que permite una desincronización del contador de aproximadamente 100.

Este mecanismo se adapta bien a las llaves de los autos, que:

  • No tiene una fuente de tiempo común (no hay reloj en la clave).
  • Necesita trabajar con una comunicación unidireccional (desde la llave hasta el automóvil, no al revés).
  • Tenga una "resincronización manual" si no está sincronizada (su sobrino de 3 años jugó con la llave durante toda una tarde, obteniendo el contador de la llave más allá del mostrador del auto, incluso con la compensación de +100; puede ya no abra el automóvil a distancia, pero cuando enciende el motor, el automóvil y la llave se comunican a través de RF de corto alcance para restablecer los contadores).

En cuanto al código, una simple solicitud de google en "hotp php" apunta a this y that .

    
respondido por el Thomas Pornin 30.09.2013 - 13:23
fuente
1

No tengo el código PHP para usted, pero aquí hay un proyecto que utilicé al trasladar esto a uno de los sistemas heredados de mi empresa porque no había puertos directos a los que pudiera hacer referencia. Está en C # y probablemente puedas usarlo como pseudocódigo. Pude ejecutar el proyecto C # en mi máquina y agregar puntos de ruptura para asegurarme de que mi programa tuviera la misma salida en cada fase del proceso. Los resultados son compatibles con Google Authenticator. GoogleAuthCSharp

Así es como funciona a un nivel alto

  1. Obtenga el código de tiempo actual de Unix, dividido en incrementos de 30 segundos. Invertir el orden de los bits.
  2. Obtenga / genere una clave única para este usuario mediante un PRNG.
  3. Genere un SHA1-HMAC usando la marca de tiempo invertida y la clave de usuario como entradas.
  4. Agarra 4 bits específicos del HMAC. Cada uno de ellos se procesa individualmente utilizando "AND" en modo bit y cambios.
  5. Haga un "OR" a nivel de bits en estos 4 elementos juntos. Esto genera un gran resultado entero.
  6. Haga una división modular de este entero largo usando 1000000. Esto resulta en el TOTP de 6 dígitos.

Consulte el archivo MainWindow.xaml.cs para ver el código real.

    
respondido por el md_1976 30.09.2013 - 14:47
fuente

Lea otras preguntas en las etiquetas