Autenticación de dos factores
1 Archivos Adjunto(s)
Hola a todos,
No sé si ya se ha hablado de esto aquí anteriormente, pero para desempolvar un poco la bodega pongo a su disposición un mecanismo para que puedan implementar la autenticación de dos factores en sus sitios web. Para quienes desconozcan el asunto, resumo que ésta consiste en proporcionar un código de seguridad (generalmente de seis dígitos) además de los consabidos nombre de usuario y contraseña. El ejemplo, quizá más conocido es el de GMail. Cuando activamos la autenticación de dos factores y queremos ingresar a nuestra cuenta desde un dispositivo desconocido, Google nos requerirá, luego del usuario y contraseña, de un segundo paso (factor) para comprobar que realmente somos quienes decimos ser y no alguien que se robó nuestro username y password. Si nuestra cuenta de correo está asociada ya a nuestro móvil, el segundo factor puede ser simplemente el oprimir el botón "SÍ" que nos llega al dispositivo. Pero también podemos hacer uso de un generador de códigos como el Google Authenticator del propio Google o cualquier otro como el de LastPass. Estos códigos corresponden al concepto de One Time Password, es decir, contraseñas de un sólo uso, que es precisamente lo que aumenta la seguridad de nuestra cuenta. Huelga decir que para hacer uso de esta funcionalidad, GMail nos pide primero dar de alta la cuenta en el autenticador. El código proporcionado por el autenticador tiene un tiempo de vida de 30 segundos. Este código de seis dígitos: se asocia a un servicio y usuario específicos, por lo que, como se ve en la imagen, distintas cuentas proporcionan distintos códigos. Pues bien, la idea entonces es poder usar cualquiera de estos autenticadores en nuestras propias aplicaciones web. A grosso modo a cada usuario de nuestro sistema se le proporciona un código numérico y un código QR: que se escanea con el autenticador para dar de alta la cuenta o, si uno es masoquista, captura el código de 64 caracteres. Cuando el usuario desee ingresar a nuestra aplicación, podemos pedirle, luego de su usuario y contraseña, el código de seis dígitos que en ese momento aparezca en el autenticador y que nosotros comprobaremos. Podemos hacer eso porque el código se genera básicamente con dos elementos:
La llave secreta que se pasa al autenticador debería ser una combinación de una llave conocida sólo por nosotros y el nombre de usuario para que cada usuario reciba códigos de segundo factor distintos. Para que el usuario reciba su QR sin riesgo a que revele a otros nuestra llave, ésta debe combinarse con su nombre de usuario de una forma no trivial, por ejemplo, usando la función hash_hmac de PHP: Código PHP:
Código:
MZRDIZRQGI4TIYZTMY2WGMZRMQ4DQODDG43TKNRVGZTGIZRUMUYTCMRUMQ4TCNBW Si se decodifica eso, sólo se verá: Código:
fb4f0294c3f5c31d888c775656fdf4e1124d9146 En el archivo adjunto viene una carpeta oath con el código fuente de un ejemplo de verificación del segundo paso y la generación del código QR (usando el servicio de Google API Chart). Si disponen de un servidor local de desarrollo, deberían poder colocar la carpeta en su raíz web escribir un nombre de usuario y escanear el código con el autenticador. A partir de entonces, en el segundo recuadro colocan el código del autenticador y presionan SEND para verificar. Los archivos que dan vida a esto vienen en la carpeta oath/src y son tres:
Además viene el archivo hmac_sha1.php que no es necesario pero que les puede servir para ver cómo se implementa el hash_hmac que mencioné arriba. El archivo oauth.php tiene varias funciones, pero la básica es totp (de Time based One Time Password). Esta función recibe como parámetro único la llave tal como se le envía al autenticador, ANTES de codificarla en base 32, y devuelve el código de seis dígitos que es el que compararíamos con el que nos proporcione el usuario en el segundo paso de la autenticación. En el archivo gauth.php contiene la función gauth cuyos parámetros principales son:
Esta función devuelve un arreglo con dos valores:
El archivo base32.php contiene una versión light de codificación base 32 (es decir, light porque es apta sólo para textos relativamente pequeños). Hasta donde he visto, PHP no cuenta con funciones para este tipo de codificación. Como es justo dar al César lo que es del César, menciono que la versión original de estas funciones las vi en https://github.com/Voronenko/PHPOTP pero decidí simplificarlas en el proceso de tratar de entender qué es lo que hacían. Desde luego, no es necesario usar el servicio de Google para generar los QR. En el archivo gauth.php está la función getOtpAuthUrl que devuelve la cadena con la que debe conformarse el QR y podemos usar cualquier biblioteca que deseemos para tal efecto. // Saludos |
Un tip: El uso de google authenticator puede causar que se pierdan los logins en un formateo total del dispositivo (eso me paso!). Es mas recomendado usar authy.
|
Cita:
|
Te has llevado un punto de reputación positiva. Muchas gracias por la explicación.
|
Gracias por el aporte, amigo Román
Un saludo |
Agradecido, como siempre Roman. :)
Saludos :) |
Cita:
Ami me ha pasao esto y es una gran putada. Ya no quiero Google Authenticator ni en pintura. Prefiero algo mas sencillo como que metes el user (o mas bien el email) y pass (incluso no haría falta la pass) y te llega un email con un link que al pulsarlo te permite entrar en la web. |
También perdí mis datos con google authenticator, lo malo es que en algunos sitios obligan a usarlo y no sirve otro.
|
Cita:
Cita:
Al parecer no leyeron bien. El Google Authenticator se puede usar como muchos otros. Todos los que se mencionaron aquí usan el mismo algoritmo así que no tiene ni sentido que alguien obligue a usar el de Google. Todos producen los mismos números. Por otra parte se trata de no hacerle la vida difícil al usuario. Si le pides que acceda a su correo a ver el link ya es un paso más que deben dar. Además, un click a un sólo link es algo poco seguro, como ya en algún momento hice notar respecto de los manejadores de correos que visitan enlaces aun sin abrir el mensaje. Saludos |
Cita:
|
Eso es lo que me pasó, que abrí el google authenticator y habían desaparecido todos los datos, estaba como si acabara de instalar el programa.
Y por supuesto, ya no podía entrar en esos sitios a hacer nada, había que deshabilitar ese método, te piden varias semanas para validar la petición, etc. Después probé con authy, y de momento va bien. |
Sí, sí. Yo entiendo el problema. Pero es que tú comentaste que en algunos sitios obligan a usarlo y no sirve otro y eso es lo que yo digo que no es cierto. Tú puedes usar el que te guste y no pierda datos y, dado que el algoritmo es el mismo, no importa cuál uses.
Saludos |
Cita:
Saludos |
La lógica indica que tiene que ser así, pero por lo visto hay alguna diferencia que desconozco cuál es.
Instalé otro en lugar del de google y no me daba valores válidos para entrar en ciertos sitios, no me quedó más remedio que volver al de google. Ni idea del motivo. |
Cita:
Saludos |
Cita:
|
Es raro. Acabo de probar los dos freeOTP que vi en el Play Store y me dan los mismos números que el Google Authenticator. En uno de los dos programas parece que puedes escoger la codificación, que debes ser SHA1 y Base 32. Quizá por ahí hubo algo diferente.
Saludos |
Cita:
|
La franja horaria es GMT +2. Ahora son las 01:52:58. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi