来自不同用户的 DPAPI ProtectData

DPAPI ProtectData from different users

我使用 DPAPI ProtectData 如下:

var temp = new byte[32]
{
    1,1,1,1,1,1,1,1,
    2,2,2,2,2,2,2,3,
    3,3,3,3,3,3,3,3,
    4,4,4,4,4,4,4,4
};

ProtectedData.Protect(temp, null, DataProtectionScope.CurrentUser);
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

让我们假设现在 temp 看起来像:

temp = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,....31 };

我想从 .exe 文件和我的 WebService (IIS) 执行此代码。
问题是,如果我 运行 从 exe 中获取代码,则当前用户是 MyDomain/Administrator,如果我从 WebService 运行 中获取代码,则当前用户是 IIS APPPOOL/MyApp.

我该如何解决这个问题? 我正在尝试从 WebService .exe 文件中 运行,如下所示:

Process.Start(@"C:\myexe.exe");

但由于某种原因它没有工作(我可以完全访问我的 iis 应用程序)而且无论如何我认为这不是这种情况的正确解决方案。

注意:出于安全原因,我无法从 DataProtectionScope.LocalMachine 更改为 DataProtectionScope.CurrentUser

如果您不想使用 DataProtectionScope.CurrentUser,您可以先将其安装为 LocalMachine。然后,让WebService解密它,然后使用CurrentUser重新加密它。确保删除旧值及其所有临时副本。这样,您可以从 LocalMachine 中获取它,并在适当的用户是 运行 时将其锁定。

这仍然使密钥暴露在 LocalMachine 级别,但时间较短 window。

另一个解决方案是使用 LocalMachine 并使用附加的熵特征和两个可执行文件之间共享的秘密。这可能是应用程序已知的混淆值(没有“真正的”安全性),或者是用户提供的密码。用户提供的密码解决方案可能更安全,但也更麻烦且编程开销更大。

如果安装和 WebService 运行 之间的时间 window 很短,第一个解决方案可能比较合适。

问题已解决。
我 运行 来自本地用户的 IIS 应用程序。
您可以通过选择应用程序池并单击“操作”窗格菜单下的“高级设置...”来找到它。 Select 身份,然后单击列出的当前用户旁边的按钮。 Select 自定义账户并点击设置。使用格式 domain\username 作为用户名并输入用户密码。