2011-07-05 140 views
6

投掷无效键错误所以我想利用在System.Security.Cryptography.ProtectedData对象的解除方法和不断收到异常:System.Security.Cryptography.ProtectedData.Unprotect在某些情况下

cryptographicexception key not valid for use in specified state 

我认为它与DataProtectionScope(但我不是100%)有关。

如果我登录并在DEBUG模式下运行服务可执行文件,这对我意味着它将运行在“currentuser”下。但是,如果我尝试运行在LocalSystem帐户下运行的实际Windows服务,它将无法抛出前面提到的异常。

方法:

ProtectedData.Unprotect(Byte[] byteArray, <some_password_salt>, DataProtectionScope.CurrentUser) 

的DataProtectionScope枚举,只有CurrentUser或LOCALMACHINE为你的选择。我不确定什么是解决这个问题的最佳选择。

我已经尝试将其设置为DataProtectionScope.LocalMachine,根据MSDN文章,在机器上运行的任何进程应该能够解除保护数据。但没有。

回答

13

Data protection API使用为每个用户生成的密钥。它是一种对称加密方案,这意味着为用户加密的数据不能被其他用户解密。它不能由不同机器上的相同用户解密。

这使得你有两个选择:

  • 加密,并使用相同的帐户下运行在同一台机器上的代码
  • 使用CRYPTPROTECT_LOCAL_MACHINE标志使用本机键,而不是用户的
  • 解密数据

无论哪种方式,加密和解密必须以同样的方式完成。例如,在加密和解密时使用本地机器标志。

+0

是的,我试图最初使用该标志时发现两个问题。纠正两者后,我能够使用LocalMachine标志工作。 – pghtech

+3

非常有帮助 - 在我的情况下,我试图运行我从另一个项目中获取的代码。它已经在使用LocalMachine,但我在一台机器上进行了加密,并在另一台机器上进行了解密。 – neminem

相关问题