Autor

Alejandro Alcalde

Data Scientist and Computer Scientist. Creator of this blog.

Más artículos de Alejandro Alcalde | Porfolio

Hace unos años, hablé aquí sobre la idea de Steve Gibson, SQRL, sistema con el que pretende eliminar el uso de usuarios y contraseñas en internet. Unos dos años más tarde, con el proyecto bastante maduro, en Security Now!, Steve ha vuelto a dar detalles del funcionamiento de SQRL, y la verdad es que pinta pero que muy bien. En este artículo he usado como fuente el episodio #424 del podcast.

Resumen

Antes de empezar con los detalles, a continuación se muestra un resumen del sistema de autentificación:

El concepto principal

La jerarquía de claves de SQRL

¿Qué ocurre si queremos otra identidad para el mismo sitio?

¿Qué pasa si me me roban mi identidad SQLR?, ¿O si creo que me la robaron?

¿Qué pasa si quiero dejar de usar SQRL?

¿Y si un sito fraudulento muestra un ID de SQRL de otro sitio web?

SQRL Revised

Antes de comenzar, expliquemos los dos conceptos más importantes en los que se basa SQRL. El primero es el aspecto criptográfico, es decir, cómo tener una clave secreta para un cifrador, para uno como AES, o Blowfish. Es decir, a un cifrador se le pasa un texto plano, y devuelve un texto cifrado, usando la clave secreta. A eso se le llama un cifrador con llaves (keyed cipher). El segundo concepto son los hash, como SHA-256, SHA-1 etc, de 256 bits y 160, respectivamente. A estos algoritmos se les introduce algo, de cualquier longitud, y devuelven un mensaje de longitud fija, dependiendo del algoritmo: 256 bits, 160, etc. No importa cómo de largo sea el mensaje a resumir.

Resulta que también se pueden tener funciones hash con claves (keyed hash), actuando de forma similar a los cifradores. A estas funciones hash se las llama HMAC (Hash Messgage Authentication Code).

La diferencia pues, es que una función hash es simplemente una función, SHA-256 es el mismo SHA-256 para todo el mundo, esta funcionalidad es útil para algunos casos, por ejemplo para comprobar que un fichero descargado no ha sido modificado por nadie. El que sube el fichero, publica el resultado de aplicarle la función hash, y cuando tú lo descargas, vuelves a pasárselo, si el resultado es el mismo, el fichero no ha sido alterado.

Si embargo, un Keyed hash es distinto, la salida de la función viene determinada por la clave secreta. Por tanto, se tendrán tantas funciones hash como posibles claves se puedan generar a partir de la longitud de la clave. Si la longitud de la clave es 256 bits, se pueden generar \(2^{256}\) distintas claves, y por tanto \(2^{256}\) distintas funciones hash. SQRL usa un keyed hash.

Cómo usa SQRL la HMAC

Veamos un ejemplo. Imaginemos que vas a un sitio web, con lo cual tienes el dominio del sitio, por ejemplo amazon.com, o Twit.tv, el que sea. A ese dominio se le aplica un hash usando HMAC, lo que devuelve un resumen de una longitud fija, pero usando como clave tu identidad de SQRL. Esta identidad se creará al momento de instalar SQRL, y cada usuario tendrá su propia función hash, completamente distinta de la de los demás. El resultado de la función hash para el sitio visitado, por ejemplo amazon, será la clave privada para esa web.

SQRL genera una clave privada única para cada sitio web distinto que visitas, si dos usuarios de SQRL visitan el mismo sitio web, la función hash personal de cada uno dará un resultado distinto, ya que se está usando HMAC. Por tanto, usando una identidad maestra junto con la función HMAC, SQRL crea una galaxia de claves privadas de tal modo que cada usuario tenga una clave distinta cuando visitan sitios distintos. Como dijimos antes, con \(2^{256}\) hay claves de sobra. Tantas que no hay que preocuparse por posibles colisiones.

Resumiendo lo visto hasta ahora, SQRL consiste en un usuario con una identidad maestra, para el cual el sistema crea automáticamente una clave privada para cada sitio que visita. Eso sí, cuando se visita la misma web, se obtiene la misma clave privada.

Uso de la clave privada

¿Qué se hace con la clave privada? Esta clave se basa en una curva elíptica, en concreto la de Dan Bernstein, por ser determinista, es decir, la clave no se elige aleatoriamente, porque tendría que almacenarse, memorizarla. Y de ser así, se tendrían que guardar para cada uno de los sitios visitados, bastante molesto. De este modo, pueden crearse sobre la marcha usando la identidad maestra y el nombre de dominio.

El siguiente paso es usar una función de la curva elíptica que obtiene la clave pública a partir de la privada, pero no funciona al contrario. A partir de la pública es imposible obtener la privada. Además, la clave pública será la identidad del usuario para esa web, y el servidor de la web la almacenará para identificarte.

Por último, cuando el usuario se identifica en un sitio web, la web dice vale, dices que este eres tú, demuéstralo. Para ello la web envía un trozo de datos aleatorio (único para cada usuario), el usuario los firma con su clave privada y lo devuelve a la web. De éste modo, sin exponer la clave privada, acabas de demostrar que la posees. Esto es SQRL en esencia, proporcionar la clave pública a una web para identificarte. Cuando quieras volver a identificarte en ella, en lugar de usar el típico e inseguro usuario/contraseña, usando SQRL, la web envía un trozo de datos aleatorios, el usiario entonces le devolverá los datos firmados con la clave privada y la clave pública. Al haber usado la web anteriormente, ya conocía tu clave pública, verifica la firma y corrobora que tú eres quien dices ser y listo, identificado.

¿Y si alguien se hace pasar por mí?

Una identidad SQRL es un sistema de dos personas (tú y todas las webs del mundo), el usuario es pseudoanónimo para todas las webs. Ya que cada sitio web ve al usuario como un token aleatorio (la clave pública). De este modo el usuario no puede ser rastreado, es decir, no hay forma de asociar tu identidad entre sitios webs. Además, la clave pública que proporcionas al sitio web solo es útil para dicho sitio, para ninguno más, a diferencia del usuario/contraseña. En esencia, con SQRL no estás dándole a la web un secreto que guardar (la contraseña), no necesitan mantener segura la base de datos. Cualquiera podría descargarla y le sería inútil, a cualquiera salvo al sitio web.

Cómo recuperar tu identidad

¿Cómo permitimos a los usuarios que sean responsables de su propia identidad, pero al mismo tiempo darles la opción de recuperarla si la perdieran, o se la robaran?

Lo primero a tener en cuenta es que SQRL no usa tu identidad más secreta para funcionar, esa es la que guardaremos como último recurso. Lo primero que SQRL hace es generar un “código de rescate”. Un número de 24 dígitos decimales. Este código es el que debe guardarse como el mayor de los secretos. Es tan secreto que no se guarda en ningún cliente SQRL. Cuando se configura SQRL por primera vez, lo imprime por pantalla, y debes anotarlo, o imprimirlo como dígito o como código QR.

Esta es la carta “Salir de la cárcel” de la que hablábamos al principio. Te sacará de cualquier problema. Y por ser tan poderoso, no se almacena. El único requisito es anotarlo o imprimirlo, y ponerlo en un lugar seguro. El código no puede regenerarse, ya que es completamente aleatorio. Es tu identidad maestra.

Una vez anotado o imprimido, SQRL comienza el proceso de hash, aplicando múltiples hash, haciendo operaciones XOR. Tras aplicar iterativamente funciones hash al código, se obtiene lo que será la clave para la función hash del usuario, recuerda, una keyed hash (HMAC). Ahora, la clave de la función hash se cifra con una contraseña usando la función Scrypt, la cual hace totalmente inviable averiguar la contraseña.

¿Y si me roban mi identidad?

Para ello se creó el Identity Lock (Bloqueador de identidad), un protocolo consistente en una serie de ecuaciones. Conforme se les va proporcionando la clave pública a las webs, se les proporciona también información sobre el identity lock. Esta información se genera aleatoriamente por el cliente, y el protocolo permite al cliente generar dicha información para asegurar tu identidad, pero no probrarla. Por tanto, esto difiere de la capacidad anterior de SQRL para probar tu identidad firmando puñado de datos que envía la web.

El objetivo del identity lock es hacer deliberadamente que los clientes no sean capaces de probar algo en el futuro que ya aseguraron probar antes. Así, si el cliente queda fuera del control del usuario. No podría usarse para cambiar tu identidad en ninguna web en la que ya la hubieses establecido. De este modo, un ladrón en posesión de tu identidad, de tu código, contraseña… todo, no podrían eliminar tu identidad.

La segunda cosa que proporciona el código de recuperación (La carta para salir de la cárcel), al insertarlo en el cliente SQRL, permite cambiar tu identidad y re-habilitar la autenticación de haber sido deshabilitada, ya que es posible deshabilitar la autentificación para las webs, pero solo es posible rehabilitarlas con el código de recuperación.

Deshabilitar la autentificación

La posibilidad de deshabilitar la autentificación es útil cuando por ejemplo, pierdes tu móvil, te lo confiscan, etc. En esos casos, tu identidad queda expuesta, pero con cualquier otro cliente SQRL puedes cargar tu identidad y deshabilitar la autentificación para tu identidad. Ningún intruso podrá cambiar tu identidad y tú puedes deshabilitarla, pero para reactivarla necesitarás el código de recuperación. Si alguna vez pasa algo así, al reactivarla con el código, es posible regenerar la identidad (rekeyed).

Conclusión

Esto en esencia es SQRL, bastante prometedor. A continuación dejo el episodio del podcast y la documentación de SQRL.

Fuentes

¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.