C # .Net es la forma más segura de almacenar el par de claves RSA en Windows

0

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:

  1. 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.

  2. 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.

  3. .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

  4. 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.

  5. 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?

    
pregunta Richard 02.06.2016 - 01:59
fuente

2 respuestas

0

Si su aplicación que se ejecuta como usuario puede acceder a una porción de datos, cualquier proceso que se ejecute como ese usuario también puede acceder a ella. Como vio en su investigación de la opción 2, determinados programas podrán encontrar los datos si se almacenan sin cifrado adicional. Si implementa algún cifrado, como en la opción 1, alguien podría aplicar ingeniería inversa a su aplicación para descubrir cómo funciona el cifrado, y luego su aplicación, si se ejecuta como ese usuario, puede obtener la clave.

La única forma de evitar que un programa que se ejecuta como usuario acceda al par de llaves es dejar que el programa no pueda descifrarlo solo. Es decir, debe almacenar la clave fuera de línea (como en una unidad flash que el usuario conecta cuando sea necesario) o cifrarla con una contraseña que el usuario ingrese cada vez (es decir, la contraseña nunca se almacena). De esa manera, incluso si otro programa roba los datos protegidos, no puede obtener la clave.

De todas formas, un atacante sofisticado crearía un programa que espera a que la clave se cargue en la memoria y luego la roba. En Windows, las aplicaciones no son principios de seguridad. Si el usuario puede obtener datos, las aplicaciones que se ejecutan como ese usuario también pueden obtenerlos.

    
respondido por el Ben N 02.06.2016 - 02:55
fuente
1

La forma más segura de almacenar una clave privada es generarla en una tarjeta inteligente o en un HSM. ¿Es esa una opción?

La tarjeta inteligente o HSM todavía puede usarse para cifrar y descifrar por quien tenga acceso, pero no entregará la clave.

Puedes poner la clave pública donde quieras.

    
respondido por el Neil McGuigan 02.06.2016 - 07:56
fuente

Lea otras preguntas en las etiquetas