Su sistema es enormemente inseguro, pero no estoy tratando de disuadirlo ni a usted ni a nadie de jugar con cosas como esta. Deberías continuar. Pero es vital que consideres que todo lo que creas sea un sistema de "juguete" que nunca se debe considerar ni publicitar como "seguro".
Vamos a desglosar la pregunta de seguridad en dos partes.
- ¿Qué tan seguro es el intercambio de claves?
- ¿Cuán seguro es el cifrado que utiliza una vez que tiene una clave compartida?
Déjame responder (2) primero, ya que será el más simple. Será terriblemente inseguro a menos que sea más inteligente que todas las personas que han trabajado y estudiado TLS a lo largo de los años. TLS antes de la versión 1.2 (que pocos sitios usan) es vulnerable a los Ataques de texto cifrado (CCA) elegidos en principio y al BEAST attack en la práctica, dependiendo de la elección del traje de cifrado. Y SSL 2.0 está más roto.
El punto es que las personas muy inteligentes, trabajando con estos protocolos durante años, cometieron errores. Hay muchas razones para creer que estás trabajando en este tipo de cosas por tu cuenta y cometerás grandes errores. Los algoritmos básicos de encriptación están bien. Ellos no están rotos. Pero los protocolos son
Así que si no ha estudiado y comprendido completamente todos los detalles de SSL, por qué están allí y cómo han salido mal en algunos casos, entonces es casi seguro que cualquier protocolo que diseñe será terrible.
Ahora a la pregunta (2). Hay dos problemas con esto. (a) Diffie-Hellman no está diseñado para proporcionar el tipo de seguridad que probablemente necesite; y (b) no creo que haya implementado DH correctamente.
2.a:
Diffie-Hellman de intercambio de teclas, cuando se hace bien, es seguro para el intercambio de claves, pero no hace nada para la autenticación. Esta es la razón por la cual la pregunta "¿es seguro?" Es a menudo la pregunta equivocada. Es seguro para algunos propósitos, pero masivamente inseguro para otros ya que no está diseñado para esos otros fines.
Como Josh3737 señaló que no hay forma de que el cliente y el servidor sepan que están hablando con la persona adecuada. Si Sam es el servidor y Charlie es el Cliente, no hay nada que impida que Mallory configure su propio servidor que se hace pasar por Sam. Entonces Cathy puede pasar por el intercambio de claves con Mallory, pensando que ella está hablando con Sam. Mallory puede pretender ser Charlie cuando habla con Sam.
Una vez configurado de esta manera, Mallory puede actuar como un hombre en el medio entre Sam y Charlie. Cuando Charlie envía los datos destinados a Sam, Mallory los descifrará usando la clave compartida entre C y M, lo leerá (y posiblemente lo cambiará), y luego volverá a encriptar la clave compartida entre M y S y lo enviará a S
Para resolver el problema de autenticación, necesita algún tipo de infraestructura de clave pública (PKI) y estos son realmente un problema. El sistema de Autoridades de certificación y tal que tenemos con SSL/TLS está plagado de problemas, pero sigue siendo el mejor sistema que existe.
2.b:
Un módulo público de 512 bits, junto con las claves privadas de 512 bits no son lo suficientemente fuertes. Las claves DH deben ser más grandes. No iría con nada menos que 2048 bits. Puede salir con 1024 bits, no le preocupa que alguien pueda descifrar los secretos de hoy dentro de cinco años.
No proporcionó información suficiente sobre cómo se seleccionaron sus números primos. No todos los primos funcionarán. Debe usar una "prima segura" para su módulo, de lo contrario, hay atajos disponibles para que un atacante calcule el logaritmo discreto.
Hrmm. Suponiendo que pudiera obtener el javascript ejecutándose en la máquina cliente con la confianza de que no se había modificado (posiblemente una tarea imposible), ¿sería menos inseguro? No creo que las modificaciones en los datos (excluyendo la entrega inicial del applet) lo comprometerían. – arby
En términos prácticos, la única forma de obtener JS para el cliente de manera confiable es a través de SSL. Y como su conexión ya está asegurada, ¿de qué sirve hacer su propia criptografía en ese punto? – josh3736
Ataques de renegociación: http://www.openssl.org/news/secadv_20091111.txt, http://lwn.net/Articles/362234/ Ataques de descifrado de cifrado: http://www.openssl.org/news/ secadv_20101202.txt, http://wroot.org/posts/preventing-your-servers-from-downgrade-attacks/ –