2011-07-05 19 views
6

Así que estoy tratando de utilizar el método de desprotección en el objeto System.Security.Cryptography.ProtectedData y seguir recibiendo la excepción:System.Security.Cryptography.ProtectedData.Unprotect está lanzando un error de clave no válida en ciertas circunstancias

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 DEBUG, lo que significa que para mí, se estaría ejecutando 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) 

El DataProtectionScope Enum, sólo tiene CurrentUser o LocalMachine como sus opciones. No estoy seguro de cuál sería la mejor opción para resolver esto.

He intentado configurarlo en DataProtectionScope.LocalMachine, que de acuerdo con el artículo de MSDN, cualquier proceso que se ejecute en la máquina debería poder desproteger los datos. Pero no lo hace.

Respuesta

13

El Data protection API 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:

  • cifrar y descifrar los datos con el código que se ejecuta en la misma cuenta en la misma máquina
  • usar la bandera CRYPTPROTECT_LOCAL_MACHINE utilizar la clave del equipo, no el usuario de

De cualquier forma, el cifrado y el descifrado deben realizarse de la misma manera. Por ejemplo, use el indicador de la máquina local al cifrar y descifrar.

+0

Sí, encontré dos problemas cuando traté de usar originalmente esa bandera. Después de rectificar ambos, pude usar el indicador LocalMachine para trabajar. – pghtech

+3

Muy útil: en mi caso, estaba tratando de ejecutar el código que había obtenido de un proyecto diferente. Ya estaba usando LocalMachine, pero estaba encriptando en una máquina y descifrando una diferente. – neminem

Cuestiones relacionadas