c# - example - System.Security.Cryptography.ProtectedData.Unprotect lanza un error de clave no válida en determinadas circunstancias
simple encryption c# (1)
Así que estoy tratando de utilizar el método Desproteger en el objeto System.Security.Cryptography.ProtectedData y sigo obteniendo la excepción:
cryptographicexception key not valid for use in specified state
Creo que tiene que ver con DataProtectionScope (pero no soy 100%).
Este método funciona si estoy conectado y ejecuto un servicio ejecutable en modo DEPURACIÓN, lo que significa que se ejecutará bajo el "usuario actual". Sin embargo, si intento ejecutar el servicio de Windows actual, que se ejecuta bajo la cuenta LocalSystem, falla lanzando la excepción mencionada anteriormente.
Método:
ProtectedData.Unprotect(Byte[] byteArray, <some_password_salt>, DataProtectionScope.CurrentUser)
DataProtectionScope Enum, solo tiene CurrentUser o LocalMachine como sus opciones. No estoy seguro de cuál sería la mejor opción para resolver esto.
Intenté configurarlo en DataProtectionScope.LocalMachine, que según el artículo de MSDN, cualquier proceso que se ejecute en la máquina debería poder desproteger los datos. Pero no lo hace.
La API de protección de datos usa una clave generada para cada usuario. Es un esquema de cifrado simétrico, lo que significa que los datos cifrados para un usuario no pueden ser descifrados por otro usuario. Tampoco puede ser descifrado por el mismo usuario en una máquina diferente.
Eso te deja con dos opciones:
- Cifre y descifre los datos con código que se ejecuta bajo la misma cuenta en la misma máquina
- Use el indicador
CRYPTPROTECT_LOCAL_MACHINE
para usar la clave del equipo, no la del usuario
De cualquier forma, el cifrado y el descifrado deben hacerse de la misma manera. Por ejemplo, use el indicador de la máquina local al cifrar y descifrar.