使用DPAPI保护数据时遇到访问被拒绝的问题

3

我正在Windows 8操作系统上开发一个c# .net 3.5应用程序。

我需要使用DPAPI加密数据。在除了一台机器之外的所有机器上,它都可以正常运行。在这台机器上,我遇到了以下异常:System.Security.Cryptography.CryptographicException Message: Access is denied.

 byte[] bytes;
 bytes = ProtectedData.Protect(Encoding.UTF8.GetBytes(argsStr.ToString()), null, DataProtectionScope.CurrentUser);

当我将DataProtectionScope.CurrentUser更改为DataProtectionScope.LocalMachine时,它可以正常工作。

似乎有人拒绝了当前用户执行DAPI加密的访问权限。

我该怎么解决这个问题?

失败的应用程序是在当前登录用户下运行的控制台应用程序。

即使使用提升的特权运行应用程序,仍然会因访问被拒绝而失败。

我尝试重置登录密码并解决了这个问题。

像这样的情况如何发生?


我们需要更多你的代码。我们需要确切了解 argsStr 是什么类型。ProtectedData.Protect 的参数是两个 byte 数组。 - Security Hound
我也尝试使用argsStr = string.empty来实现它。我认为这与字符串本身无关。 - user844541
如果 argsStr 已经是一个字符串,为什么要使用 ToString() 将其转换为字符串?你没有回答我的问题。argsStr 究竟是什么类型? - Security Hound
具体来说,它是一个StringDictionary,但我创建了一个新的应用程序,它所做的就是尝试在string.Empty上调用protect,但仍然失败。 - user844541
@ Ramhound -在其它机器上它都能正常工作,所以我猜应该没问题 :) - user844541
显示剩余2条评论
2个回答

2

这是由于DPAPI的MasterKey不同步造成的。

典型的原因有:

  • 管理员更改了密码(未提供旧密码且不在域中 - net user administrator password)
  • 第三方身份验证包

您可以使用CryptProtectData(CRYPTPROTECT_CRED_SYNC)在代码中手动同步MasterKey。

祝好,Vincent


1
如果有人需要在PowerShell中执行此操作所需的代码,请参见此处:https://social.technet.microsoft.com/Forums/lync/en-US/5dac39ca-9e44-4594-8637-feb78fada120/data-protection-in-pssession-access-is-denied?forum=winserverpowershell - bgh

2

我曾经遇到过类似的问题,当时用户在Windows 7上没有设置密码。解决方法是为该用户设置一个密码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接