Estoy tratando de entender cómo funciona Perfect Forward Secrecy (PFS) para las aplicaciones que no son SSL.
Bueno, reiteremos brevemente de qué se trata PFS : desea evitar a cualquiera que obtenga su clave maestra para poder descifrar mensajes él ha capturado de antemano .
Por ejemplo, asumamos el caso de SSL / TLS donde la clave privada del certificado del servidor se ve comprometida. Sin PFS, sería posible que un atacante descifre todos los mensajes que fueron cifrados con esta clave. Más específicamente, la clave privada se usa generalmente para cifrar las claves de sesión, que a cambio se usan para el cifrado de los datos reales. El problema sigue siendo el mismo, solo agrega una capa de abstracción.
¿Cómo se implementa esto? ¿Cómo crearía una aplicación (digamos una aplicación de chat) y mantendré cada mensaje (o conversación) en secreto?
Entonces, lo que quieres lograr es intercambiar claves de manera que el compromiso de un solo mensaje no rompa todo tu sistema . En lugar de usar una clave estática, es decir, su clave privada para el intercambio de claves de sesión, debe crear un esquema que se construya alrededor de claves efímeras . Esto es exactamente lo que el intercambio de claves Diffie-Hellman (DHKE) es sobre. El problema con el DHKE clásico es que los socios de comunicación no están autenticados, por lo que Man-in-the-middle los ataques son posibles.
Por lo tanto, debe combinar estos dos esquemas : use RSA para autenticación , y use DHKE para crear claves de sesión efímeras . En una configuración de este tipo, ni el compromiso de una clave de sesión única ni el compromiso de la clave maestra en sí permitirían que un atacante descifre mensajes de otras sesiones anteriores.
Esto funciona muy bien y es básicamente la forma en que se logra PFS en SSL / TLS. Otro ejemplo bastante popular para un esquema de este tipo es Mensajería off-the-record (OTR) , aunque las claves deben verificarse manualmente. , en lugar de a través de una Infraestructura de clave pública basada en RSA.
Más específicamente, estoy interesado en cómo Moxie Marlinspike logra esto en TextSecure y otras aplicaciones.
TextSecure se basa esencialmente en OTR . Sin embargo, mejoraron OTR de una manera que lo hace adecuado para aplicaciones móviles. El mayor problema en un entorno móvil es que no puede esperar que ambas partes estén en línea al mismo tiempo. Las conexiones móviles se interrumpen todo el tiempo, por lo que el DHKE clásico se convertiría en un problema, ya que podría tomar mucho tiempo hasta que ambas partes acordaran una clave de sesión, que idealmente se usaría solo para un solo mensaje. Esencialmente, lo que quieres es que el intercambio de claves se suceda de forma asíncrona . Es un poco más complicado que eso, porque TextSecure también resuelve un par de otros problemas, como el descifrado fuera de orden y la prevención de la filtración de metadatos a través de cleartexts.
He escuchado que utilizan un protocolo de "racheting" que otorga a cada sesión su propia clave específica que evita el compromiso de la clave privada de uno de los usuarios.
A lo que te refieres es Axolotl Ratchet y encontrarás una descripción detallada de sus objetivos y funcionamiento interno aquí .
(por ejemplo, un usuario cifra un mensaje a bob usando la clave pública de bob. ¿Cómo agrego PFS a la ecuación?)
En resumen: no utilice la clave pública de bob
para cifrar el mensaje. Use su clave pública para la autenticación, elabore claves efímeras para el cifrado, por ejemplo. utilizando DHKE.