En este momento estoy buscando la manera más segura de almacenar una clave RSA privada en Windows.
Haciéndolo lo más usable posible para el usuario final, mientras se mantiene la seguridad a su máximo nivel. Como esto es prácticamente imposible, no estoy seguro de a dónde ir exactamente con un compromiso. Tal vez me estoy olvidando de otra posibilidad y me gustaría pedir ayuda a la junta de seguridad de la información.
Escenario: un usuario genera un par de claves RSA. Esto se usa con frecuencia para cifrar / descifrar claves AES para luego acceder a los datos reales. Digamos que es una aplicación de chat, o una aplicación como dropbox para archivos. El propósito realmente no importa, ya que el enfoque está en la forma en que se almacena y se puede acceder a la clave privada RSA.
El flujo de trabajo del usuario: Iniciar sesión en Windows - > Iniciar aplicación - > Inicie sesión a través de la API para el servidor web - > inicio de sesión exitoso - > acceder a la clave privada localmente - > realizar la tarea x (chat, archivo, etc ...)
Las posibilidades:
-
Base de datos SQLite donde la clave privada no está encriptada en formato PEM. La base de datos está "encriptada" y la contraseña se guarda en la aplicación .net como una cadena Rápido y sucio. Yo diría mala práctica. Sin embargo, otras aplicaciones no pueden acceder a la base de datos SQLite ya que no conocen la clave.
-
CryptoAPI .NET mediante el contenedor de clave de usuario RSA. Si bien tiene DenyExport y otros indicadores activados, cualquier aplicación puede acceder a la clave mientras el usuario está conectado. Con mimikatz y un software similar, es bastante fácil exportar la clave privada aunque no sea exportable.
-
.NET DAPI no es realmente para proteger RSA Keypair y más interesante para información confidencial en la memoria. Ningún punto en absoluto
-
Simplemente exporta la clave PEM como clave protegida por contraseña. La usabilidad disminuye ya que el usuario necesitaría una segunda contraseña para acceder a la clave.
-
Datos aislados .NET - fuera de cuestión.
¿Hay otra forma de almacenar una clave privada de manera segura pero práctica en un sistema Windows?