Cifrar datos de usuario en DB [cerrado]

4

Estoy desarrollando un servidor (Java + Spring) y quiero cifrar los datos confidenciales de los usuarios en la base de datos, utilizando una clave específica para cada uno.

Pensé en cifrar los datos del usuario usando su contraseña como base para la clave pero ...

  1. Solo estoy almacenando contraseñas con hash (bcrypt) en la base de datos
  2. El usuario solo envía la contraseña al servidor cuando crea su cuenta e inicia sesión. Para la autenticación de la solicitud, utiliza JWT (solo contiene la identificación del usuario, con un secreto seguro y un tiempo de caducidad bajo) generado después de cada inicio de sesión.

Pensé en almacenar la contraseña como texto sin formato en la base de datos, pero eso me lleva al mismo problema: si la db se ve comprometida, un atacante podría descifrar fácilmente el contenido del usuario.

¿Hay alguna manera de lograr esto?

    
pregunta alex 13.11.2017 - 15:32
fuente

2 respuestas

2

Una opción es generar la clave de los usuarios a partir de su contraseña al iniciar sesión (o almacenar claves generadas aleatoriamente cifradas con ella). Luego se almacena en la memoria mientras están conectados y borrados de la memoria al finalizar la sesión / caducidad de la sesión.

Todavía hay problemas aquí -

  • ¿Cómo se aplica la eliminación de la clave al finalizar la sesión? - una acción que ocurre aquí no es el flujo de trabajo habitual del servidor.
  • Debe tomar medidas para evitar que las claves se envíen al disco.

Otra opción es cifrar / descifrar en el lado del cliente usando algo como la API WebCrypto.

    
respondido por el Hector 13.11.2017 - 15:45
fuente
2

Si desea usar la contraseña del usuario para desbloquear su clave de cifrado, lo mejor es usar una clave derivada de la contraseña para descifrar una clave de cifrado de datos. De esta manera, la clave utilizada para el cifrado real de una gran cantidad de datos es puramente aleatoria, pero luego esa clave se cifra con la clave derivada de la contraseña.

Luego debe volver a solicitar una contraseña para descifrar los datos o almacenar la clave de datos descifrada en alguna forma de almacenamiento temporal (tal vez una sesión), de modo que solo esté disponible mientras el usuario haya iniciado sesión y luego volcarla cuando el usuario cierra la sesión.

Podría proporcionarle alguna protección adicional en reposo si tiene un TPM en el servidor que puede cifrarlo con una clave de servidor, de manera que un volcado de los datos de la sesión no revelará directamente la clave, pero eso va un nivel más allá lo que estabas describiendo inicialmente

También hay muchas otras formas en las que puede intentar mantener la clave segura mientras se usa, dependiendo del hardware que tenga disponible, pero en última instancia es un poco más amplio de lo que puede manejar una respuesta de formato Q / A.

    
respondido por el AJ Henderson 13.11.2017 - 16:25
fuente

Lea otras preguntas en las etiquetas