Crédito de la imagen: whispersystems.org

Índice

Seguro que muchos últimamente os preguntáis qué significa ese mensaje que aparece en vuestras conversaciones de WhatsApp:

Las llamadas y mensajes enviados a este chat ahora están seguros con cifrado extremo a extremo. Toca para más información.

Para los curiosos, en el podcast Security Now!, episodio 555 Steve explicó el protocolo que han implementado para mantener las conversaciones y llamadas de WhatsApp seguras. He pensado que puede ser de interés para los lectores del blog, así que lo he traducido. Comencemos:



Resumen

Para el que no quiera entrar en detalles aquí los aspectos básicos son:

Lo que no proporciona este protocolo es:

Veamos ahora el tema con más detalle:

De donde viene Signal

Signal es un protocolo que ha desarrollado Open Whisper Systems a lo largo de los años como parte de su aplicación de mensajería SMS TextSecure. Durante todo este tiempo ha ido evolucionando hasta convertirse en el brillante protocolo que es hoy día, como pondremos de manifiesto en este artículo.

El objetivo principal del protocolo es porder enviar un mensaje de forma segura, aunque el destinatario no esté conectado en ese momento. El problema de esto, es que el mensaje necesita almacenarse temporalmente en un servidor, con los problemas de seguridad que esto conlleva. Es aquí donde los chicos de Open Whisper Systems fueron refinando su protocolo con el paso de los años hasta conseguirlo. Cabe destacar que el protocolo es de código libre.

Qué ofrece el protocolo signal - Propiedades

La integración de Signal con WhatsApp ofrece a sus usuarios confidencialidad, lo cual se traduce en que las comunicaciones están cifradas. Integridad, que significa que cualquier alteración en un mensaje será detectada y no se producirá la transacción. Esto último implica que exite un código de autentificación de mensaje (una MAC). Por último, autenticación, aunque esto hay que activarlo, ya que está apagado por defecto (Veremos cómo activarlo más adelante). La Autenticación significa que podemos verificar la identidad de la otra persona. Otra propiedad del protocolo es validación del destino (Destination validation), esto significa que si alguna vez en el futuro, se compromete la clave privada no será posible descifrar mensajes antiguos (Foward secrecy). Del mismo modo disponen de backward secrecy, siendo lo contrario del anterior, si una clave privada antigua se ve comprometida, no será posible descifrar mensajes futuros. Estas dos últimas propiedades se consiguen con lo que se denominan Ephemeral Keys o claves efímeras, este tipo de claves están en constante cambio y renegociándose continuamente, de modo que alguien que consiga una clave no podrá usarla. Por último, Message unlinkability (Asincronía), los mensajes son asíncronos e independientes, pueden llegar en distinto orden, pueden perderse, y aún así el sistema seguirá siendo consistente.

Cómo funciona el asincronismo

Para lograr el asincronismo, los mensajes se deben encolar en un servidor a la espera de que el destinatario se conecte. Este proceso es realmente complicado y el traductor no tiene el conocimiento para hacerlo, pero en las referencias se proporcionan enlaces para los interesados que deseen profundizar en el tema.

Sí que se explicará por ecima el proceso. Llegado un punto ambas partes producen una curva elíptica, en concreto la curva 25519, el cual es el algoritmo de curva elíptica de Bernstein. Esta es la misma curva que usa Steve en su protocolo SQLR.

Una vez creadas ambas claves Diffie-Hellman privadas y públicas, que son estáticas, crean un conjunto de claves efímeras. En el siguiente paso utilizan el acuerdo de llaves (Key agreement) de Diffie-Hellman tres veces: El primero es coger la clave privada y la clave efímera de la otra persona, el segundo Key Agreement es el mismo que el anterior pero lo hace el otro usuario, es decir, se coge la clave privada y la efímera del otro participante en la conversación. Por último, el tercer key agreement consiste en intercambiar las claves efímeras de ambos y usarlas con Diffie-Hellman. Se concatenan las tres y se obtiene una clave de sesión maestra.

Como se comentaba anteriormente, la complejidad del proceso es bastante alta.

El concepto de Ratchet

En un protocolo interactivo, un ratchet o trinquete es el termino usado cuando se quiere evolucionar una clave sobre la que ya se ha establecido una negociación. Conforme se van enviando mensajes, se avanza el trinquete. Para sincronizarlos, el usuario A envía la primera mitad de su acuerdo con clave Diffie-Hellman sobre el usuario B. Hasta que no reciba la mitad restante del usuario B no puede hacer nada. En el momento en el que el usuario B envia su mitad de la clave, A envia la parte que faltaba con un acuse de recibo afirmando que recibió la primera mitad de la clave de B. Ahora ambos tienen una clave pública Diffie-Hellman efímera intercambiada. Con esto ambos pueden realizar un Key agreement Diffie-Hellman y obtener la siguiente clave ratchet.

Sigal hace Offline Ratchet

El problema con el mecanismo anterior es que funciona solamente en tiempo real. En este caso es necesario poder enviar un mensaje aunque el destinatario no esté en línea. Para ello crearon el denominado Offline Ratchet. Si el emisor está enviando varios mensajes, a cada uno de ellos se le aplica un hash, para que ningún mensaje enviado comparta la misma clave. En el momento en que el receptor se conecta, ambas partes resincronizan sus Offline Ratchets.

¿Cómo se envía el primer mensaje de forma segura?

En un protocolo en tiempo real, se puede crear una clave compartida en tiempo real. Pero este sistema pretende que sea posible enviar un mensaje seguro a alguien con quien nunca has hablado. ¿Cómo se logra esto?

Los chicos de Whisper Systems lo solucionaron de una forma muy elegante. Al registrarte en tu aplicación WhatsApp o Signal, se le envían al servidor 100 claves públicas efímeras con un identificador asociado. Esto permite a alguien que quiera enviarte un mensaje, y que nunca lo ha hecho hasta ahora, coger una de esas claves para poder mandarte el mensaje de forma segura. La ventaja de las claves efímeras es que solo se pueden usar una vez, y al estar identificadas en cuanto se usan el servidor las borra, es imposible que la misma clave se utilize dos veces. Digamos que pueden verse como una caché de claves de un solo uso, de usar y tirar.

Autentificación

Hasta ahora todo lo que han desarrollado en Whisper Systems ha sido un éxito, una obra maestra. Sin embargo, en este tipo de protocolos siempre hay un punto que flaquea, y ese punto es la autentificación. Autentificación significa que tienes la certeza de que con quien hablas es quien tú crees que es. En threema por ejemplo, lo resolvieron con el sistema de tres puntos y colores. Un punto rojo significa que simplemente esa persona está en tu lista de contactos, dos puntos y amarillo que ambos os tenéis en la lista de contactos. Por último, tres puntos y verde significa que ambos os habéis encontrado en persona y habéis leido el código QR asociado a cada usuario, lo cual certifica que la persona A dice ser quién es y B lo sabe y al contrario.

En WhatsApp y Signal, han hecho algo parecido, la imagen del inicio del artículo muestra un código QR en la pantalla, esa es la parte de autentificación de WhatsApp. En Whisper Systems entienden que este cabo es el único que no han atado, no hay forma de resolver el problema de la autenficación, en esta parte el usuario debe ser proactivo. Por este motivo se proporciona el código QR, junto con un número con 60 dígitos (Codificado en el QR). Este código QR es único para cada conversación, y ambos participantes deben tener exáctamente los mismos 60 dígitos. Una vez generado el código no debe cambiar nunca, si cambia es que hay alguien en medio escuchando la conversación o haciéndose pasar por la otra persona (Man in The Middle).

Cómo verificar la identidad de un contacto

Para verificar que ambos tenéis el mísmo número basta con hacer click en la foto del contacto y pinchar en el icono de “Información”, allí encontraréis un apartado llamado “Cifrado/Encriptación”. Al pulsarlo aparecerá el código QR y un botón para escanear el de vuestro contacto. Debido a que ambos comartís el mismo código, este paso basta con que lo haga uno de los dos participantes, ya que lo único que se comprueba es que el número coincide.

Recibir notificaciones de ataques Man In The Middle

Aún haciendo el paso anterior, nada nos protege si en algún momento las claves se ven comprometidas, para recibir notificaciones de seguridad hay que ir a los ajustes de nuestra cuenta de WhatsApp y en la sección de seguridad activar la opción “Mostrar las notificaciones de seguridad”:

Conclusión

Citando a Steve:

WhatsApp es una obra maestra, me quito el sombrero. Con Signal tenemos una solución perfecta, libre, multiplataforma, con librerías para varios lenguajes. No hay excusa para no usarla.

Espero que os haya gustado el artículo, el resto de artículos traducidos están en /security-now/

Referencias

Para quien quiera seguir leyendo sobre el tema: