Estoy trabajando en una pequeña aplicación web. La aplicación web necesita acceso a una base de datos, por lo que la aplicación necesita acceso a un nombre de usuario y contraseña de la base de datos.
La aplicación se ejecuta en un entorno donde las máquinas virtuales van y vienen y no hay discos persistentes. La única configuración de entorno que podemos configurar que permanece en el tiempo son los certificados, todas las demás configuraciones deben almacenarse como parte de la aplicación (que cargamos al servicio de alojamiento en un archivo zip). Los certificados que cargamos a los proveedores de alojamiento se instalan automáticamente en el almacén de certificados de Windows por parte del proveedor de alojamiento.
El servidor de la base de datos que estamos utilizando no admite la autenticación mediante certificados, solo el nombre de usuario y las contraseñas, por lo que me pregunto si el siguiente esquema tendría sentido:
- Creamos un certificado X509 autofirmado con openssl o makecert.
- Subimos el certificado (con clave privada) al proveedor de alojamiento (lo hacemos una vez, o cuando queremos renovar el certificado).
- Encriptamos las contraseñas de la base de datos en la configuración de la aplicación usando la parte de clave pública de nuestro certificado (usando RSACryptoServiceProvider ).
- Subimos la contraseña cifrada en un archivo de configuración como parte de nuestro paquete postal de aplicaciones al proveedor
- En nuestro código de aplicación, antes de conectarnos al servidor de la base de datos, desciframos la contraseña de la base de datos usando el certificado (nuevamente, usando RSACryptoServiceProvider)
Con esto, obtenemos lo siguiente:
- Cualquier persona (yo o mis amigos) que trabaje con la aplicación puede establecer una nueva contraseña de base de datos, cifrarla y actualizar la configuración de la aplicación, sin acceso a la clave privada en el certificado.
- Solo las personas con la clave privada (que está instalada en los servidores y almacenada localmente por mí) pueden descifrar la contraseña de la base de datos.
Parece que esta sería una solución bastante buena, pero agradecería que alguien más pudiera detectar un defecto.