2009-09-03 8 views
5

He creado una aplicación web alojada en Godaddy en un servidor compartido. Planeo usar PayPal para mis transacciones, lo que crea un problema.Almacenamiento de credenciales de PayPal en una aplicación web (asp.net) en un host compartido

En este punto, las credenciales (dirección de correo electrónico y contraseña de PayPal) están codificadas, lo que es hasta donde yo entiendo la peor solución. La única otra opción que conozco es en el archivo web.config, que de nuevo no parece particularmente seguro.

¿Puede indicarme una dirección que proporcione la seguridad deseada y trabaje en un entorno de host compartido?

Saludos Alexandros

Respuesta

2

En un servidor compartido, el método más fácil, al menos a primera vista sería para cifrar la contraseña y almacenarla en su base de datos.

La implementación podría realizarse con cualquiera que sea su mecanismo de cifrado. Luego, desde una perspectiva clave, tiene varias opciones para almacenarlo, con diferentes niveles de seguridad, realmente depende de cuán "paranoico" sea con esto.

  1. simplemente almacenar la clave de cifrado en el web.config como una aplicación Ajuste (menos seguro, pero el acceso al web.config es limitado y otras cosas sensibles ya está ahí, como contraseñas DB)
  2. Crear una sección de configuración personalizada para web.confg, luego encripta y almacena los valores allí. (Esto es más seguro, ya que su clave no se puede leer mediante texto sin formato)
  3. Almacene la clave de cifrado en una tabla de base de datos, y limite que la tabla que se consultará sea solo una cuenta de usuario única. (Depende de tus pensamientos, esta podría ser la solución más portátil, sin embargo ...)
+0

¿Cómo almacena la clave de una manera que permite que la aplicación utilice la contraseña sin dejar la llave en una posición insegura ? – Tyrsius

+0

Existen algunas opciones para esto ... puede usar la clave que está en el archivo web.config (MachineKey), o puede crear su propia clave y ponerla en una opción web.config encriptada. –

+0

@Tyrsius - Agregué algunos detalles también con las opciones solo para darle algunas ideas. –

0

¿Podrías almacenarlos en el archivo web.config, y luego encriptar el archivo web.config?

O al menos, encriptarlos individualmente en el web.config?

0

Creo que tiene las siguientes opciones.

  1. archivo web.config Cifrar

  2. tienda en la base de datos utilizando cifrado

  3. Crear una biblioteca de clases y crear una clase que contendrá esta información. Ahora en el entorno compartido , se agregará como dll dentro de la carpeta Bin.

+0

1. Sé que se puede hacer. No estoy seguro de que se pueda hacer en hosts compartidos. 2 y 3. pase por el problema de descompilación. ¿estoy siendo paranoico? –

+0

Una de mis frases favoritas: lo que un hombre hace, otro hombre puede deshacer. No importa lo que hagas. Si alguien pone un esfuerzo en ello, puede deshacerlo. Y ahora que estás más paranoico que antes, mantén la calma y piensa: ¿Mi información es tan atractiva para la atención de los crackers? Si no, basta con encriptar la información en el web.config. – rcdmk

3

Las opciones son:

  1. API contraseña + firma de API. Tendrá para almacenarlo en algún lugar como texto sin formato o algo descifrable, tal vez sea archivo o base de datos.

  2. API contraseña + certificado API. Deberá verificar si el proveedor de servicios de alojamiento permite a sus usuarios establecer conexiones SSL a otros servidores (es decir, CURLOPT_SSLCERT en PHP). Si puede, use .

Sin embargo, independientemente de la forma que elija, si un hacker puede entrar en su cuenta, él/ella será capaz de recuperar su contraseña o su archivo cert.

p.s. tenga en cuenta que los términos "contraseña de API", "firma de API" y "certificado de API" son aquellos a los que se refieren en las referencias de la API de PayPal y en los manuales del desarrollador.

+0

Se corrigió la redacción y se eliminó la "firma" de la segunda opción, ya que un certificado API no tiene una firma API y viceversa. – Robert

+0

@Robert Gracias por la edición. :) – shinkou

0

Como no tiene acceso al servidor, deberá ejecutar el comando para encriptar las secciones de su web.config a través del código. Puede hacer esto creando una página web simple y ejecutarla en la carga de la página o haciendo clic en un botón. A continuación se muestra el bloque de código que deberá ejecutar, solo ligeramente modificado desde la fuente que tomé de Microsoft (http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.protectsection.aspx). Aunque ... este código en realidad no funcionó para mí. No es que el código sea incorrecto, sino porque mi cuenta no tiene permiso para el almacén de claves Rsa, sus resultados pueden variar. Si esto no funciona, entonces sigue leyendo para la opción 2.

' Get the current configuration file.' 
    Dim config As System.Configuration.Configuration = Web.Configuration.WebConfigurationManager.OpenWebConfiguration(Nothing) 

    ' Get the section.' 
    Dim section As AppSettingsSection = CType(config.GetSection("appSettings"), AppSettingsSection) 

    ' Protect (encrypt) the section.' 
    section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider") 

    ' Save the encrypted section.' 
    section.SectionInformation.ForceSave = True 
    config.Save(ConfigurationSaveMode.Full) 

Crédito: He encontrado que enlazan con el código a través de Need Encrypted connection string and stmp information in the web.config.

Opción 2: Por razones de seguridad, aún desea utilizar la clave del equipo, de modo que si alguien logra descargar su archivo web.config, no podrá descifrar su configuración. Una forma de hacerlo es codificar a mano todas las configuraciones utilizando la clave del equipo y descifrarlas cada vez que necesite usarlas, o puede almacenarlas en el caché cada vez que inicie una aplicación.

Para cifrado y descifrar un valor de clave de aplicación se puede utilizar un código como éste:

Dim encryptedString As String = Convert.ToBase64String(ProtectedData.Protect(System.Text.UTF8Encoding.UTF32.GetBytes("Testing"), Nothing, DataProtectionScope.LocalMachine)) 
    Dim decryptedString As String = System.Text.UTF8Encoding.UTF32.GetString(ProtectedData.Unprotect(Convert.FromBase64String(encryptedString), Nothing, DataProtectionScope.LocalMachine)) 

    Response.Write(encryptedString + " - " + decryptedString) 
+0

No pude obtener el primer método para trabajar (traducir el código a C#), me encontré con diferentes errores con algunos enfoques diferentes. El segundo método parece que depende de que la máquina de alojamiento no cambie. Con un host compartido, ¿no es esta una suposición insegura? – Tyrsius

+0

Eres la única respuesta nueva en una semana, parece que obtienes la recompensa por defecto. – Tyrsius

+0

@Tyrsius: un poco tarde, pero no tiene que dar una recompensa si nadie cumple con sus expectativas. Volviendo a la pregunta: si está asumiendo que la máquina de hospedaje puede cambiar, necesitará almacenar una clave de cifrado en una clave accesible, como otra aplicación de configuración. Estaba tratando de evitar esto porque significa que si de alguna manera alguien lograra descargar su web.config, podría usar la clave para descifrar su información de PayPal. ¿Por qué no se comunica con su proveedor de alojamiento web y les pregunta si va a cambiar de host o no; tal vez no sea nada de lo que deba preocuparse. – Peter

Cuestiones relacionadas