2009-08-07 10 views
18

Estaba leyendo acerca de Key Containers in .NET como un lugar seguro para almacenar una clave privada para la criptografía asimétrica y la firma digital.¿Contenedores clave, lo suficientemente seguros como para almacenar claves privadas?

Mi pregunta es qué tan seguro es el contenedor de claves? porque me he dado cuenta si sé el nombre del contenedor de claves, entonces voy a ser capaz de recuperar la clave privada utilizando la siguiente:

// Create the CspParameters object and set the key container 
// name used to store the RSA key pair. 
CspParameters cp = new CspParameters(); 
cp.KeyContainerName = ContainerName; 

// Create a new instance of RSACryptoServiceProvider that accesses 
// the key container MyKeyContainerName. 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 

// Display the key information to the console. 
Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true)); 

son contenedores clave de un lugar seguro para almacenar las claves privadas?

Respuesta

15

Eso realmente depende de sus requisitos.

El almacén de claves detrás de RSACryptoServiceProvider es realmente el almacén de claves CryptoAPI. Las claves aquí se almacenan en el sistema de archivos protegido bajo las credenciales del usuario (si se usa la tienda del usuario) o las credenciales de la máquina (si se usa la tienda de la máquina). Esto significa que un atacante que tenga acceso a las credenciales adecuadas podrá extraer la clave privada.

Esto será cierto para todas las implementaciones criptográficas que no almacenan la clave en una tarjeta inteligente, módulo de seguridad de hardware, etc. chip TPM

Para proteger contra un atacante menos capaz, CryptoAPI y por lo tanto le da la RSACryptoServiceProvider posibilidad de establecer la clave a no exportable. Esto significa que CryptoAPI/.NET se negará a realizar la exportación de la clave privada por usted (pero un atacante bien informado aún podrá evitar esto). Para hacer esto, genere la clave con CspProviderFlags.UseNonExportableKey.

También puede usar CspProviderFlags.UseUserProtectedKey que solicitará confirmación al usuario y una contraseña adicional opcional siempre que se use la clave privada.

Cuestiones relacionadas