¿Cómo codificar datos confidenciales en la base de datos de una aplicación web?

3

La base de datos de mi aplicación web almacena datos confidenciales. Un atacante no debería tener acceso a estos datos si obtiene acceso a la base de datos. Por eso quiero cifrar estos datos confidenciales en la base de datos.

Primero quería cifrar los datos de los usuarios con el nombre de usuario o la contraseña como clave. El problema con este enfoque es que el usuario puede cambiar su nombre de usuario y contraseña. En el caso de que el usuario cambie su nombre de usuario, la aplicación ya no podrá descifrar los datos cifrados con su antiguo nombre de usuario. Además, el atacante tiene acceso al nombre de usuario del usuario. Por lo tanto, esta no sería una solución muy segura.

La única otra idea que tengo es cifrar todos los datos del usuario con una clave global. Un inconveniente de esto es que todo el sistema se basa en una clave. En este escenario, no puedo cambiar la clave debido a la incompatibilidad de la nueva clave y los datos antiguos.

¿Tiene alguna idea mejor sobre este problema?

    
pregunta Aaronmacaron 28.07.2017 - 22:41
fuente

3 respuestas

4

El enfoque generalmente aceptado es similar al que AndrolGenhald sugirió en una respuesta anterior pero con algunas mejoras.

Puede cifrar los datos de cada usuario individualmente, utilizando una clave derivada de su contraseña. Sin embargo, no quiere usar la contraseña directamente como clave. Es un proceso de varios pasos, como sigue.

1) Genera una clave aleatoria, utilizando un CSPRNGm, y utiliza esta clave aleatoria para cifrar los datos del usuario. Puede crear una nueva clave aleatoria diferente para cada usuario. Esto se denomina DEK, o clave de cifrado de datos.

2) Toma la contraseña del usuario y la ejecuta a través de un PBKDF (como PBKDF2, bcrypt o scrypt) utilizando un factor de trabajo o un número de iteraciones razonablemente alto y un salt aleatorio para crear una segunda clave, la tecla KEK o -Clave de encriptación. Luego, encripta el DEK utilizando la tecla KEK y almacena el DEK encriptado y el salt en la base de datos.

Luego, cuando el usuario inicia sesión, utiliza su contraseña y el salt de la base de datos para regenerar el KEK, que puede usar para descifrar el DEK, que puede usar para descifrar los datos.

Ahora, cuando el usuario cambia su contraseña, ya no tiene que descifrar y volver a cifrar todos sus datos, sino simplemente usar la nueva contraseña (y un nuevo salt) para generar una nueva KEK, y volver a cifrar la DEK usando esta nueva KEK.

    
respondido por el Xander 28.07.2017 - 23:53
fuente
0

Puedes:

  1. Vuelva a cifrar todo cuando un usuario cambie su nombre de usuario o contraseña
  2. Genere una clave aleatoria para cada usuario que utilice para cifrar los datos, luego cifre esta clave con la contraseña del usuario (o nombre de usuario + contraseña)

No recomendaría usar solo el nombre de usuario como clave, incluso si almacena el nombre de usuario cifrado (lo que parece un poco extremo), los nombres de usuario generalmente no se consideran secretos.

    
respondido por el AndrolGenhald 28.07.2017 - 23:24
fuente
0

Si desea cifrar la información del usuario, que está almacenada en una base de datos, le aconsejaría que no almacene la clave para descifrar los datos en esa misma base de datos. Encriptaría los contenidos con un secreto almacenado en otro lugar con políticas de acceso más estrictas. De esa manera, el atacante debe tener acceso tanto a su almacén de claves como a su base de datos para obtener esos datos. Esto extiende la superficie de ataque.

    
respondido por el MikeSchem 28.07.2017 - 23:37
fuente

Lea otras preguntas en las etiquetas