.net - programa - Contenedores clave, lo suficientemente seguro para almacenar claves privadas?
lastpass (1)
Eso realmente depende de sus necesidades.
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 por las credenciales del usuario (si se usa el almacén de usuarios) o las credenciales de la máquina (si se usa el almacén 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 almacenen la clave en una tarjeta inteligente, módulo de seguridad de hardware, chip TPM, etc.
Para protegerse contra un atacante menos capaz, CryptoAPI y, por lo tanto, RSACryptoServiceProvider le ofrece la posibilidad de configurar la clave como 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 todavía podrá solucionar este problema). Para hacer esto, genere la clave con CspProviderFlags.UseNonExportableKey
.
También puede usar CspProviderFlags.UseUserProtectedKey
que solicitará al usuario una confirmación y una contraseña adicional opcional cada vez que se use la clave privada.
Estaba leyendo sobre Key Containers en .NET como un lugar seguro para almacenar una clave privada para la criptografía asimétrica y la firma digital.
Mi pregunta es qué tan seguro es el contenedor de claves? porque he averiguado si conozco el nombre del contenedor de claves, entonces podré recuperar la clave privada usando lo 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 los contenedores clave un lugar seguro para almacenar claves privadas?