安全窗口模拟

本文关键字:模拟 窗口 安全 | 更新日期: 2023-09-27 18:20:26

在我的 WPF 应用程序中,我希望允许管理员使用集成安全性为其他各种用户测试数据库连接。所以我有一个表格,允许管理员输入域、用户名和密码,然后进行测试。我能够安全地处理密码,直到我在advapi32.dll中拨打LogonUser,这需要string password

LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)

我编写了一个实用程序函数,它将 SecureString 转换为尽可能安全的字符串,然后在 LogonUser 调用中根据密码调用它:

LogonUser(UserName, Domain, Helper.ConvertSafely(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)

由于 LogonUser 的签名采用字符串,除非 LogonUser 在执行时妥善保管密码,否则在调用返回后,它仍可能以纯文本形式出现在我的调用堆栈上。 有没有一种更安全的方式来模拟用户,我可以在其中知己PW始终是安全的?

基本上我所需要的只是一个WindowsImpersonationContext但我想在没有纯文本密码的情况下获取它。

安全窗口模拟

在托管应用程序中,可以使用 SecureString 类来处理敏感信息。通常不需要滚动自己的安全字符串机制。

就在您插入 LogonUser 之前,您将传递安全字符串密码。为此,您可以使用Marshal.SecureStringToGlobalAllocUnicode方法。因此,应用程序域中永远不会有表示密码的托管对象。

可以在本文中找到示例代码。

如果您需要更高的安全性,我建议您禁止来自 wpf 客户端的直接数据库连接。您可以引入中间层。因此,安全性从客户端转移到这一个服务器。客户端和应用服务器之间的通信是加密的,只有应用服务器与数据库通信。

如果要模拟的用户已登录到计算机上(例如在另一个会话中(,则答案如下: Windows 服务是否可以在没有密码的情况下模拟用户?

如果他不是,您必须向 LogonUser 提供密码。并且此密码必须至少驻留在内存中少量时间,因为这是定义 LogonUser 的方式。请注意,并非所有身份验证包都需要密码(如生物识别或智能卡:Windows 身份验证概述(。

因此,如果您真的想要冒充,则必须在某个地方传递密码。在这种情况下,请确保使用来自Microsoft的postlagerkarte代码:Marshal.SecureStringToGlobalAllocUnicode 方法示例代码

你真的不能做更多的事情。

更新:

您可以实现加密app.config。 您可以通过几种不同的方法执行此操作:

  • 保护连接信息
  • 视窗数据保护

因此,当管理员插入凭据时,您将解密凭据,app.config使用新凭据修改键/值。 然后,一旦插入,它就会再次加密配置文件。

因此,它

被最小化地暴露,但也通过封装插入数据,这也有助于隐藏它。

这是一种方法,尽管SecureString将起作用,但它期望char[]。 在某些情况下,通过advapi32.dll接口时可能并不理想。