2010-01-26 7 views
5

Estoy desarrollando una aplicación de escritorio .NET winforms destinada a ejecutarse en varias sucursales bancarias como una aplicación de copia de seguridad cuando la principal (una aplicación web) no está disponible debido a problemas de conexión con el nodo central del banco. Las sucursales no cuentan con ningún servicio empresarial además de una base de datos SQL-Server. Por esa razón, la aplicación debería poder conectarse directamente al servidor SQL. Mi problema surge cuando tengo que proporcionar a la aplicación una contraseña para conectarse a la base de datos:Seguridad de cadena de conexión en la aplicación de escritorio .net

1) Almacenar la contraseña en texto claro en un archivo app.config o similar no es una opción (el cliente requiere la contraseña para encriptarse)

2) Almacenar la contraseña encriptada en un archivo de configuración lleva a la necesidad de tener una clave de cifrado localmente disponible. La clave de encriptación podría estar codificada en el código de la aplicación, pero sería fácilmente legible mediante el uso de un descompilador .net o similar.

3) El uso de un algoritmo personalizado para encriptar/descifrar tampoco funcionaría por las mismas razones que 2).

de seguridad 4) integrado no es compatible con el banco

Además, los clientes requiere que ellos deberían ser capaces de cambiar la contraseña en un lugar (dentro de una rama) sin la necesidad de pasar de un ordenador a otro actualizar archivos de configuración (que excluye la posibilidad de utilizar la clave de la máquina para cifrar la contraseña en los archivos de configuración de la máquina individual como asp.net)

¿Podría proporcionar algún otro enfoque o sugerencia para solucionar este problema? Agradecería cualquier ayuda. Gracias de antemano, Bernabé

Respuesta

1

No creo que encyrpting la contraseña de ninguna manera va a resolver su problema. Si el usuario debe enviar la contraseña al servidor y la contraseña se encuentra en el cuadro, el usuario que ejecuta la aplicación debe tener acceso a la contraseña y poder descifrarla. De lo contrario, no podría autenticarlos. Esto significa que siempre habrá una manera para que el usuario obtenga la contraseña, independientemente de dónde la almacene.

Puedo pensar en 2 maneras que podrían funcionar, pero me temo que no son exactamente lo que estás buscando.

  1. eliminar el requisito de tener el usuario enviar la contraseña al servidor mediante el uso de algún tipo de proxy local (por ejemplo usando un WCF ventanas servicio) para tomar sus peticiones WinForm y luego enviarlos en su nombre al servidor de bases de datos. Si instala el servicio usando una cuenta diferente de la cuenta del usuario, entonces puede asegurar la contraseña por cualquiera de los medios mencionados en las otras respuestas . La clave aquí es hacer que asegúrese de que el usuario de la aplicación no tenga tenga acceso a los recursos que la cuenta de servicio necesita para descifrar la contraseña.
  2. No guarde la contraseña en la configuración web. Asigne a cada usuario una cuenta de usuario y contraseña diferentes a nivel de base de datos y pídales que la ingresen cuando inicien sesión.
+0

Hola, gracias por su respuesta. Tener el acceso a los datos en un servicio autónomo independiente parece una buena forma de hacerlo (de hecho, sería fácil de implementar, siempre que ya se haya puesto toda la funcionalidad de acceso a los datos detrás de una fachada. He estado investigando un poco acerca de los servicios wcf autohospedados, y encontré que Microsoft no recomienda esa opción para entornos de producción. ¿Qué piensas sobre eso? ¿Conoces algún sistema de producción que lo use? Estoy preguntando porque yo ' es bastante nuevo para WCF. ¡Gracias! Bernabé –

+0

Si lo aloja en la misma aplicación, AFAIK, se ejecutará bajo la misma cuenta de usuario, que no es lo que desea. Sugeriría que aloje WCF como un servicio de Windows, ya que es fácil de proteger, se ejecuta localmente y no tiene que instalar nada más en la caja, como por ejemplo IIS. Aquí hay un enlace al artículo de MSDN que describe sus opciones de alojamiento, señalando específicamente a alojarlo como un servicio de Windows. http://msdn.microsoft.com/en-us/library/bb332338.aspx#msdnwcfhc_topic4 – jvilalta

+0

Exactamente, eso es lo que quise decir cuando eché de menos el término "self-hosted". En el artículo que acaba de publicar, se habla de "funciones de alta disponibilidad limitadas" cuando comparan el servicio de Windows con el alojamiento de IIS. Pero no son muy específicos al respecto, no conozco el clima que podría ser importante en mi caso, una sucursal podría tener no más de 20 usuarios simultáneos. –

0

Se podría

  • Para utilizar DPAPI para almacenar una clave de cifrado/descifrado de forma segura: How To: Use DPAPI to Encrypt and Decrypt Data
  • Para instalar una SQL Server Compact Edition (u otra base de datos pequeño) en las estaciones de trabajo y para sincronice los datos cuando su aplicación web vuelva a estar en línea.
  • Para pedir ayuda dentro de esa institución, ya que otras personas podrían haber resuelto ese problema y podrían ayudarlo.
0

Definitivamente de acuerdo con lo anterior con respecto a DPAPI. La Enterprise Library de Microsoft también hace que esto sea una brisa absoluta, por lo que consideraría buscar primero.

Cuestiones relacionadas