Primero debe asegurarse de no estar enfrentando un problema x-y, ya que tener una base de datos por usuario detrás de la misma aplicación no es el diseño más común. Es mucho más común compartir la base de datos y dejar que la aplicación implemente la separación de usuarios. Entre otras ventajas, tiene una única conexión de base de datos, que facilita enormemente la escalabilidad y el mantenimiento de la base de datos.
Si realmente necesita ese diseño, mi opción preferida sería dejar la responsabilidad de la contraseña a los usuarios. Si es una opción, la contraseña de la base de datos podría ser simplemente la contraseña del usuario web. De esa manera, ni siquiera tiene que almacenarlo y simplemente crear la conexión de la base de datos en el momento del inicio de sesión y cerrarla al cerrar la sesión (o al final de la sesión web). Alternativamente, podría obtener una clave de cada contraseña web individual y utilizarla para cifrar la contraseña de la base de datos para cada usuario si desea mantenerlos separados = > el resultado es el mismo, necesita la contraseña web que no almacena para acceder a la base de datos
Si ninguna de estas opciones es aceptable, deberá almacenar las contraseñas en forma invertible en el servidor de la aplicación, pero es una pesadilla de seguridad. Sus opciones son:
- no importa en absoluto: almacene las contraseñas en texto claro y ore para que nadie tenga acceso a esos datos; sorprendentemente, es una opción demasiado común (*) ...
- no me importa mucho: igual que arriba, pero encripta las contraseñas con una clave fija codificada en la aplicación, un poco mejor porque el atacante ahora necesita dos elementos, pero uno de ellos nunca puede cambiar
- haz tu mejor esfuerzo: encripta las contraseñas con una clave modificable. Puede leerse desde el entorno en el momento del arranque y cambiarse en una base regular, por ejemplo, cada mes, por ejemplo. Pero eso significa que al cambiar la contraseña maestra, también debe cambiar todas las contraseñas de la base de datos de forma atómica. De acuerdo, cualquier base de datos puede hacerlo, pero beuhhh ... Alternativamente, puede imitar las bóvedas de contraseñas y cifrar un archivo completo al costo que el acceso a una contraseña individual requerirá un descifrado completo a menos que acepte mantener la base de datos completa en texto sin cifrar en la memoria.
(*) ... pero puede ser una opción aceptable si el servidor de aplicaciones y los servidores de base de datos están en la misma zona de seguridad .