Al trabajar en un software de intranet, necesitaba implementar la seguridad entre el cliente y el servidor. Me gustaría saber si esta es una forma segura de hacerlo o si hay agujeros significativos.
El cliente y el servidor crean un secreto compartido mediante el intercambio de claves ECDH (secp521r1). Se negocia un nuevo secreto compartido para cada solicitud.
La clave de cifrado se genera mediante Función de derivación de clave basada en contraseña 2 (PBKDF2). Uso el secreto compartido como la contraseña, una clave previamente compartida como el salt (para permitir que solo los clientes autorizados se conecten), 100,000 iteraciones, y la función hash es SHA512.
Después de eso, los datos de solicitud se cifran con aes-128-gcm, utilizando la clave de cifrado y un IV de 12 ceros. La respuesta se encripta utilizando la misma clave. El servidor luego descarta la clave para que no pueda usarse dos veces.
¿Es esta una buena implementación? ¿Hay otras formas mejores de hacer esto? ¿Hay algo que este olvidando?