2008-09-30 12 views
15

Necesito almacenar datos encriptados (algunas 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.Almacenamiento persistente de datos cifrados usando .Net

Estaba buscando en RSACryptoServiceProvider y utilizando 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? (Tengo que ocuparme de los perfiles itinerantes).

Respuesta

35

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 se expone 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 entropía opcional, que se puede utilizar como una aplicación adicional "secreto" específico

para descifrar, utilice la llamada ProtectedData.Unprotect:

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

DPAPI funciona correctamente con los perfiles móviles (como se describe here), aunque tendrá que almacenar los datos cifrados en un lugar (recurso compartido de red, IsolatedStorage con IsolatedStorageScope.Roaming, etc.) al que pueden acceder sus diversas máquinas.

Consulte la clase ProtectedData en MSDN para obtener más información. Hay un documento de DPAPI en blanco here, con más información de la que siempre quisieras.

+0

Sólo para la posteridad, que tendrá que buscar en otro código para manejar la persistencia en alguna parte más "público" (al menos en su intranet, por ejemplo) para que puedan llegar a ella desde otras máquinas Normalmente puede usar Environment.SpecialFolder.ApplicationData para obtener una ubicación específica de máquina y usuario. –

+0

Gracias por la respuesta, esto debería funcionar. ¿Tienes alguna idea de cómo se puede hacer esto en 1.1.? ProtectedData es nuevo para .Net 2.0 –

+1

Para usar DPAPI en .NET 1.1, deberá usar P/Invoke.Vea aquí para un recorrido bastante completo: http://msdn.microsoft.com/en-us/library/aa302402.aspx –

0

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.

Utilicé el DPAPI usando la 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 del tipo de protección que está buscando. Protección

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

Cuestiones relacionadas