seguridad para mvc metodos encriptar encriptacion desencriptar datos contraseƱa como claves cifrado aplicaciones algoritmos c# .net security encryption

para - La mejor forma de almacenar claves de cifrado en.NET C#



metodos de cifrado c# (7)

¿Qué ocurre con el almacenamiento de la clave de cifrado / descifrado de archivos en un servidor remoto, obteniéndolo a través de un servicio web que lo transfiere a través de https a la aplicación? de esa manera, la clave permanece en la memoria de la computadora pero no en un archivo de código fuente.

Esto requiere tener conexión al servidor de claves por quienquiera que ejecute la aplicación.

En nuestra aplicación, tenemos una gran cantidad de configuraciones de configuración delicadas, que almacenamos en un archivo xml que nuevamente se cifra.

Este archivo seguro debe descifrarse en tiempo de ejecución y leer los valores de configuración. pero surge el problema de que el vector de clave e inicialización está codificado en el código y, por lo tanto, cualquiera puede leerlo utilizando Reflector.

¿Cuál es la mejor manera de almacenar claves de cifrado en .NET para que nadie pueda leerlas con Reflector?


¿Qué pasa con el almacenamiento de la clave en un hardware, aquí estoy hablando de módulos de seguridad de hardware! ¿Podemos usarlo como mejores prácticas para ocultar la clave? ¿Podemos almacenar la clave en el archivo de configuración y luego encriptar el archivo de configuración? En mi caso, estoy hablando de una aplicación .Net independiente.


Cuando instale la aplicación, cree un nuevo conjunto de claves RSA, luego encripte los datos con AES usando la clave privada como contraseña. Como Windows almacena de forma segura las claves privadas RSA en la PC que las creó, los datos solo pueden ser descifrados por la computadora que creó los datos porque solo esa computadora tendrá la clave necesaria.


Debe usar Machine Keystore, es un almacenamiento seguro especialmente para este propósito. Por ejemplo:

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME); cspParams.Flags = CspProviderFlags.UseMachineKeyStore; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

Donde KEYNAME es una cadena personalizada que se puede usar para recuperar la clave más adelante.

Para obtener más ejemplos, consulte esta pregunta: Cómo almacenar una clave pública en un contenedor de clave RSA a nivel de máquina


Generalmente, se debe crear una nueva clave y IV para cada sesión, y ni la clave ni IV deben almacenarse para su uso en una sesión posterior.

Para comunicar una clave simétrica y IV a una ubicación remota, por lo general encriptaría la clave simétrica y IV usando cifrado asimétrico. Enviar estos valores a través de una red insegura sin encriptarlos es extremadamente inseguro, ya que cualquiera que intercepte estos valores puede descifrar sus datos. Para obtener más información sobre este proceso de cifrado y transferencia de la clave y IV, consulte Creación de un esquema criptográfico .


Si desea proteger sus datos de otros usuarios. Eche un vistazo a la clase ProtectedData .

(Descargo de responsabilidad: la protección de sus datos para crear un esquema de protección contra copia no está cubierto en esta respuesta).

Esta clase utiliza el DPAPI de Windows para cifrar y descifrar datos a nivel de usuario o de máquina.

El uso de ProtectedData / DPAPI lo libera de manejar claves y proteger los datos usted mismo. Y puede elegir proteger los datos para el usuario actual. Los datos pueden leerse desde diferentes computadoras, por los mismos usuarios del dominio.

Si quieres crear tu propia clave. Puede crear una clave por usuario / máquina y almacenar esta clave en el registro. Debido a que el registro puede estar protegido, solo el usuario actual puede leer la clave nuevamente. Sé que el registro tiene mal karma, pero en realidad es muy bueno para almacenar datos como este.

PD: No coloques el IV en tu código. Cree un IV nuevo cada vez, y póngalo en frente de los datos.


Si no puede leerlos en reflector, ¿cómo espera que el programa los lea? Podría ofuscarlos dividiéndolos y almacenando las piezas por todos lados, pero (AFAIK) una vez que requiera que su programa los pueda leer, cualquiera que tenga acceso a su código también puede leerlos.

No olvide los valores en la memoria también se puede acceder ( tos SecureString).