C# System.Security.Cryptography.ProtectedData.Unprotect在某些情况下抛出无效密钥错误

C# System.Security.Cryptography.ProtectedData.Unprotect在某些情况下抛出无效密钥错误,c#,cryptography,C#,Cryptography,因此,我尝试在System.Security.Cryptography.ProtectedData对象中使用Unprotect方法,并不断获取异常: cryptographicexception key not valid for use in specified state 我认为这与DataProtectionScope有关(但我不是100%) 如果我登录并在调试模式下运行服务可执行文件,则此方法有效,这对我来说意味着它将在“currentuser”下运行。但是,如果我尝试运行在Local

因此,我尝试在System.Security.Cryptography.ProtectedData对象中使用Unprotect方法,并不断获取异常:

cryptographicexception key not valid for use in specified state
我认为这与DataProtectionScope有关(但我不是100%)

如果我登录并在调试模式下运行服务可执行文件,则此方法有效,这对我来说意味着它将在“currentuser”下运行。但是,如果我尝试运行在LocalSystem帐户下运行的实际windows服务,它将无法引发前面提到的异常

方法:

ProtectedData.Unprotect(Byte[] byteArray, <some_password_salt>, DataProtectionScope.CurrentUser)
ProtectedData.Unprotect(字节[]byteArray,DataProtectionScope.CurrentUser)
DataProtectionScope枚举只有CurrentUser或LocalMachine作为选项。我不确定解决这个问题的最佳选择是什么

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

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

这就给您留下了两个选择:

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

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

是的,我最初尝试使用该标志时发现两个问题。在纠正了这两个错误之后,我能够使用LocalMachine标志来工作。非常有用——在我的例子中,我尝试运行从另一个项目中获取的代码。它已经在使用LocalMachine,但我在一台机器上加密,在另一台机器上解密。但这不包括漫游配置文件中用户通常使用不同机器登录的场景。任何负载平衡器、citrix服务器场等都会破坏这一点。仅在单机场景下可用DPAPI密钥位于(或可以置于)漫游配置文件中。计算机没有漫游配置文件,因此如果使用上面的选项2,则必须在应用程序中实现某种“首次读取时加密”功能。可能是一个查询安全敏感数据的工具,并为您提供加密版本以保存在某处。