La idea de autenticación es asociar una identidad externa a un principal, una representación interna del sistema. Para poder confirmar la identidad, primero debemos obtener información de la identidad, analizarla, y determinar si corresponden a la identidad. Como consecuencia, tenemos que almacenar información de cada identidad y hay que contar con mecanismos para procesar la información.

Sistema de Autenticación

Tiene los siguientes componentes:

  • - información de autenticación, la designación de la entidad e información provista.
  • - información complementaria, contiene la especificación de un principal e información almacenada por el sistema.
  • - funciones de complementación, derivan información complementaria.
  • - funciones de autenticación, determinan si un par son una asociación válida.
  • - funciones de selección, son funciones que permiten crear y actualizar y .

La información de autenticación es provista por una entidad externa, pudiendo provenir de diferentes fuentes, y por lo tanto tiene diferentes grados de confianza. Las fuentes son:

  • Algo que conozco: Basan la identificación en secretos compartidos, requiriendo almacenar de manera segura el secreto. Esto depende de la confidencialidad del secreto, y es uno de los mecanismos más empleados.
    • Clave
    • Passphrase
    • Pregunta Secreta
  • Algo que tengo: Basan la identificación en algún elemento físico. Esto requiere tener cuidado del elemento, y este puede ser copiado/clonado, y la información en transito puede ser suplantada.
    • Smart card/USB token
    • Generador de claves
    • Celular
    • Tarjeta de coordenadas (Token Grid)
  • Algo que soy: Basan la identificación en características intrínsecas de la identidad, que no son fácilmente modificables. Los métodos actuales no son 100% eficaces, y asumen que el dispositivo de lectura no puede ser manipulado.
    • Huellas digitales
    • Retina
    • Voz
    • Cara
  • Donde estoy (contexto): Basan la identificación en el contexto de la información que se recibe. Estos pueden actuar como factores positivos, por ejemplo que un operador debe conectarse desde la red privada, o como factores negativos, si un usuario accede desde otro país hay menos chances de que sea quien dice ser. El problema es que no determina exclusivamente la autenticación, si no que en general necesitan ser combinados con otros métodos.
    • Red de origen/País y ciudad/Geolocalización
    • Host/Terminal/Device
    • Día y hora de acceso, Velocity

Claves

Pueden tomar la forma de secuencias de caracteres, que tienen restricciones y son generadas aleatoriamente, por el usuario o de manera asistida. O también pueden ser secuencias de palabras, llamadas passphrases, que suelen aparecer en sistemas muy sensibles. Por ultimo están las claves algorítmicas, del tipo pregunta-respuesta (challenge-response) o mediante claves de uso único (OTP).

Estas claves pueden ser almacenadas como texto claro, en un archivo o base de datos, los cuales pueden ser accedidos por fuera del sistema, por lo que no puede garantizarse confidencialidad de las claves. Si se trata de almacenar en un archivo cifrado, esto requiere una clave para acceder a las contraseñas, que puede estar en un archivo de configuración, en el mismo ejecutable del sistema, ser ingresada cada vez que inicia el sistema o en un dispositivo criptografico especializado. Esto solo es recomendado si es requisito tener acceso a la clave original, por ejemplo para reenviarla a un tercer sistema.

PBKDF2

La forma correcta de no almacenar contraseñas es utilizar PBKDF2

Adivinando Claves

Es un ataque al sistema de autenticación mediante la prueba y error de claves potenciales. Se lo llama offline si se conoce y y se prueban para diferentes si , por ejemplo mediante el uso de programas como crack o john the ripper. Mientras que ataques online son aquellos que hacen uso de la función , probando con diferentes , hasta pasar la autenticación.

Hay ciertas prevenciones que se pueden hacer en general para disminuir el riesgo:

  • Esconder información para que , o no sean conocidas simultáneamente: Por lo general es conocida o puede conocerse, y es más fácil proteger que , que está en manos de la entidad externa.
  • Prevenir el uso de la función de autenticación
    • Tiempos crecientes ante fallas en la autenticación: Esto es un riesgo para el usuario, pues si un atacante sigue intentando con el mismo usuario, puede llegar a prohibirle el acceso por un tiempo prolongado, de forma que puede llegar a ser un DoS.
    • Deshabilitar principales: Esto también es un riesgo, pues significa un DoS para un usuario en especifico. En general los bancos lo implementan.
    • Jailing/Honeypot: Hacer creer al atacante que logro entrar, pero redigirlo a un mirror con mucha información falsa y escondida, de forma que pierda tiempo. Esto es costoso, por lo que en general solo empresas grandes pueden implementarlo. También existen honeynets, donde se tienen multiples de estos honeypots para que pierdan todavía más tiempo.
    • Captchas: La idea es limitar el tiempo entre requests, obligando al atacante a verificar que es una persona real, para limitar la posibilidad de ataques automatizados.
  • Subir la complejidad de las claves: Mediante la formula de Anderson , donde es la probabilidad de adivinar una clave, es el número de pruebas realizables por segundo, es el tiempo dedicado a las pruebas y es el tamaño del espacio de claves, se puede estimar el tiempo de un ataque.

También se pueden realizar mejores ataques, mediante el uso de diccionarios de palabras, diccionarios de claves descubiertas, realizando transformaciones simples de palabras (sufijos, prefijos, palabras espejadas, dos palabras combinadas, etc.), o utilizando información de contexto (nombre, usuario, dni, fecha de nacimiento, etc.).

Selección de Claves

La condición ideal es la selección aleatoria, donde cada clave es equiprobable. El problema es que esto es difícil de memorizar, por lo que se rompe la aceptación psicológica.

Otra forma son las claves pronunciables, donde se forman palabras sin sentido pero formadas por fonemas, lo cual es más fácil de memorizar. El problema es que el espacio de claves se ve muy reducido, por lo cual se requiere de claves más largas para tener la misma seguridad que una clave aleatoria.

Si dejamos que el usuario elija su propia clave, tenemos el problema de que las claves tienden a ser fáciles de adivinar. Para esto existe la revisión proactiva de claves, donde se analiza una clave al momento de crearla, para detectar y rechazar claves al aplicar reglas sobre palabras, realizar búsquedas en diccionarios y patrones, y utilizar información sobre el usuario y el contexto, de forma de rechazar claves “fáciles”.

Otra técnica es la expiración de claves, donde se fuerza a los usuarios a cambiar de clave luego de algún tiempo o evento, limitando el daño producido por una clave comprometida. Esto requiere evitar el reuso de claves (recordar y bloquear las ultimas claves), que se pueda cambiar de clave varias veces en un periodo de tiempo, y también se debería dar a los usuarios tiempo para pensar una nueva clave, así no los forzamos a cambiar de clave al momento de login y avisándoles con anticipación.

Salting

Si un atacante consigue , cada prueba puede realizarse en paralelo contra todos los . Para aumentar el tiempo requerido para adivinar claves, se introduce una perturbación, donde ahora , entonces cada se calcula con una perturbación diferente, y el atacante no puede reutilizar para buscar varias cuentas en paralelo.

PBKDF2

Password-Based Key Derivation Function 2 es utilizado para realizar más largo el tiempo necesario para calcular , dado que las funciones de hash normales están diseñadas para ser rápidas, lo cual no es bueno cuando queremos prevenir la paralelización de estos cálculos. La idea es que sea una contraseña, se calcula un salt aleatorio , y utilizando una función pseudoaleatoria (criptosistema simétrico o MAC), se calculan:

  • para Y luego el resultado es .

Al repetir la función por un numero parametrizable de veces () generalmente en los miles, lo que antes era una operación que tardaba una cantidad despreciable de tiempo ahora pasa a ser un calculo complejo, pues no se descartan los valores intermedios del calculo y estos forman parte del resultado final.

Challenge-Response

Autenticar a un usuario remoto requiere que se envíen las claves, lo cual es un problema pues requiere de un canal seguro y donde descubrir una comunicación antigua puede comprometer la clave.

La solución es no enviar la clave, en vez hacer uso de challenge response, donde se envía una secuencia alternativa llamado challenge, y que vuelva esa secuencia modificada por la clave, sin que esta tenga que viajar.

Hay un protocolo definido EKE (Encrypted Key Exchange) para realizar un challenge response, que hace uso de un canal seguro por control de integridad más que por confidencialidad.

OTP - Claves de Uso Único

Son generadores de claves que sirven una única vez. La idea es que si tenemos dos generadores separados físicamente, pero que generan la misma secuencia, basta con que la persona entregue la siguiente clave generada por el generador para verificar que realmente es quien dice ser, y que sea computacionalmente imposible para alguien con claves pasadas adivinar las siguientes.

Hay dos variantes estandarizadas, HOTP (HMAC based OTP) y TOTP (Time based OTP)

HOTP

Donde extrae 32 bits de los 150 del mac:

  • (4 bits del ultimo byte)
  • , donde es la cantidad de dígitos

La idea es que , el contador, se incrementa en cada uso, pero esto requiere sincronización (look-ahead), donde el contador del servidor puede encontrarse retrasado respecto del de dispositivo, por lo cual debe tratar con los próximos valores del counter también, en general hasta 5. Los códigos generados sonde 1 a 9 dígitos, y se recomienda usar al menos de 6, lo cual es un espacio de claves muy chico, por lo que se recomienda utilizar alguna forma de throttling.

TOTP

Es un OTP basado en timestamps, donde en vez de utilizar un contador, lo cambia por un timestamp definido como la cantidad de segundos que pasaron desde el epoch (segundo 0 en UNIX), y dividiéndolo por la cantidad de segundos de vida de cada código, utilizando con la parte entera. Hoy en día la sincronización del tiempo se considera un problema resuelto, lo cual elimina el problema de sincronización que se encontraba en HOTP.

Pese a esto, todavía se aconseja utilizar un drift-window (típicamente 2 minutos) que es la cantidad de ticks desfasados aceptados, especialmente en dispositivos que no están conectados al internet, y seguir utilizando throttling pues el tamaño de clave sigue siendo el mismo.

Hoy en día es el método más utilizadlo.

Multi-Factor Authentication

Consiste en requerir dos factores de diferente tipo, dado que cada tipo de factor requiere comprometer distintos assets. Algunas combinaciones comunes:

  • Algo que conozco + algo que tengo
  • Algo que conozco + algo que soy
  • Algo que tengo + algo que soy
  • Algo que soy + contexto

El problema es que esto requiere sistemas de recuperación de cuentas mucho más complejos, dado que este sistema debería ser tan seguro como la autenticación original. Esto es un problema abierto, con investigación hoy en día, pues no hay una solución aceptada.

Autenticación Remota (SSO)

Consiste en la delegación de la autenticación en un sistema externo, lo cual implica una relación de confianza. Hay varios productos dedicados a esto, como Active Directory Federation Services, CAS, Siteminder, pero como cada uno es propietario, con protocolos y conectores propios, muy poco extensibles, fueron más usados en ambientes cerrados, pero en el internet no prosperaron.

En el internet, se popularizo OpenID, que son tecnologías abiertas. OpenID 1 estaba basado en payloads en XML firmados con XMLSignature, lo cual era inconveniente, pues en XML hay muchos espacios que pueden ser quitados o agregados y siguen siendo el mismo mensaje pero aun así cambia la firma, por lo cual había un standard que definía la forma para sistemáticamente calcular un hash y que de lo mismo. Esto llevo a que OpenID no fuera muy usado, y es considerado obsoleto.

Después apareció OpenID 2, ya no basado en XML, pero justo al mismo tiempo apareció OpenID Connect, basado en Oauth2, que resolvió en conjunto autenticación y autorización remota, por lo que no logro amplia adopción.

Hoy en día OpenID Connect es utilizado para poder iniciar sesión con las cuentas de Google, Meta, Twitter en cualquier lado, y hasta cierto tamaño de aplicación esta mejor visto basarse en estos sistemas de autenticación en vez de implementar su propio sistema.