Estoy intentando obtener una forma segura de intercambiar claves entre la aplicación cliente y el servidor.
El objetivo es cifrar todos los mensajes XML con AES256. Estos XML se transferirán al servidor mediante https (publicación). Sí, sé que el AES256 probablemente sea excesivo, ya que ya usará HTTPS, pero la seguridad es muy importante en mi caso, ya que estoy transfiriendo los datos financieros.
La razón por la que uso AES256 es que todavía es muy fuerte y prácticamente irrompible (si se implementa correctamente, por lo que estoy aquí)
Tengo la misma idea general de esta pregunta: Es esto RSA / AES buena combinación? Pero quiero que la implementación sea segura.
mi idea actual:
-
Configure una CA (puedo instalar el certificado en el cliente de forma segura) medio ambiente)
-
El cliente genera par de claves RSA y envía una clave pública al servidor. (También podría estar en env seguro)
-
El cliente solicita el intercambio de claves (firma de solicitudes con RSA)
-
El servidor genera una nueva clave AES La clave de cifrado del servidor con la clave pública de
-
El servidor cliente envía la clave cifrada y firma el mensaje con RSA
-
El cliente comprueba la firma y descifra la clave
Después de esto quiero hacer un paso de verificación, pero no estoy completamente seguro de cuál es la mejor manera de hacerlo. Estaba pensando en dejar que el cliente cifrara la clave AES con la clave de pub del servidor y firmar el mensaje. luego el servidor puede descifrar de nuevo, pero luego estoy transfiriendo la clave nuevamente y no estoy seguro de si esto puede ser un riesgo de seguridad.
Tenga en cuenta que todos estos mensajes ya se transmiten a través de https (con certificado válido)
¿Es esta una forma segura? o hay una forma mejor / mas facil?
otra nota: el servidor no aceptará una nueva solicitud de clave si ese cliente ya tiene una (cada cliente tiene una ID única) Pero si es necesario, el servidor puede forzar al Cliente a generar una nueva clave. Las nuevas claves pueden incluso ser forzadas en un tiempo aleatorio.
Me acabo de dar cuenta de que olvidé explicar una cosa importante:
El intercambio de claves debe realizarse una vez, después de esto, la clave debe almacenarse localmente. Como la aplicación cliente aún necesita poder cifrar los mensajes mientras no haya conexión a Internet. en ese punto hay una cola de mensajes cifrados.
Por lo tanto, no es como si estuviera haciendo el intercambio cada vez, sino solo una vez (o una vez por mes) para intercambiar claves para que el cifrado AES pueda continuar.