HTTP + HTTPS + One Time Pad / cifrado de flujo

3

Estoy diseñando una aplicación web donde los usuarios intercambiarán mensajes cortos con el servidor con mucha frecuencia (por ejemplo, unos pocos caracteres por segundo). Quiero que toda la comunicación sea confidencial, pero el rendimiento (percibido) debe ser aceptable. Tuve la idea de poner HTTP y HTTPS a trabajar juntos usando el siguiente esquema:

El navegador solicitará dos claves (bastante grandes) del servidor a través de HTTPS, luego las almacenará en la memoria (en principio, estoy pensando en teclas de una sola vez, es decir, datos aleatorios). Luego, los contenidos de cada mensaje se enviarán en XOR con la primera clave (sin reutilización, por supuesto) y se enviarán a través de HTTP. El servidor enviará la respuesta de la misma manera, utilizando la otra clave. Cuando una o ambas claves estén a punto de usarse, se solicitará otra, y así sucesivamente.

La razón detrás de esto es que tanto la solicitud XOR como la solicitud HTTP son baratas para mensajes pequeños, por lo que el rendimiento percibido será bueno. Las llamadas HTTPS, más caras, no serán críticas en el tiempo y se beneficiarán de la mayor escala de las claves intercambiadas. Se podría usar otro cifrado de flujo en lugar de pads de una sola vez, y en el futuro (cuando se admita adecuadamente en todas partes), se podría usar WebSockets en lugar de solicitudes HTTP.

¿Se ha usado este tipo de cosas antes? ¿Esto aseguraría adecuadamente la comunicación, o es una idea estúpida, por alguna razón? No pude ver ninguna deficiencia, pero me gustaría escuchar la opinión de personas más experimentadas antes de dedicar demasiado tiempo a esto.

    
pregunta mgibsonbr 18.01.2012 - 23:07
fuente

2 respuestas

8

Está hablando de cifrado solamente; te estás olvidando de la integridad, un error a menudo fatal. El cifrado te protege solo contra los atacantes pasivos, que pueden espiar todo lo que todos dicen, pero no pueden alterar las comunicaciones de ninguna manera. Ese no es un modelo muy realista. Necesita integridad verificada (es decir, con clave), y para eso desea un Código de autenticación de mensajes . O uno de esos esquemas cifrado autenticado .

Ahora, un protocolo que comienza con un paso de inicialización potencialmente costoso, que se traduce en un secreto compartido, que luego se usa para cifrar los datos y protegerlos con integridad verificada ... no es fácil de crear sin cometer ningún error. Afortunadamente, uno de estos protocolos ya existe, con todos los bits duros realizados correctamente y las implementaciones ya disponibles. Se llama SSL.

Como dice @Rook, SSL es muy liviano una vez que se ha realizado el saludo inicial. Un cliente HTTPS típico (por ejemplo, un navegador web) abrirá primero una conexión SSL y luego la mantendrá abierta para enviar solicitudes. Una conexión SSL abierta implica una sobrecarga muy leve en comparación con los datos no protegidos sin procesar: en la práctica, alrededor de 30 bytes adicionales por registro (depende del conjunto de cifrado), cada registro puede contener hasta 16384 bytes de datos, por lo que estamos hablando de menos del 0.2% del aumento de tamaño, y obtendría eso con cualquier otro protocolo que garantice la confidencialidad y de todos modos. Por otro lado, su esquema hecho a mano duplica el consumo de la red (el envío de una sola vez no es exactamente gratuito).

Además, incluso si la conexión SSL se cierra de alguna manera (por ejemplo, debido a que el servidor no desea mantener ninguna conexión abierta durante más de 15 segundos de inactividad), se puede volver a abrir una nueva con un apretón de manos abreviado que reutiliza bits del handshake anterior; en particular, requiere menos mensajes (por lo tanto, latencia reducida), es solo de criptografía simétrica (tan poco en la CPU), y no implica ningún certificado, por lo que es simple y sensato.

    
respondido por el Tom Leek 18.01.2012 - 23:53
fuente
4

La respuesta corta es que esto no es necesario y, en todo caso, será menos eficiente y menos seguro.

La parte más cara de HTTPS es el saludo inicial. El cliente tiene que validar el certificado, realizar una búsqueda de OCSP y algunos otros gastos generales. Al final de este apretón de manos, se crea un "secreto maestro" que combina números aleatorios generados tanto por el cliente como por el servidor. Después de crear este secreto maestro, es un sistema muy ligero. Es solo cifrar datos con una clave simétrica, que es básicamente lo que estás sugiriendo

Simplemente use HTTPS para todo, es un protocolo muy ligero. El cliente reutilizará esta clave maestra sin necesidad de renegociar. Todo será seguro y eficiente. No hay necesidad de reinventar la rueda.

    
respondido por el rook 18.01.2012 - 23:29
fuente

Lea otras preguntas en las etiquetas