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

最佳答案

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

剩下两个选择:

  • 使用在同一台机器上以相同帐户运行的代码对数据进行加密和解密
  • 使用CRYPTPROTECT_LOCAL_MACHINE标志使用机器密钥,而不是用户的

  • 无论哪种方式,加密和解密都必须以相同的方式进行。例如,在加密和解密时使用本地计算机标志。

    09-06 05:53