Cómo implementar mi propio mecanismo de seguridad: evitar SSL

7

Estoy considerando la implementación de mi propio mecanismo de seguridad en lugar de usar SSL debido a que SSL es 'desesperadamente roto ' y también porque es un ejercicio interesante :)
Esto es para una aplicación de internet cliente-servidor.

Advertencia: no soy un experto en seguridad, solo he estado leyendo sobre seguridad.
También construiré la aplicación cliente, por lo tanto tendré control sobre la implementación de ambos lados.

Problema SSL

El principal problema que veo con SSL se debe al intercambio de claves públicas en la etapa de apretón de manos, y un hombre en el medio que lo intercepta. SSL intenta evitar este problema mediante la firma de mensajes y certificados, etc. para validar la clave pública del servidor al cliente. Pero un atacante con un certificado falsificado todavía puede sortear esto.

Solución

Debido a este problema de intercambio seguro de claves públicas, creo que esto se puede evitar simplemente no teniendo que intercambiar la clave pública del servidor, al tener una clave pública del servidor "conocida" incorporada en cada aplicación cliente. Diga una clave RSA de 3072 bits.

Implementación

  1. La implementación para cada sesión de comunicación sería por lo tanto el cliente genera un par de claves RSA públicas / privadas
  2. el cliente cifra su nueva clave pública con la clave pública del servidor y la envía al servidor
  3. el servidor descifra el mensaje para descubrir la clave pública del cliente y luego lo usa para cifrar cualquier respuesta al cliente
  4. el cliente continúa enviando tráfico al servidor cifrado con la clave pública del servidor
  5. cada mensaje enviado desde el cliente también contiene en el encabezado:
    1. el nombre de usuario del cliente cifrado con la clave pública del servidor
    2. un hash del mensaje del cliente sin cifrar: se utiliza como entrada para generar este hash, otro hash de [nombre de usuario del cliente + dominio + contraseña del cliente]

Observaciones

  • El servidor puede probar la identidad del cliente descifrando primero el mensaje usando su clave privada, y luego calculando el hash del mensaje no cifrado usando el hash de [nombre de usuario del cliente + contraseña real] que ha almacenado en su base de datos.
  • El hombre en el medio no puede monitorear el tráfico ya que está cifrado en ambos sentidos
  • El hombre en el medio no puede hacerse pasar por cliente porque no puede generar un hash de mensaje válido
  • El hombre en el medio no puede hacerse pasar por un servidor porque, como no puede descifrar el mensaje inicial, no puede descubrir la clave pública del cliente para cifrar las respuestas al cliente
  • La propia contraseña del cliente está protegida contra el escrutinio de fuerza bruta, ya que el hash que usó la contraseña del cliente como entrada, está contra el mensaje no cifrado, por lo que el atacante primero tendría que descifrar el mensaje antes de comenzar un ataque de fuerza bruta contra este hash

Viendo que no soy un experto en seguridad, espero que alguien que sepa más sobre seguridad pueda detectar cualquier agujero en este enfoque, o confirmar si es bueno. Y también si una clave RSA de 3072 bits puede soportar la prueba del tiempo sin romperse.

¡Gracias!

    
pregunta DaManJ 02.12.2011 - 15:25
fuente

4 respuestas

5

Decidí usar SSL porque al final terminó siendo el enfoque más simple, la otra idea simplemente no estaba funcionando bien en el lado WCF.

He escrito esto en código-proyecto para ayudar a otros a tener un problema similar.

enlace

Todavía tendría que encontrar la forma de confiar solo en mi propia clave pública y no en las claves de CA (mirando el as3cryptolib, podría ser posible con la propiedad CAStore en el TLSConfig) enlace

    
respondido por el DaManJ 07.12.2011 - 00:24
fuente
23

Confunde SSL / TLS con su patrón de uso más común, que es TLS junto con certificados X.509 y una infraestructura de clave pública (PKI, RFC 5280 ).

Si bien es realmente importante asegurar una conexión TLS mediante la autenticación de su sitio del servidor (para evitar ataques MITM activos), la especificación TLS no obliga a hacerlo usando certificados X.509, y mucho menos usando una PKI.

Como dijo @jathanism, puede optar por no confiar en una PKI jerárquica, mediante el uso de un certificado X.509 autofirmado. Tendrá que establecer la confianza en el certificado del servidor por otros medios.

Además, TLS también se puede utilizar con Certificados de OpenPGP , Kerberos o Claves precompartidas .

TLS en sí mismo ha tenido muy pocos errores conocidos, por ejemplo, hubo un error de renegociación (CVE-2009-3555), que se ha corregido (más recientemente, también hubo ciertos problemas con ciertos cifrados de bloque, que pueden solucionarse seleccionando mejores suites de cifrado o actualizando a versiones más recientes de TLS).

Los temas de los que habla (y que a menudo se discuten en la prensa) tienden a estar relacionados con las PKI, es decir, cómo establecer confianza en la parte remota. La forma en que debe hacerse esto no está dictada por la especificación TLS en sí.

Si desea intentar encontrar una mejor manera, investigue por todos los medios, pero sugeriría centrarse en esta parte y dejar solo SSL / TLS y el lado de la criptografía. Probablemente encontrará que los problemas más grandes con respecto a las PKI y sus alternativas son administrativos, no tanto técnicos.

El otro aspecto de la autenticación de la parte remota es comprobar que está hablando con la parte deseada (es decir, verificación del nombre de host ).

    
respondido por el Bruno 02.12.2011 - 20:14
fuente
9

Si tiene el control de ambos lados, use certificados SSL autofirmados. Hecho. No confía en una Autoridad de certificación raíz, por lo que su criptografía se vuelve casi imposible de descifrar sin un conocimiento interno de la arquitectura.

    
respondido por el jathanism 02.12.2011 - 15:30
fuente
1

No es SSL el mecanismo que está "irremediablemente roto", sino SSL v3.0 (y SSL v2.0) las versiones de especificación.

Después de SSL v3.0, la especificación fue renombrada a TLS. TLS 1.0 todavía se considera seguro. Te recomendaría que uses TLS 1.2.

Y, sí, como han dicho otros, ni siquiera pienses en rodar los tuyos. Intentar rodar los suyos por alguien que no sabía suficiente criptografía es la razón por la cual el cifrado WiFi temprano se puede descifrar en cuestión de segundos o minutos. Comenzaron con un algoritmo débil, y luego a través de los problemas de implementación lo debilitaron aún más.

    
respondido por el Kevin Keane 05.04.2015 - 19:20
fuente

Lea otras preguntas en las etiquetas