Seguridad en XMPP - Introducción al cifrado extremo a extremo
Versionado de la entrada
- Primera versión 2025-11-12: Intenté sacar una sola entrada pero se me estaba haciendo muy largo así que al final he decidido dividir este articulo en varias partes, en principio solo deberían ser dos pero hoy por hoy es algo que no puedo asegurar jejeje.
Introducción
Vivimos en un mundo donde lastimosamente estamos bajo constante vigilancia, lo peor de todo no es que este tipo de cosas esté pasando sino que directamente las nuevas generaciones lo están normalizando. Esta entrada va para aquellos que queremos tecnologías que no se comporten de la misma manera que lo hace un malware tradicional, porque seamos sinceros lo que hace Meta, Google, Microsoft a través de sus aplicaciones no es muy distinto a lo que hace un spyware, de aquellos que solíamos eliminar con el "anti-virus" en los años 90.
Ya no solo tenemos que lidiar con que las grandes tecnológicas tengan una obsesión por espiar sino que además los políticos de la UE quieren meternos una puerta trasera en las aplicaciones de mensajería a través de "ChatControl", sé que la entrada no va de esto pero aprovecho la ocasión para informar y decirles que a fecha de hoy aún podemos hacer algo: [https://fightchatcontrol.eu/]
Si abominaciones como Chatcontrol llegan a ser aprobadas, no nos quedaría mas opciones que usar servicios mas descentralizados como XMPP o chats que hagan conexiones punto a punto. Si yo tengo que apostar por alguna tecnología esta es XMPP. También está "Matrix" pero yo personalmente no la considero 100% descentralizada, como esta no es una entrada de aplicaciones de mensajería sino mas bien de mostrar como lidiar con algunas "limitaciones" de XMPP como es el cifrado extremo a extremo, evitaré extenderme en otros temas que no estén relacionados con esta limitación.
XMPP por su naturaleza descentralizada trae muchas ventajas pero también traen otras desventajas, una de ellas es el cifrado extremo a extremo. Y para ser sinceros por mucho que sea defensor de XMPP debo reconocer que el proceso de cifrado extremo a extremo puede llegar a ser bastante tedioso, primero porque es un concepto duro de masticar y aunque aplicaciones móviles como [Conversations] hacen las cosas mas fáciles, cuando se quiere tener una experiencia "Multidispositivos" las cosas se empiezan a complicar.
La idea es sacar varias entradas explicando como lidiar con el cifrado extremo a extremo en XMPP, pero antes de hablar de esto quiero hacer una introducción al concepto de cifrado extremo a extremo, una vez se tenga claro este concepto podemos continuar con ciertos consejos para tratar con esto en XMPP, en especial cuando intentamos conectar varias aplicaciones diferentes o dispositivos distintos.
https://fightchatcontrol.eu/
Conversations
Cifrado extremo a extremo
¿Que es el cifrado extremo?
Para no hacer la guía mas larga, básicamente cuando enviamos un mensaje a través de este tipo de aplicaciones como Whatsapp, Signal, XMPP, el mensaje llega a un servidor y luego este servidor se encarga de reenviar esta información al destino. Pongamos un ejemplo:
Quiero enviar un mensaje a mi mamá, supongamos que uso Whatsapp, entonces el flujo del mensaje a grandes rasgos sería algo como esto:
Mi Whatsapp -> Servidor de Meta -> Whatsapp de mi mami.
Cuando no había cifrado extremo a extremo, el mensaje iba cifrado a nivel de conexión entre cliente y servidor pero no a nivel de mensaje como tal. Es decir, si un atacante intervenía en la conexión entre el cliente y el servidor este en teoría no podría ver nada. Es decir a nivel de tráfico el mensaje era seguro pero una vez el mensaje llegara al servidor sus dueños, en este caso Meta, podrían leer ese mensaje. En pocas palabras teníamos algo como esto:
Mi Whatsapp (Mensaje en texto plano pero conexión cifrada) -> Servidor de Meta (Mensaje en texto plano, aquí Meta podía leer el mensaje ) -> Whatsapp de mi mami(Mensaje en texto plano pero con conexión cifrada)
Cuando Meta implementó el cifrado extremo a extremo en WhatsApp lo que hicieron fue cifrar el mensaje desde el origen, el servidor se encargaba de reenviar esos datos al destino pero el dueño del servidor *no puede leer esos mensajes*, al menos en teoría. Básicamente sería algo como esto:
Mi Whatsapp (Mensaje cifrado y conexión cifrada) -> Servidor de Meta (Mensaje cifrado y conexión cifrado, aquí Meta en teoría no puede leer los mensajes) -> Whatsapp de mi mami.(Mensaje cifrado y conexión cifrada)
Por eso se llama "cifrado extremo a extremo" porque desde el dispositivo de origen se cifra el mensaje, viaja cifrado por el canal de comunicación y solamente se descifra en el dispositivo de destino.
El marketing de Whatsapp
Whatsapp nos vende la idea de que como ellos cifran de extremo a extremo, ni siquiera ellos pueden leer los mensajes. Esto es cierto, sin embargo Whatsapp pertenece a Meta y estos tipos nunca dan puntada sin hilo, al menos en lo que respecta a la privacidad. Sabemos que las grandes tecnológicas como Google, Apple, Facebook, Amazon y Microsoft (GAFAM) suelen tener cero respeto por la privacidad de los usuarios. Si bien el cifrado extremo a extremo de Meta aparentemente es seguro, ellos en su marketing no suelen decir nada con respecto a los metadatos. Si, la comunicación entre usuarios está cifrada *pero los metadatos NO*.
Del prefijo griego "meta" que significa "mas allá". En una manera muy abstracta se suele usar para un concepto que se aplica sobre si mismo. Básicamente los metadatos serían "datos sobre los datos". En aplicaciones como Whatsapp se suelen recoger este tipo de metadatos:
- A quien envías un mensaje.
- Cuando fue enviado tu mensaje.
- Que tan frecuente te comunicas.
- Información de tu dispositivo y dirección IP.
- Tu número de teléfono.
- Número telefónico del destinatario.
Solo con los metadatos ya se pueden determinar comportamientos y hábitos de uso sin ni siquiera leer los mensajes.
Según mi experiencia técnica basándome en lo que he leído en XMPP también hay algunas fugas de metadatos, esto es porque XMPP es descentralizado y los metadatos aquí son necesarios para comunicarse con otros servidores, el único cliente de mensajería que parece cubrir esto bien es Signal, pero hay un problema, que aunque prefiera a Signal sobre Whatsapp y Telegram es otro cliente que tampoco deja de ser centralizado.
Cifrado y verificación
Hay que reconocer que aplicaciones como Whatsapp, Signal, Telegram, entre otros cuando se trata de cifrado hacen la tarea "mas sencilla". Usualmente la gente instala Whatsapp y en teoría no se preocupa por nada mas, muchos ni siquiera saben que la aplicación automáticamente cifra los mensajes de extremo a extremo. Whatsapp suele mostrar en cada nuevo chat que el mensaje está siendo cifrado extremo a extremo, algunos leerán ese mensaje, y otros simplemente lo ignorarán pero quedémonos en que Whatsapp lo hace automáticamente. En XMPP algunos clientes populares como [Dino] para el escritorio y [Conversations] en el móvil también cifran automáticamente de extremo a extremo.
Pero hay algo igual o incluso mas importante que el cifrado, y se llama la verificación. Imagina que te escribe tu tía avisándote de que ha cambiado de teléfono, el mensaje llega cifrado e incluso te llega un mensaje diciendo que hubo un cambio en el dispositivo remoto o en la cuenta pero ¿Como sabes que la persona que te está escribiendo es efectivamente tu tía y no una persona que se está haciendo pasar por ella? En ambos casos, es decir si la persona al otro lado es tu tía o no, la información estaría viajando cifrada pero hay un fallo en la verificación porque no estás 100% seguro(a) de que te estas comunicando con la persona quien dice ser. La verificación es eso, comprobar que el la persona al otro lado del canal de comunicación es quien dice ser.
En clientes de mensajería como Whatsapp este proceso es "automático", al menos en teoría, pero en mi humilde opinión los procesos de verificación deberían hacerse manualmente, al menos en lo que respecta a mensajería instantánea. A nivel conceptual ambas aplicaciones hacen el proceso de verificación similar, sin embargo en mi opinión XMPP es mas preciso porque te hace saber la diferencia entre un mensaje que no viene cifrado, otro que viene cifrado pero no verificado y por ultimo un mensaje que viene cifrado y verificado.
A nivel conceptual conozco dos formas de verificar tus contactos:
- Personal: Si tienes la posibilidad de hacerlo, hazlo de esta manera. Es la manera mas confiable porque estás viendo a la persona En aplicaciones como Whatsapp se pueden ver y comparar los códigos de verificación, o también escanear el código QR en la versión móvil. En algunas aplicaciones XMPP el proceso es similar pero como dije anteriormente muchas de estas aplicaciones te informan que la conexión además de cifrada esta verificada.
- Usar otro medio alternativo: Este en mi opinión es menos seguro que el anterior pero siempre puedes enviar los códigos de verificación a otro canal que consideres "seguro", como por ejemplo el correo electrónico y luego comparar. En Whatsapp solo basta con mirar que los códigos coincidan, en XMPP dependiendo de la aplicación esto puede variar.
Dino
Conversations
La descentralización también tiene sus desventajas
Cuando solemos hablar de "descentralización" en Internet lo solemos asociar con algo positivo y yo considero que esto sigue siendo así, pero esto no quiere decir que aquí no tengamos problemas.
Cuando Whatsapp se cae, suele haber una caída masiva y lo primero que mucha gente suele hacer es irse a Telegram, pero hay otro problema Telegram también es susceptible a el mismo problema, aunque siendo sinceros nunca he visto esto en Telegram hay que decir que si por X o Y motivo los servidores en Telegram falla el problema sería exactamente el mismo. En XMPP como son servidores independientes no tendremos problemas de caídas masivas, a menos que el 99% de la población que use XMPP estén ubicadas en el mismo servidor, cosa que en la actualidad no pasa.
Otra ventaja de XMPP es que es relativamente sencillo montar servidores caseros pequeños, para tu familia por ejemplo. Yo personalmente creo que la única forma de convencer a mi familia de usar XMPP es aprovechar una caída de Whatsapp y decirles algo como "Aquí tienen un backup para que no se queden incomunicados".
Sin embargo hay que reconocer que el tema de cifrado extremo a extremo cuando se usan muchos dispositivos, y sobre todo si son diferentes entre si puede llegar a ser tedioso. Si solamente usas tu celular, esto muy probablemente no te afecte pero si usas XMPP en tu móvil y luego en tu escritorio aquí el proceso si se puede complicar un poco.
¿A qué me refiero con esto? En aplicaciones como Whatsapp y Telegram al ser centralizadas tienen una ventaja en particular:
- Abres el cliente en el móvil.
- Abres el cliente en el escritorio.
- Abres el cliente en el navegador web.
Y en cada uno de ellos puedes ver absolutamente todos los mensajes. En XMPP esto no pasa, no de manera automática. Básicamente porque en XMPP cuando se cifra y se verifica se crea una relación de confianza entre dispositivos, no entre cuentas. Por este motivo, el proceso es mas tedioso pero la idea con estas entradas es explicar un poco para hacerlo mas fácil de entender y mas manejable, no prometo que sea sencillo por la naturaleza descentralizada de XMPP pero si prometo hacer mi máximo esfuerzo para que sea lo mas masticable posible.
Cuando esto pasa en XMPP lo recomendable es crear la relación confianza lo mas rápido posible, para obtener algo lo mas similar posible a la "sincronización de mensajes" entre dispositivos, por ejemplo si abres el cliente en el celular y entras al escritorio 10 días después a tu misma cuenta XMPP en otro cliente, no vas a poder ver muchos mensajes cifrados que tenías en el móvil de hace 10 días. Pero si configuras el cliente de escritorio al mismo tiempo que el cliente móvil vas a poder ver los mensajes en ambos dispositivos.
Conclusiones
En mi opinión XMPP es una alternativa viable para clientes de mensajería mas populares como Whatsapp y Telegram, además 100% descentralizada pero que por esta naturaleza puede llegar a ser difícil comprender ciertas cosas, por este motivo esta entrada ha sido una guía básica para entender a grandes rasgos como funciona el cifrado extremo a extremo y así en entradas posteriores mostrar a mas detalle como lidiar con estas configuraciones en XMPP para no solamente tener un cliente de mensajería sino un cliente lo bastante seguro.