Almacenar datos de usuario encriptados en la base de datos

8

Tengo una aplicación web que tiene el siguiente caso de uso:

  • El usuario crea una cuenta con nombre de usuario y contraseña: la contraseña con hash se almacena en la base de datos.
  • El usuario inicia sesión (persiste durante las sesiones): el token de inicio de sesión se almacena en una cookie.
  • El usuario ingresa y envía datos de texto: los datos se almacenan en la base de datos, pero son confidenciales y no deberían exponerse, incluso si la base de datos está comprometida.
  • Solo el usuario (registrado), y nadie más, puede leer los datos enviados.
  • Por conveniencia, el usuario no debería tener que ingresar ninguna frase de contraseña para cifrar / descifrar los datos.

¿Es esto factible? ¿Cómo deben cifrarse los datos?

    
pregunta Code 15.04.2017 - 01:56
fuente

2 respuestas

7

Puede usar una función de derivación de clave para convertir la contraseña del usuario en una clave de cifrado. Luego, usaría un generador de números pseudoaleatorios criptográficamente seguro para generar una clave separada que cifraría los datos del usuario. Luego usaría la clave derivada para cifrar la clave generada. El texto cifrado resultante de la clave de cifrado de datos podría almacenarse de forma segura en la tabla de usuario de su base de datos (llame al campo "clave cifrada" si lo desea). De esta manera, la contraseña del usuario se convertirá en el medio para descifrar la clave cifrada del usuario. La clave que en realidad encripta los datos solo se desencripta el tiempo suficiente para desencriptar los datos encriptados. Tendrá que almacenar esa clave en la sesión para evitar la necesidad de pedirle al usuario su contraseña en cada descifrado.

Como alternativa, puede almacenar la clave de cifrado de clave en un Servicio de administración de claves como el que ofrece Amazon AWS. De esta manera, recuperaría la clave de Amazon a través de TLS utilizando solo una referencia a la clave. Por supuesto, en este caso, aún necesitará almacenar las credenciales de autenticación para el KMS en algún lugar de su arquitectura, posiblemente en un archivo de configuración altamente seguro recuperado de forma remota.

  1. Generador de números aleatorios ⟶ Ayuda a crear la clave # 1.
    Esta clave encripta sus datos. Se mantiene constante en el tiempo. Debe generar esta clave cuando el usuario se registra por primera vez. Utilice un CSPRNG (generador de números pseudoaleatorios seguro criptográficamente) para garantizar la aleatoriedad y la imprevisibilidad suficientes.

  2. Contraseña ⟶ Convertida en clave # 2 con PBKDF2.
    Esta clave, Clave # 2, se usa para cifrar la Clave # 1. Usted querrá persistir la clave # 2 en la sesión del usuario. Almacene la forma cifrada de la Clave n. ° 1 en la tabla de usuarios, en un campo llamado (tal vez) "clave cifrada".

  3. Cambiar contraseñas
    Cuando el usuario cambia su contraseña, solo tiene que ejecutar el paso # 2 de nuevo, en lugar de cifrar todos sus datos, una vez más. Simplemente convierta la nueva contraseña en una clave (Clave n. ° 2), vuelva a cifrar la Llave n. ° 1 y sobrescriba el valor anterior de la forma cifrada de la Llave n. ° 1.

  4. Cifrado / descifrado de datos
    Cuando el usuario haya iniciado sesión, ejecute el paso # 2. Una vez que haya convertido la contraseña en una clave, simplemente descifre la Clave # 1. Ahora que ha descifrado la Clave n. ° 1, puede usar la Llave n. ° 1 para cifrar y descifrar sus datos.

respondido por el vrtjason 15.04.2017 - 04:24
fuente
5

No estoy seguro de si esto puede ser efectivo como un comentario, en lugar de una respuesta: feliz de cambiar para mejor.

El único propósito es brindar una representación visual de la respuesta aceptada de @ vrtjason's , ya que incluye un número de escenarios e implica el uso de un par de claves (cifrado). Aquí tienes:

Para completar, las claves involucradas en tales protocolos juegan roles que se conocen en la literatura como:

  • Clave de usuario: DEK, Clave de cifrado de datos
  • Clave de contraseña: KEK, Clave de cifrado de clave

HTH

    
respondido por el superjos 21.03.2018 - 19:25
fuente

Lea otras preguntas en las etiquetas