2011-01-20 19 views
8

Tenemos una aplicación C# (.net 3.5). Durante la instalación, usamos AesCryptoServiceProvider para cifrar alguna información útil en el archivo de configuración. Esa información será descifrada por la aplicación cuando se está ejecutando. Por lo que la aplicación necesita saber la Key y IVdónde almacenar Key y IV para AesCryptoServiceProvider?

Estamos pensando para almacenar el Key y IV byte [] en un lugar seguro en la máquina. Sé que hay un machine store que puede almacenar par de claves RSA. ¿Puedo almacenar el Key y IV byte [] allí? Busqué en línea y leí el documento de MSDN, pero no puedo encontrar la manera de hacerlo.

¿Sabes cómo hacerlo? ¿Tienes alguna otra buena idea?

Respuesta

4

Lo que estás intentando es una violación de cifrado. Las claves criptográficas se almacenan comúnmente en texto plano en un archivo de configuración. El IV se almacena comúnmente con el texto de cifrado en su almacén de datos. Siempre y cuando no viole CWE-329, debe ser de oro con este diseño.

Cuando todo esto se rompe para usted es que está tratando de ocultar el texto de cifrado en la misma máquina que la clave. ¿Dónde está el atacante? Si ya está en su máquina, puede simplemente iniciar un depurador y leer la clave o el texto sin formato en la memoria. La criptografía no puede resolver este problema; lo que está buscando es Security Though Obscurity (que no es una solución segura).

1

Voy a responder primero a la pregunta: "¿Tiene alguna otra buena idea?"

.Net framework tiene soporte incorporado para encriptar las secciones de configuración. Puede aplicar este cifrado a la mayoría de las secciones de configuración con algunas excepciones (por ejemplo, machine.config). A menos que tenga una buena razón para desplegar su propio cifrado de configuración, podría ser una mejor idea usar lo que ya se le proporcionó en el marco.

Si va por esa ruta, aquí hay un buen punto de partida. http://msdn.microsoft.com/en-us/library/53tyfkaw(v=vs.100).aspx

Si va con RSA, todavía necesitará obtener su clave pública y privada en la máquina durante la instalación. Según su pregunta, presumiblemente tiene una forma de obtener la clave de la máquina; solo necesita saber dónde almacenarla. En ese caso, Microsoft proporciona un lugar para almacenar sus claves RSA. Puede seguir este artículo sobre cómo importar y exportar claves: http://msdn.microsoft.com/en-us/library/yxw286t2(v=vs.100).aspx

En los equipos que ejecutan la aplicación, marque la clave privada como no exportable cuando instale el par de claves para mayor seguridad. Si la aplicación se ejecuta bajo una cuenta de usuario específica, instale el par de claves en la tienda de usuarios.

El usuario (o grupo de aplicaciones en el caso de la mayoría de las aplicaciones web) necesitará permiso para leer la clave privada. Puede usar aspnet_regiis.exe para la concesión de permisos.

La mayoría de los ejemplos en la web se referirán a aspnet_regiis.exe para crear, exportar, importar y otorgar permisos a pares de claves RSA. Usted no tiene que usar ese programa, pero si lo hace, hay un par de aspectos críticos:

  1. sólo se ejecuta en archivos denominados web.config. Entonces, si tiene una aplicación de consola, debe cambiar el nombre de su archivo de configuración a web.config para usarlo con aspnet_regiis.exe.

  2. Si usa aspnet_regiis.exe para crear su par de claves, ignorará el parámetro de longitud de la clave. A partir de esta respuesta, la longitud de clave recomendada actual es 3072. Para crear un par de claves con una clave privada de 3072 bits, no use aspnet_regiis.exe. Consulte How to set key size of RSA key created using aspnet_regiis? para ver un ejemplo de cómo crear una longitud de clave más grande.

Después de todo eso, si todavía necesita para almacenar la clave AES en alguna parte, usted podría considerar ponerlo en un archivo y lo protege con EFS usando cipher.exe.

Cuestiones relacionadas