System.Security.Cryptography.ProtectedData.Unprotect在某些情况下抛出一个无效的键错误

时间:2011-07-05 18:48:28

标签: c# cryptography

所以我试图在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文章,在机器上运行的任何进程都应该能够取消保护数据。但不是。

1 个答案:

答案 0 :(得分:20)

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

这给你留下了两个选择:

  • 使用在同一台计算机上的同一帐户下运行的代码加密和解密数据
  • 使用CRYPTPROTECT_LOCAL_MACHINE标志来使用机器密钥,而不是用户的

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