2010-09-29 13 views
9

He estado buscando una manera de almacenar una determinada clave AES para que no se pueda recuperar, pero aún se puede usar para cifrado y descifrado (usando C#). Creo que el equivalente para el almacenamiento de claves asimétricas se puede encontrar en here, pero estoy buscando algo que se pueda usar para el cifrado simétrico. ¿Existe en una forma administrada (pre .Net 4)?¿Cómo puedo almacenar de forma segura una clave AES en Windows con .Net (C#)?

+0

Si puede encriptar con él, puede recuperarlo. – SLaks

+1

@SLaks: a menos que el sistema operativo sea lo que está haciendo el cifrado, y almacena la clave en algún lugar "seguro". Como, digamos, el servicio "Almacenamiento protegido" podría funcionar. – cHao

+0

@cHow. Eso es lo que estoy pensando. Microsoft proporciona este tipo de funcionalidad con certificados (pueden almacenar y usar su clave privada de forma segura), pero tal vez no sea lo que estoy buscando. – Nogwater

Respuesta

2

Dependiendo de contra quién se defienda, puede usar el ProtectedData class.

+0

Es posible que tengamos que seguir esa ruta, pero tengo entendido que si almacenamos nuestra clave utilizando ProtectedData, podríamos recuperarla más tarde. No queremos recuperarlo, solo poder usarlo. – Nogwater

+0

Solo puede recuperarlo mientras está conectado como el mismo usuario. – SLaks

+0

Sí, creo que eso probablemente funcione para nosotros. No es realmente ideal porque estamos instalando nuestro software en un grupo de máquinas, lo que significaría que el blob cifrado de nuestra clave AES que necesitaríamos almacenar sería diferente por máquina. En este momento nos estamos inclinando hacia algo como esto: http://www.codestrider.com/BlogRead.aspx?b=d147ff4f-65e0-47f5-a39b-40ae07a42005 con utiliza el cifrado de clave pública/privada y la tienda de certificados de Windows para proteger el clave real – Nogwater

1

@SLaks es correcto, si está en su memoria se puede acceder. Puedes hacerlo más difícil, pero siempre será posible.

Es por eso que las personas que son serias descargan la criptografía.

Una de las opciones es smart card. Esto le permite mover datos a la tarjeta y obtener resultados, pero no permite el acceso al material clave. No está en el espacio de memoria de su PC por lo que no se puede filtrar.

Ross Anderson tiene un buen documento, Programming Satan's Computer acerca de este tipo de cosas. Del resumen:

El problema es la presencia de un oponente hostil, que pueden alterar los mensajes a voluntad. En efecto, nuestra tarea es programar una computadora que da respuestas que son sutilmente y maliciosamente mal en el momento más inoportuno posible.

Incluso si no le preocupa la memoria física, solo el disco duro y la fuente, debe tener cuidado con la memoria virtual. Si no tiene cuidado (o usa un servicio cuidadosamente escrito) puede obtener claves de texto plano en su archivo de intercambio. Aquí hay otro enlace que analiza el problema. No es que quiera hacer eso, pero hace que el problema sea evidente: Encrypting Virtual Memory. Creo que hay llamadas del sistema para este propósito para marcar la memoria como no imprimible pero no puedo encontrar un enlace.

+0

No somos lo suficientemente paranoicos como para preocuparnos por alguien con acceso a la memoria, solo al disco duro del servidor (incluido el acceso de lectura a nuestro código fuente). – Nogwater

+0

agregó un poco de disco duro y memoria virtual –

+0

Gracias Paul. Es bueno saberlo. – Nogwater

0

Incluso para los datos asimétricos, si la clave se almacena en la computadora y se utiliza más adelante, entonces se recupera y descifra antes de su uso. Y en este punto, un hacker experto puede recuperarlo (al capturar la memoria de la computadora y estudiarla). Esto no es trivial, pero aún es posible.

En general, para solucionar su problema, se ofrecen criptomonedas y tarjetas criptográficas USB. Estos dispositivos de hardware tienen su propia memoria para almacenar claves simétricas y asimétricas, y tienen un procesador para realizar operaciones criptográficas usando esas claves. La llave nunca abandona el dispositivo y es virtualmente imposible extraerlo del dispositivo con fuerza (existen algunos ataques de hardware como escanear la memoria con un microscopio, pero son mucho más complicados que un ataque de software en la computadora).

Si su llave es realmente valiosa, use USB cryptotoken. El precio del dispositivo es muy moderado, alrededor de $ 70- $ 100 por unidad y hay varios proveedores que ofrecen dichos dispositivos.

0

Para continuar con la tendencia de descargar la criptografía, si conoce el hardware de todo su clúster puede tener la clave en TPM si la placa base tiene una, es solo otra opción para el usb o smart- soluciones de tarjeta.

+0

No tengo acceso a USB o tarjeta inteligente para estos servidores. Algunas de nuestras cajas aún ejecutan Windows 2003, por lo que no es realmente una opción para mí. ¿Hay bibliotecas .NET 3.5 estándar para TPM? Tal vez sea útil para otra persona. – Nogwater

5

Windows DPAPI (Win32 documentation), y su contenedor .NET (ProtectedData Class) no almacena ningún dato. Más bien, Windows DPAPI devuelve un valor de cifrado criptográfico que puede almacenar en cualquier lugar que desee, incluso en varios servidores.

En mi lugar de trabajo utilizamos DPAPI para generar un cifrado para una clave AES que luego almacenamos en el Registro.

El único propósito de Windows DPAPI es encriptar datos de manera que solo una cuenta de usuario o máquina determinada puedan descifrarlo, sin necesidad de almacenar una contraseña.

La clase .NET ProtectedData ha estado en .NET Framework desde 2.0.

Me quedaría con Windows DPAPI sobre un producto de terceros, ya que es maduro, estable, gratuito, fácil de usar y totalmente compatible con .NET.

+0

Solo para asegurarme de que entiendo ... Para usar ProtectedData en varias máquinas, debería haber una cuenta de usuario compartida en ambas máquinas, que debería ser proporcionada por un controlador de dominio, ¿no? – Nogwater

+4

Puede usar DPAPI para cifrar la clave de forma independiente en 2 máquinas separadas, que se ejecutan en 2 cuentas de usuario diferentes si lo desea, es solo que los 2 valores de cifrado no serían intercambiables, es decir. tendría que ser descifrado bajo la misma cuenta (o máquina si se usa DPAPI basado en máquina) que hizo el cifrado. Si desea tener 1 cifra que se pueda descifrar en varias máquinas, entonces sí, yo diría que necesitaría una cuenta compartida y un controlador de dominio. – saille

+0

Gracias por la aclaración. – Nogwater

Cuestiones relacionadas