¿Cómo puedo proteger contraseñas almacenadas dentro de web.config?

He agregado la siguiente configuración dentro de mi archivo web.config para iniciar una llamada API al sistema externo. Así que estoy almacenando la API URL + nombre de usuario + contraseña de la siguiente manera: –

    

Luego, dentro de mi método de acción, haré referencia a estos valores al construir el cliente web de la siguiente manera:

 public ActionResult Create(RackJoin rj, FormCollection formValues) { XmlDocument doc = new XmlDocument(); using (var client = new WebClient()) { var query = HttpUtility.ParseQueryString(string.Empty); foreach (string key in formValues) { query[key] = this.Request.Form[key]; } query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"]; query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"]; string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"]; 

Pero en este caso expondré el nombre de usuario y la contraseña, y los usuarios pueden capturarlos, así que mi pregunta es cómo puedo asegurar el nombre de usuario y la contraseña de la API.

En general, web.config es un archivo seguro y IIS no lo publica, por lo tanto, no se expondrá a los usuarios que realizan solicitudes al servidor web. El servidor web solo sirve tipos específicos de archivos y web.config seguramente no es uno de ellos.

Muy a menudo guarda la cadena de conexión de la base de datos que incluye la contraseña. Ahora imagina un escenario donde web.config no era seguro. Usted ha creado una importante amenaza de seguridad para su aplicación.

Por lo tanto, especialmente siempre que su proyecto no sea demasiado grande, no debe preocuparse por ello.

Sin embargo, puede tener un mejor enfoque, pero crear un proyecto llamado “Recursos” y guardar toda la información crítica, como configuraciones, constelaciones, enumeraciones, etc. Ese sería un enfoque astuto y organizado.

Sin embargo, si está pasando el nombre de usuario / contraseña a través del cable (por ejemplo, en el caso de una llamada API asegurada), puede usar https para asegurarse de que la información que viaja está encriptada, pero eso no tiene nada que ver con la seguridad de archivo web.config.

Puede encriptar el web.config con aspnet_regiis . Esto es para evitar que personas con acceso a su servidor lean información delicada.

Por cierto, pondría sus configuraciones de configuración dentro de una clase, que luego se pueden inyectar en sus controladores, esto facilitará las pruebas de unidad.

El archivo web.config es solo un archivo en el sistema de archivos y, por lo tanto, usted debe (principalmente) considerar su seguridad de la misma manera que lo haría con cualquier otro archivo. IIS no lo atenderá (a menos que realice un cambio de configuración francamente loco en IIS, fácil de verificar, simplemente intente solicitarlo con un navegador).

Es una buena práctica proteger el directorio de su sitio web (c: / sites / my-site-here o lo que sea) usando permisos de carpeta solo para el usuario del dominio de la aplicación web para leer los archivos (y el usuario de implementación si es necesario) usando el archivo de Windows normal permisos

Por lo tanto, puede no ser necesario encriptar si tiene confianza en la seguridad del servidor web. Sin embargo, si se dice en alojamiento compartido, o si se vende el código del sitio web, o si el código fuente es público, entonces podría ser conveniente encriptarlo. aunque es un poco complicado.

¿Por qué usar Web.config?

Una de las ventajas de tener datos en Web.config en lugar de almacenarlos en Constantes, Enumeraciones, etc. es que puede cambiar fácilmente los datos para diferentes entornos.

Protección de datos

La mejor forma de proteger los datos en Web.config es encriptarlos. En lugar de cifrar secciones enteras en el archivo de configuración como lo sugirieron Joe y el usuario1089766 , puede encriptar la cadena de contraseña y almacenarla en la configuración.

Recuperando datos

Puede usar una función auxiliar como la siguiente para descifrar las claves.

 private const readonly string decryptKey = ""; public string GetFromConfig(string key) { var encryptedText = System.Web.Configuration.WebConfigurationManager.AppSettings[key]; var plainText = Decrypt(encryptedText, decryptKey); return plainText; } 

De esta forma, la clave de descifrado estará dentro del proyecto común para todos los entornos. Pero puede cambiar los datos en la web.config fácilmente sin volver a comstackr su aplicación.

PD : puede cambiar la clave de descifrado y los datos correspondientes con cada versión para mejorar la seguridad.