Ejemplo de necesidad de aplicación: Una aplicación elimina los datos de un servicio web y necesita cifrar y conservar estos datos localmente en el disco. Solo esta aplicación debe poder descifrar los datos almacenados localmente. La aplicación se instala como un servicio de Windows y no tiene ninguna interacción directa con los usuarios.
Proceso de cifrado:
- La aplicación está instalada y genera claves RSA usando
System.Security.Cryptography.RSACryptoServiceProvider
- Las claves RSA se guardan en Key Container con un nombre de contenedor especificado por la aplicación.
- Posteriormente, la aplicación recupera las claves RSA usando
RSACryptoServiceProvider
y utiliza los primeros 32 bytes del parámetro D como la clave que elAesCryptoServiceProvider
usará para cifrar los datos en el disco. El AES IV utilizado se genera aleatoriamente porAesCryptoServiceProvider
para cada evento de cifrado. - El AES IV utilizado en el paso # 3 se añadiría al texto cifrado como se ha observado here y algunos otros lugares donde esta es una práctica normal.
Proceso de descifrado:
-
El AES IV se obtiene de los primeros 16 bytes del texto cifrado. El resto del texto cifrado se alimenta en el paso 2 a continuación.
-
La aplicación recupera las claves RSA usando
RSACryptoServiceProvider
y utiliza los primeros 32 bytes del parámetro D como la clave para queAesCryptoServiceProvider
se use para descifrar los datos del disco.
El contenedor de claves se usaría de esta manera principalmente porque se proporcionan métodos para almacenar claves asimétricas fácilmente como se describe en Contenedor de claves . El objetivo sería hacer que la aplicación genere nuevas claves RSA y reemplazar lo que se ha almacenado en el contenedor de claves; rotando así la clave AES utilizada para cifrar / descifrar. Puedo proporcionar algunos ejemplos de código, pero por ahora me gustaría obtener las preguntas básicas.
Preguntas :
- ¿Cómo es el método anterior mejor o peor que la aplicación que utiliza el ProtectedData disponible en .NET que simplificaría la administración de claves?
- ¿Existe un argumento para usar RSA para cifrar una clave simétrica para el cifrado / descifrado? ¿Dónde almacenar las claves simétricas cifradas? Esta capa agregada parece innecesaria si la clave privada RSA no es segura para comenzar dentro de Key Container .
- ¿Cómo se debe establecer
System.Security.Cryptography.CspParameters
cuando se pasa aRSACryptoServiceProvider
para limitar la accesibilidad de la clave privada RSA solo a esta aplicación? - ¿Desecha toda la idea y elige la solución XYZ?