Pregunta

Actualmente estoy desarrollando un sistema para transmitir datos entre el cliente y el servidor, y me preguntaba cuál era la intensidad del cifrado que pensaba utilizar.

Mi idea era tener un par de claves pública / privada RSA y entregar la clave pública de cada cliente (dejando la clave privada únicamente en el servidor). Cada cliente podría entonces generar su propia clave AES y RSA cifrarlo. Ellos entonces AES cifrar sus datos y enviar los datos cifrados y cifrado AES clave al servidor. El servidor entonces descifrar la clave AES con la clave privada, y luego descifrar los datos usando la clave AES.

¿Hay fallos de seguridad me faltan y / o hay una mejor manera de hacer esto?

¿Fue útil?

Solución

Esto es casi exactamente cómo SSL / TLS de obras (echa un vistazo a la sección de apretón de manos). La única cosa para hacerlo más fuerte es para generar la clave AES para cada conexión, en lugar de utilizar la misma clave cada vez. Usted también puede firmar digitalmente los mensajes que van de ida y vuelta para evitar man-in-the-middle ataques de suplantación y otros.

En términos generales, la creación de un buen sistema de cifrado es muy difícil. Cuando sea posible, siempre debe favorecer a una (de confianza) aplicación existente para ayudar. En este caso, es posible considerar el envío de mensajes a través de HTTPS, en lugar de crear su propio sistema.

Otros consejos

Nos debe dar más información sobre el lenguaje y la plataforma que esté utilizando, de manera que podemos darle recomendaciones específicas acerca de las bibliotecas que ya existen y al que se va a manejar los detalles para usted. El uso de primitivas criptográficas no es directamente trivial y difícil de conseguir exactamente a la derecha, y con la criptografía, que tiene que ser "no es exactamente correcta" sólo una vez para la seguridad de que se rompa.


Para responder a su pregunta, por lo general es una mejor idea de crear una sesión secreta (la clave AES) a través de un intercambio Diffie-Hellman , y cada lado utilizan su clave privada RSA para firmar sus datos de intercambio de claves.

De lo contrario, si el secreto de sesión no se establece a través de un intercambio DH, un adversario que tenga acceso a la clave privada RSA (que tiene que ser almacenado en algún lugar) podría descifrar todo el tráfico que nunca fue enviada entre el cliente y el servidor.

Si el secreto es establecido a través de un intercambio DH, entonces sólo la parte de autenticación del protocolo estaría expuesto. Aunque un adversario en posesión de la clave privada RSA entonces no será capaz de leer cualquier comunicación anterior, aún podía o bien entrar en un diálogo autenticado con el cliente / servidor o lanzar un ataque man-in-the-middle (que puede ser o no puede hacer fácilmente, dependiendo de la red).

Una vulnerabilidad sería si un atacante sustituido su clave pública para la clave pública "real". Entonces serían capaces de interceptar el tráfico como un "man-in-the-middle".

Protocolos como S / MIME, PGP, y TLS utilizan el cifrado RSA para el transporte de teclas tal y como lo propone. Sin embargo, las claves públicas que utilizan son de certificados firmados por las autoridades de confianza.

La integridad de estas autoridades de confianza debe ser cuidadosamente protegida. Por ejemplo, podrían ser quemados en un token de hardware a prueba de manipulaciones, o un MAC pueden ser calculados sobre ellos utilizando una contraseña.

No estoy seguro de que su enfoque protegerá nada! Vas a mantener la clave privada en el servidor y se distribuirá la clave pública. Si consigo una bodega de su clave pública, voy a ser capaz de interactuar con el servidor a voluntad. Creo que debería revertir la propiedad clave; cada cliente llevará a cabo está-propia clave privada y el servidor tendrá una lista de claves públicas (ALA SSH). El servidor tendrá que agregar claves públicas 'autorizadas' y sólo a los titulares de las claves privadas serán capaces de conectarse.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top