Hace poco hablé con un cliente potencial que desea crear una base de datos que contenga datos bastante confidenciales. Uno de sus requisitos clave es que los datos almacenados se cifrarán de manera que solo el usuario podrá acceder a ellos. Incluso si hay algunas desventajas, pensé en cómo podría lograr esto y se me ocurrió el siguiente enfoque:
Cuando se crea un usuario, estoy creando un par de claves pública / privada para él. La clave privada se cifrará simétricamente con la contraseña del usuario. Todos los datos que se almacenan en la base de datos (muy probablemente, excepto la marca de tiempo y, por supuesto, la identificación) se cifran antes con la clave pública. Cuando el usuario inicie sesión, la contraseña se utilizará para descifrar la clave privada, que a su vez se puede usar para descifrar los datos de la base de datos al leerla. Toda la encriptación y el descifrado pueden ocurrir de manera transparente en la capa de acceso a datos.
Hay algunos inconvenientes importantes que deben abordarse aquí:
- Tendremos que desentregar y cifrar la clave privada cuando el usuario quiera cambiar su contraseña
- Si el usuario pierde su contraseña, no podremos reconstruir los datos
- La clave privada o la contraseña del usuario deben almacenarse en texto sin formato temporalmente
- Siempre que sospechemos que una clave privada ha sido dañada (en el sentido de robada) tendremos que volver a cifrar todos los datos de los usuarios
y, por supuesto, algunos más que aún no se me han acercado.
El primer problema es un inconveniente para nosotros, pero puede pasarle al usuario de forma transparente, por lo tanto, no es un gran problema.
El segundo es un poco más complejo. No queremos que el usuario pierda sus datos, pero tendremos que asumir que perderá su contraseña (el almacenamiento y / o el uso de una contraseña fija no son opciones por razones obvias, nunca). Una posible solución sería crear una frase de contraseña muy fuerte (más de 30 caracteres) que se usará para cifrar una copia de seguridad de la clave privada. Esto se puede enviar al usuario por correo postal o similar. El usuario puede usar esto para restaurar sus datos si olvidó su contraseña.
Tengo un mal presentimiento sobre no. 3, pero no tengo una mejor idea en este momento.
El cuarto problema nuevamente es un inconveniente para nosotros y puede llevarnos un tiempo, pero no debería ser un gran problema. El único problema es el factor humano aquí. Necesitaríamos que el usuario inicie sesión para realizar el nuevo cifrado y no podríamos hacerlo automáticamente.
¿Hay fallas serias en esto, especialmente en relación con la seguridad de los datos? ¿Es esta una buena idea de todos modos?