c# encryption dns roaming

c# - Almacenamiento persistente de datos encriptados usando.Net



encryption dns (2)

Necesito almacenar datos encriptados (pocas cadenas pequeñas) entre ejecuciones de aplicaciones. No deseo que el usuario proporcione una frase de contraseña cada vez que lance la aplicación. Es decir, después de todo, se trata de almacenar de forma segura las claves de cifrado.

Estaba buscando en RSACryptoServiceProvider y usando PersistentKeyInCsp, pero no estoy seguro de cómo funciona. ¿El contenedor de claves es persistente entre ejecuciones de aplicaciones o reinicios de máquinas? En caso afirmativo, ¿es específico del usuario o específico de la máquina? Es decir, si almaceno mis datos encriptados en el perfil itinerante del usuario, ¿puedo descifrar los datos si el usuario inicia sesión en una máquina diferente?

Si lo anterior no funciona, ¿cuáles son mis opciones? (Necesito ocuparme de los perfiles itinerantes).


Me gustaría agregar al enfoque DPAPI.

Aunque no he implementado el enfoque de tienda de usuario por mi cuenta, hay documentación de Microsoft para un enfoque de tienda de usuario que encripta y descifra datos para un usuario específico.

Usé el DPAPI usando una tienda de máquinas. Lo describiré en caso de que encaje con lo que estás buscando hacer. Utilicé un servicio de Windows para cargar un perfil de usuario de Windows y la contraseña de ese usuario se usa para cifrar datos.

Como nota al margen, DPAPI usa Triple-DES que puede ser un poco más débil (que AES), pero entonces no estoy seguro de qué tipo de protección estás buscando.

Protección de datos de Windows http://msdn.microsoft.com/en-us/library/ms995355.aspx


La API de protección de datos (DPAPI) hace exactamente lo que desea. Proporciona cifrado simétrico de datos arbitrarios, utilizando las credenciales de la máquina o (mejor) el usuario, como la clave de cifrado. No tiene que preocuparse por administrar las llaves; Windows se ocupa de eso por ti. Si el usuario cambia su contraseña, Windows volverá a cifrar los datos con la nueva contraseña del usuario.

DPAPI está expuesto en .NET con la clase System.Security.Cryptography.ProtectedData:

byte[] plaintextBytes = GetDataToProtect(); byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser);

El segundo parámetro del método Protect es una matriz de bytes de entropía opcional, que se puede utilizar como un "secreto" adicional específico de la aplicación.

Para descifrar, use la llamada ProtectedData.Unprotect:

byte[] encodedBytes = GetDataToUnprotect(); byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser);

DPAPI funciona correctamente con perfiles móviles (como se describe aquí ), aunque deberá almacenar los datos cifrados en un lugar (red compartida, IsolatedStorage con IsolatedStorageScope.Roaming , etc.) a los que puedan acceder sus diferentes máquinas.

Consulte la clase ProtectedData en MSDN para obtener más información. Aquí hay un libro blanco de DPAPI, con más información de la que siempre quisieras.