Si WhatsApp cifra las comunicaciones, ¿dónde está la clave?

Gonzalo Álvarez Marañón    24 febrero, 2020
Si WhatsApp cifra las comunicaciones, ¿dónde está la clave? A mí que me registren

Desde 2016 las comunicaciones de WhatsApp se cifran extremo a extremo. Como bien sabes, para cifrar se necesita una clave de cifrado: ¿te la han pedido alguna vez estas apps de mensajería? La cuestión es: si todas tus conversaciones por apps de mensajería viajan cifradas, ¿con qué algoritmo se cifran?, ¿de dónde salió la clave de cifrado?, ¿dónde se guarda?, ¿qué tan seguro es todo este tinglado?

La magia silenciosa del cifrado extremo a extremo

Cuando te comunicas con otra persona por WhatsApp, vuestros mensajes pueden dar muchos saltos a través de Internet hasta llegar desde tu smartphone al del otro. Por el camino, quién sabe, algún desalmado podría interceptar los mensajes, manipularlos, inyectar mensajes falsos y hacer todo tipo de canalladas. El principio del extremo a extremo (end-to-end o E2E) parte de la premisa de que cualquier nodo intermedio de esa ruta puede ser malicioso e intentar liárosla. Como no puedes fiarte, la solución consiste en asegurar la comunicación en cada uno de los extremos, de manera que solo tú y tu amigo podáis leer los mensajes y nadie más, ni siquiera WhatsApp.

Por lo tanto, llegamos a una primera conclusión: las claves utilizadas para cifrar los mensajes sólo deben ser conocidas por los dos extremos de la comunicación.

Pero ahora surge otra pregunta: ¿cómo hacéis para poneros de acuerdo sobre qué clave usar? En otras palabras: ¿quién genera la clave?, ¿cómo se la hace llegar al otro? Vayamos respondiéndolas por partes.

Criptografía híbrida al rescate

Te sonará que existen dos grandes ramas de la criptografía moderna: la criptografía de clave pública (o asimétrica), con algoritmos tan conocidos como RSA o ECC; y la de clave secreta (o simétrica), con su algoritmo estrella: AES. Ambas ramas poseen dos distinciones fundamentales:

  • Los algoritmos de clave pública utilizan una pareja de claves: una es pública, conocida por todo el mundo, y sirve para cifrar; la otra es privada, conocida solo por su legítimo propietario, y sirve para descifrar. Además, estos algoritmos también sirven para firmar un mensaje con la clave privada, operación que sólo su propietario puede realizar; y para verificar dicha firma por cualquiera que conozca la correspondiente clave pública. Estas claves son muy largas. Por el contrario, los algoritmos de clave secreta utilizan la misma clave para cifrar y descifrar, que además es muy corta.
  • Los algoritmos de clave pública son muy lentos y, por consiguiente, adecuados sólo para cifrar pequeñas cantidades de texto. En cambio, los algoritmos de clave secreta son muy rápidos y, por tanto, ideales para cifrar grandes volúmenes de datos.

Entonces, ¿qué es mejor: la criptografía de clave pública o la de clave secreta? Pues ni una ni otra, sino las dos juntas, lo que se conoce como criptografía híbrida:

  • Dado que los algoritmos de criptografía de clave secreta son rápidos, con ellos se cifra el contenido, sin importar lo grande que sea: mensajes, adjuntos, conversaciones de voz y vídeo, etc.
  • Como los algoritmos de criptografía de clave pública son lentos, con ellos se cifra la clave secreta utilizada por los algoritmos de cifrado anteriores, que recordarás que era cortita, y así puede compartirse entre los interlocutores sin peligro de ser interceptada.

Ya tenemos los mimbres para armar el cifrado de las comunicaciones extremo a extremo de WhatsApp.

Los detalles criptográficos del cifrado extremo a extremo de WhatsApp

Cuando instalas WhatsApp en tu dispositivo, se genera una pareja de claves pública y privada, llamada Identity Key Pair, para usar con un algoritmo de Criptografía de Curvas Elípticas. A continuación, se genera una segunda pareja de claves, Signed Pre Key, firmada con la clave privada de la pareja anterior. Por último, se genera un lote de parejas de claves, One-Time Pre Keys, para su uso posterior, y se irán renovando a medida que se agoten.

Cuando te registras con el servidor de WhatsApp, además de tu información de contacto, le envías la parte pública de tu Identity Key, la parte pública de tu Signed Pre Key y las partes públicas de tu lote inicial de One-Time Pre Keys.

Importante: la parte privada de tus claves nunca abandona tu dispositivo y ni WhatsApp ni nadie tiene acceso a ellas (en principio).

Cuando le envías un mensaje a otro usuario de WhatsApp, se produce el siguiente proceso:

  1. Tu terminal solicita y el servidor de WhatsApp te envía la parte pública de Identity Key, Signed Pre Key y de la primera One-Time Pre Keys del otro usuario.
  2. Tu terminal acuerda con el del otro usuario un secreto maestro derivado a partir de todas estas claves públicas intercambiadas entre ambos. Para ello se utiliza el protocolo de acuerdo de claves ECDH. Esta clave maestra se utiliza para crear mediante un algoritmo de HKDF una Root Key y las Chain Keys para cifrar posteriormente los mensajes intercambiados con un algoritmo de clave secreta.
  3. Cuando al otro usuario le llegue tu primer mensaje, se repetirá el proceso: recibirá la información pública de tus claves, con esa información y la de sus propias claves regenerará el secreto maestro y, a partir del mismo, la Root Key y las Chain Keys. Finalmente, borrará la One-Time Pre Key utilizada en el proceso, ya que, como su nombre indica, estas One-Time Pre Keys se usan una sola vez. A partir de este momento, ya está todo listo para empezar a cifrar la información intercambiada.

Los mensajes y sus adjuntos se cifran mediante el algoritmo AES en modo CBC, con claves de 256 bits de longitud y HMAC-SHA256 para autenticación. Vamos, criptografía robusta donde la haya.

Estas claves son efímeras: se derivan de las Chain Keys, las cuales se actualizan tras cada nuevo mensaje a partir de su valor previo y de la Root Key. Para cifrar cada mensaje intercambiado se crea su correspondiente clave efímera y, una vez usada, ni se reutiliza ni puede reconstruirse. Proporcionan así lo que se conoce como secreto hacia adelante: el compromiso de una clave no compromete la seguridad de las claves usadas con anterioridad y no permite por tanto descifrar los mensajes anteriores.

Cómo protegerse de ataques de hombre en el medio

Aún puede quedar una duda en el aire: ¿y si el servidor de WhatsApp intenta engañarte haciéndote creer que sus propias claves públicas son las de tu interlocutor?

Imagina el siguiente escenario: tu terminal solicita la clave pública de otro usuario para iniciar todo el proceso anterior, pero el servidor de WhatsApp no te envía la clave de tu amigo, sino otra distinta, haciéndose pasar por tu amigo. Con tu amigo hace lo mismo: en lugar de enviarle tu clave pública, el servidor de WhatsApp le envía otra falsa, haciéndose pasar por ti. A partir de este momento, os hace creer a cada uno que él es el otro. Por consiguiente, podrá descifrar todas vuestras comunicaciones y volverlas a cifrar para que no sospechéis nada. Es lo que se conoce como un ataque de hombre en el medio. ¿Cómo protegerse ante este ataque?

WhatsApp te ofrece la opción de verificar las claves de los demás usuarios con los que te comunicas. Si tienes junto a ti a la otra persona, puedes escanear un código QR. Si no está físicamente a tu lado, podéis comparar un número de 60 dígitos.

Para verificar si vuestro chat está cifrado de extremo a extremo, abre el chat y toca el nombre del contacto para ir a la pantalla de información. Tocando “Cifrado” verás el código QR o los 60 dígitos.

El código QR contiene:

  1. Una versión.
  2. El identificador de usuario para ambas partes.
  3. La parte pública de Identity Key de ambas partes.

Cuando os escaneáis mutuamente el código QR, las claves se comparan para asegurar que lo que está en el código QR coincide con la clave de identidad tal y como se ha recuperado del servidor. Si escaneas el código QR y coincide, aparecerá un tic de color verde.

En cuanto al número de 60 dígitos, se calcula concatenando los dos hashes SHA512 de 30 dígitos para la Identity Key de cada usuario. Otra vez, criptografía de la buena.

Sí, te puedes fiar del cifrado de WhatsApp, es sólido

Tal y como concluye WhatsApp en su documento técnico sobre el cifrado de sus comunicaciones:

  • Los mensajes entre los usuarios de WhatsApp están protegidos con un protocolo de cifrado de extremo a extremo, de forma que ni terceros ni WhatsApp puedan leerlos, ya que sólo pueden ser descifrados por el destinatario. Todos los tipos de mensajes de WhatsApp (incluidos los chats, los chats de grupo, las imágenes, los vídeos, los mensajes de voz y los archivos) y las llamadas de WhatsApp están protegidos mediante un cifrado de extremo a extremo.
  • Los servidores de WhatsApp no tienen acceso a las claves privadas de los usuarios de WhatsApp, y los usuarios de WhatsApp tienen la opción de verificar las claves públicas para garantizar la integridad de su comunicación.
  • La biblioteca del Protocolo Signal que utiliza WhatsApp para todo este proceso es de código abierto, libremente disponible en https://github.com/whispersystems/libsignal-protocol-java/.

Así pues, la criptografía es sólida. ¿Significa eso que tus comunicaciones están a salvo? No necesariamente. Existen otras vías de ataque más sencillas. Pero esa es otra historia y será contada en otro post.

Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *