Cuatro años, cuatro años para poder cifrar mensajes de WhatsApp.
Esto es lo que le ha llevado a WhatsApp implementar un sistema de cifrado end-to-end (ES) en su aplicación. Cuatro años, que se dice pronto, desde ese anuncio, allá por 2012, que aseguraba contar ya con cifrado “completo”.
De aquel día hasta hoy (bueno, ayer, que lo estoy escribiendo en la tarde/noche, después del anuncio), 5 de Abril del 2016, en el que la compañía, tutelada por la batuta del equipo de Open Whisper Systems (creadores de varias de las herramientas de mensajería más seguras y privadas del mercado), acaban de distribuir una actualización de su app para Android, iOS y WindowsPhone con los cambios oportunos.
Cuatro años en los que WhatsApp se ha posicionado como la herramienta de comunicación digital por defecto. Hasta el punto de que, con su negativa a apoyar el desarrollo de sistemas operativos de nueva generación, ha fomentado el binomio actual. Pese a que su seguridad, como señalé hace escasas semanas en aquel informe de estado de la seguridad en aplicaciones de mensajería, y que he repetido hasta la saciedad por estos lares, la posicionaba a la cola del mercado (nivel 2 de 7, que se dice pronto…).
Un hecho que demuestra lo que seguramente sea la ley más universal no escrita de los negocios digitales: Quien llega antes, y llega más o menos bien, lo consigue.
Pese a que había (y hay) herramientas en el mercado que dejan a WhatsApp a la altura del betún (¡Hola Telegram!, ¡Hola Line!), la compañía tiene un intangible que simplemente supera cualquier otra deficiencia: un billón de usuarios (billón anglosajón ojo, es decir, mil millones “de los nuestros”).
Precisamente ese billón que da sentido a que Facebook realizara la que fuera en su día la compra más cara de la historia por una startup de apenas 50 trabajadores.
Un billón de usuarios (seguramente bastante más, que habrá algunos que han conseguido anteponerse a la presión social y apostar por aplicaciones más completas) que por fin, cuatro años más tarde, ya podrán realizar comunicaciones que podríamos considerar privadas y seguras.
Y todo gracias a que cuatro años más tarde, la compañía ha acabado por rendirse a la evidencia: en un entorno crispado por esa guerra entre el FBI y Apple por la necesidad “legal” de que los cuerpos de seguridad tengan una llave para cohibir las libertades de los ciudadanos. En ese mismo entorno sensible a la importancia de la privacidad, y motivado por las revelaciones de auténticos héroes (patriotas, si quiere verlo de esta manera) como Snowden, el cifrado de las comunicaciones no es un activo opcional. Pasa a ser algo necesario.
En este nuevo capítulo de la serie #MundoHacker, donde tratamos en varios tutoriales las medidas para atacar y/o defenderse en el mundo digital, quería dedicar el resto de la pieza a explicar de una manera sencilla cómo funciona el cifrado de punto a punto que ha implementado WhatsApp en su servicio, y que sin lugar a duda, ofrece un soplo de nuevos aires al futuro de todas aquellas herramientas masivas que aún no han dado el paso (que ya no son tantas, sinceramente…).
Índice de contenido
Detrás de las comunicaciones seguras en WhatsApp, Signal Protocol
2014 parece ser la fecha (EN) en la que empezaron a trabajar en el asunto. ¿En juego? Cambiar la arquitectura de todo el servicio, cuya única prioridad hasta entonces había sido la operativa (ser escalable y evitar, en la medida de lo posible, los cuellos de botella habituales en eventos multitudinarios, como suele ocurrir en Noche Vieja o en alguna otra celebración de tipo la Superbowl), para adaptarse a las necesidades de un entorno que demanda seguridad.
Recurrían entonces, muy acertadamente, a Open Whisper System, fundada por Moxie Marlinspike, y creadores de herramientas de la talla de Redphone, Signal o TextSecure.
Bajo la nueva arquitectura de WhatsApp ahora opera Signal Protocol (EN), un protocolo abierto (uno de los puntos básicos para considerar el nivel de seguridad de una herramienta, al estar expuesto a la auditoría de cualquier persona interesada en realizarla) de cifrado end-to-end, cuyo funcionamiento, aplicado a WhatsApp, explican en este paper (EN/PDF) y que intentaré resumir a continuación.
WhatsApp pasa de esta manera a utilizar una clave asíncrona que permite realizar envíos de mensajes, archivos y llamadas que se alojarán, como siempre lo han hecho, en los servidores de la compañía (algo necesario si queremos que éstos estén disponibles si cambiamos de terminal, por ejemplo, o para que nos lleguen notificaciones después de una temporada sin acceso a la red), pero cifrados, de manera que un posible MITM, un hackeo a los servidores (o una petición del FBI) solo expondrían el dato cifrado, a falta de conocer la clave privada que únicamente deberían tener el emisor y el receptor de la comunicación.
Dicha clave se genera a partir de varias:
- Identity Key Pair: Clave pública generada la primera vez que instalamos WhatsApp en el terminal.
- Signed Pre Key: Clave firmada por la anterior, que se genera también la primera vez que instalamos, y que además, va rotando periódicamente.
- One-Time Pre Keys: La clave que se genera para cada comunicación.
- Root Key: Llave de sesión única para cada usuario, de 32 bytes.
- Chain Key: Llave generada a partir de la Root Key, de 32 bytes.
- Message Key: La llave de cifrado de cada mensaje, de 80 bytes. 32 bytes utilizan una clave AES-256 key, 32 bytes una HMAC-SHA256 key, y los 16 bytes restantes, IV.
Registro de Cliente
La primera vez que nos registramos, el sistema genera la Identity y la Signed Pre Key, y con ellas, se envía al servidor la One-Time Pre Key, que asocia a la identidad del usuario. Es la clave pública que permite a otro usuario entablar comunicación con nosotros.
Inicio de sesión
Para establecer una comunicación con otro u otros usuarios, el servidor genera un canal seguro basado en las claves públicas de cada usuario, realizando las tareas matemáticas oportunas, y ese canal seguirá en activo hasta que alguno de los miembros implicados elimine su cuenta, o cambie de dispositivo (cambiando por tanto su Identity Key Pair).
Comunicación
Una vez establecida la comunicación, el servidor enviará los mensajes que le lleguen cifrados al receptor o receptores, incluyendo en las cabeceras la información que el cliente necesita para descifrarlos en tiempo de consumo (calcular el master-secret en base a su clave privada).
La Message Key, como ya vimos, cambia para cada mensaje enviado, lo que evita que un atacante pueda reconstruir la conversación teniendo conocimiento de mensajes anteriores cifrados y sin cifrar.
El envío de archivos se hace de una forma semejante, pero con algún paso extra (primero se cifra el archivo, se envía al servidor, y el servidor envía un mensaje cifrado al receptor o receptores con la información para descargar el archivo cifrado).
Pasaría algo parecido con el envío de mensajes en grupos. El usuario envía un mensaje único cifrado, y es el servidor el encargado de replicarlo N veces, manteniendo la integridad del mismo, y generando para cada usuario una Message Key compatible con su clave privada.
En el caso de llamadas, la comunicación se hace por SRTP (el mismo protocolo que usan la mayoría de cámaras de videovigilancia), que se cifra y se descifra en tiempo de ejecución.
Verificación de la integridad del cifrado
El nuevo protocolo permite a los usuarios de una manera relativamente sencilla, asegurarse que en efecto están realizando una comunicación segura.
De hecho, para comprobar que en verdad la comunicación se está estableciendo en un canal seguro, el servicio ofrece un código QR que, escaneado en el móvil receptor, comprobará el estado del canal.
Hay que dejar claro que para que en efecto la comunicación se haga e2e, todos los clientes implicados deben tener una versión de WhatsApp compatible con el cifrado end-to-end. Basta que uno no la tenga en un grupo para que toda la información que se pase por el grupo se haga en texto plano, como ha ocurrido hasta entonces.
Y una vez la comunicación se haga de forma cifrada, no hay vuelta atrás. Lo cual me parece muy adecuado, ya que inhabilita cualquier ataque de tipo “Delorean” en el que un tercero instale una versión anterior de WhatsApp y pueda leer el contenido.
Eso sí, se fuerza de esta manera a que dentro de unos meses, quien no haya instalado las versiones actuales, deje de poder utilizar el servicio.
Además, para saber si nuestra versión de WhatsApp ya es compatible con este paradigma de comunicación, bastaría con irse a Ajustes > Cuenta > Seguridad (si no le aparece, es que todavía no tiene una versión compatible). Y para saber si la otra persona tiene ya habilitado el servicio, debería aparecernos el candado cerrado con una breve explicación dentro del perfil visible de ese usuario.
En definitiva, que por fin algo que llevamos cuatro años demandando está llegando al usuario de a pie. Un paso de gigante para un servicio que no es precisamente conocido por realizar los movimientos que la industria demanda.
Pero son buenas noticias, en resumidas cuentas. Ya no podré decir eso de que “mejor por WhatsApp no”.
O al menos, eso espero, G.G.
________
Realizar este tipo de artículos me lleva varias horas, y en algunos casos, gastos extra que habitualmente suplo de mi bolsillo, o gracias a esa comunidad de patronos que me apoyan realizando donaciones puntuales o periódicas.
Si le gustaría ver más de estos tutoriales y análisis por aquí. Si el contenido que realizo le sirve en su día a día, piense si merece la pena invitarme a lo que vale un café, aunque sea digitalmente.
Muy buen artículo, como la gran mayoría de las cosas que publicas. Gracias por eso.
Sólo aclararte que es imposible que Whatsapp tenga tantos usuarios porque no hay un billón de habitantes en el mundo. Un billón es un millón de millones y Whatsapp tiene “solo” mil millones. Un abrazo.
Muchas gracias Jaime. Y tienes mucha razón, me ha faltado matizarlo. Cuando hablaba de billón, lo hacía del “billón anglosajón” (ES), no del español. En efecto, el nuestro son un millón de millones. El inglés equivale a mil millones, que es justo lo que comentas.
Fallo mío, perdona. Ahora actualizo.
Como me chirriaba un poco tu explicación, y, como el pdf era cortito me lo he leído.
Aun con escasos, que no nulos, conocimientos de criptografía, algo más o menos he entendido.
El caso es que me chirriaba lo de que en los mensajes de grupos, “El usuario envía un mensaje único cifrado, y es el servidor el encargado de replicarlo N veces, manteniendo la integridad del mismo, y generando para cada usuario una Message Key compatible con su clave privada.”
En realidad, si el server tiene que tocar el mensaje, manteniendo la integridad del mismo, o mandar claves a los clientes para que lo puedan descrifrar, ya se ha roto el cifrado end to end.
Y, dado que lo has simplificado mucho en tu explicación, me permito la libertad de retomar la gracia del cifrado.
Lo que manda el cliente al server son claves públicas de un solo uso, es decir, que esa clave solo podrá ser utilizada una vez, una vez el cliente reciba la confirmación de que ha sido usada la borrará de la lista, y cuando se terminen generará otro paquete. Lógicamente, esas claves se generan en base a las claves privadas que solo tiene el cliente en el extremo.
Esa clave se utiliza para generar la cadena de claves de sesión, no para cifrar propiamente dicho, puesto que una vez se establece la comunicación y comienza el envío de mensajes, Cada uno de esos mensajes va tomando una clave distinta de la cadena de claves para esa sesión.
Cuando estamos en un grupo, lo que se hace es que se cifra con las claves de todos los receptores y el server se encarga de crear una copia del mismo para cada receptor, para borrarlo una vez se lo haya llevado. La idea es similar a la que utilizan algunos servicios que guardan ficheros en la nube y que permite compartirlo, si se ha cifrado en un extremo, sin la clave no es posible mandarlo a varias personas, y, lógicamente, si tienes que revelar tu clave, se pierde la gracia. Si al cifrarlo lo, digamos, firmas, con todas las claves públicas de los usuarios que lo van a leer, estos lo podrán descifrar. Lógicamente, para que lo pueda leer otra persona más, es necesario descifrarlo y volverlo a cifrar añadiendo la clave del nuevo usuario.
En el caso del pdf de este artículo también habla de distintas formas de cifrar otros datos como conversaciones o documentos, que se me escapan, pero que parece que van en la misma línea, pero adaptándolos a las necesidades del envío. Al final, cifrar una frase detrás de otra no es lo mismo que cifrar una conversación de voz, pues, en el segundo caso, los datos a cifrar son mucho mayores y requiere que sean recibidos en un tiempo que no haga que la conversación vaya a golpes.
No se donde leería e interpretaría que el cifrado end to end ya se aplicaba, y, supongo que han ido haciendo cambios en los protocolos, de echo, hace días que cuando reenvías un video, por ejemplo, ves que lo vuelve a subir, cuando antes, al reenviar un video que te había llegado simplemente lo enviaba.
Si antes Facebook aprovechaba que el mismo video de gatitos cantando un villancico, se compartir un millón de veces, solo lo necesitaba almacenar una vez, ahora lo almacena un millón de veces cifrado. Eso si, una vez el mensaje se ha entregado se pierde para siempre de sus servidores
Espero que si alguien más ha leido este artículo y le ha surgido la misma duda que a mi, le sirva para entender un poco más el juego de guasap.
Buen apunte Khepper. Tampoco dije en el artículo, y ha creado bastante confusión, que el cifrado e2e del WhatsApp sigue compartiendo algunos datos (metadatos de comunicación, mejor dicho) en texto claro. La hora del envío, y según parece (sinceramente, no lo he comprobado) el teléfono, por lo que a priori el tracking de una agencia podría seguir haciéndose, aunque sin las claves de cifrado solo puedan constatar el contacto.
También es cierto, aunque, al final, necesitando la cadena de claves para poder descifrar la conversación completa, solo puedes saber cuando se ha enviado un mensaje, que, en caso de tener el otro extremo online, sabiendo a que hora se envía o recibe es un dato que también tienes.
Al final hay quien captura trafico que cree que contiene información interesante por si algún día es capaz de descifrarlo
Y no miramos para nadie :).
NSA, digo, buen aporte!