Pregunta

Necesito almacenar datos cifrados (pocas cadenas pequeñas) entre las ejecuciones de la aplicación. No quiero que el usuario proporcione una contraseña cada vez que inicie la aplicación. Es decir. después de todo, se reduce al almacenamiento seguro de la (s) clave (s) de encriptación.

Estaba buscando en RSACryptoServiceProvider y utilizando PersistentKeyInCsp, pero no estoy seguro de cómo funciona. ¿Es persistente el contenedor de claves entre las ejecuciones de la aplicación o los reinicios de la máquina? En caso afirmativo, es específico del usuario o específico de la máquina. Es decir. Si almaceno mis datos cifrados en el perfil móvil 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 tratar con los perfiles móviles)?

¿Fue útil?

Solución

La API de protección de datos (DPAPI) hace exactamente lo que usted desea. Proporciona el cifrado simétrico de datos arbitrarios, utilizando las credenciales de la máquina o (mejor) el usuario, como clave de cifrado. No tienes que preocuparte por administrar las claves; Windows se encarga 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 de entropía opcional, que se puede usar como un secreto adicional de la aplicación específico " secreto " ;.

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á almacene los datos encriptados 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 informe de DPAPI aquí , con más información de la que nunca querer.

Otros consejos

Me gustaría agregar al enfoque de DPAPI.

Aunque no he implementado el enfoque de usuario-tienda, hay documentación de Microsoft para un enfoque de usuario-tienda que cifra y descifra los datos de un usuario específico.

Utilicé el DPAPI usando la tienda de la máquina. 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 utiliza Triple-DES que puede ser un poco más débil (que AES), pero no estoy seguro de qué tipo de protección está buscando.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top