向 Windows 服务发送密码
Posted
技术标签:
【中文标题】向 Windows 服务发送密码【英文标题】:Sending a password to a Windows Service 【发布时间】:2009-01-18 14:29:37 【问题描述】:的最佳方式是什么?我们的应用程序需要密码才能启动。我不在乎服务“通常”应该在没有用户交互的情况下运行。操作员可以启动应用程序然后注销,这对我们来说已经足够了。
在 unix 系统上,我只是通过标准输入回显密码,但服务没有标准输入。
目前,我们使用 DPAPI 仅使用 CryptProtectData 存储密码。虽然这可行,但它带来了其他问题,开始变得麻烦。
我猜我需要在服务和发送密码的应用程序之间使用某种形式的 IPC,但我不确定哪种方法合适(如果有的话)。
谢谢
【问题讨论】:
【参考方案1】:两个主要选项:
您可以在启动时侦听套接字并等待提供所需的密码(可能在其中嵌入一个 SSH 服务器,这样密码就无法通过网络窥探)
我的首选选项是从配置文件(可以保护到最低读者人数)或注册表设置(同样,足够安全,只有您的服务和管理员可以读取/更改密码)中读取密码
【讨论】:
【参考方案2】:感谢罗兰的回复。
你可以在一个套接字上监听 启动并等待所需的 要提供的密码(可能嵌入 那里有一个 SSH 服务器,因此 密码不能被窥探 电线)
我考虑过,但如果没有证书验证,那不会让我们容易受到中间人的攻击吗?
我的首选是阅读 配置文件中的密码 (可以保证到最低限度 读者)或注册表设置 (再次,足够安全,使得 只有您的服务和管理员 可以读取/更改它)
我们正在尝试尽可能地遵循“深度防御”,这样如果攻击者破坏了机器,他将无法访问我们的应用程序。
【讨论】:
【参考方案3】:您可以使用kerberos mutual authentication。那里的选项和示例很少。
但只是想知道。在受感染的机器上,可能有一个键盘记录器。因此,如果您想在此环境中保持安全性,输入密码永远不会安全。 unix 终端也存在同样的问题。
【讨论】:
【参考方案4】:用户模式中的 DPAPI 确实是最好的选择,并将加密数据存储在受保护的位置,例如具有有限 ACL 的注册表项。 究竟是什么问题开始变得麻烦?也许我们可以解决这些......
【讨论】:
【参考方案5】:究竟是什么问题 开始麻烦了?也许 我们可以解决这些...
目前,应用程序以本地系统帐户运行。
我们的应用程序将许多凭据存储在加密文件中,并使用 DPAPI(在 UserMode 中)进行加密。
因此,当安装应用程序时,安装程序会作为本地系统帐户运行。我们还有一组随应用程序提供的工具,其中一些工具需要访问此加密文件,因此它们也需要作为本地系统帐户运行。
在安装和启动应用程序时,我们已经严重依赖该帐户。
我们遇到了问题,因为我们的一位用户想要使用该应用程序来访问共享网络驱动器。本地系统帐户没有这样的权限,我们不能简单地以其他用户身份运行我们的服务,因为我们的加密信息受到本地系统帐户的保护。
我们试图避免仅为我们的应用程序设置用户帐户的过程,因为它安装在许多不同的客户和环境中,所有这些客户和环境都有截然不同的安全策略。
【讨论】:
【参考方案6】:您可以从系统帐户下运行的服务访问远程驱动器。但是,您需要拥有凭据和共享信息才能连接到远程计算机。您可以使用 API wnetaddconnection 来获得访问权限。可能您的加密文件也可以存储此凭据。
【讨论】:
以上是关于向 Windows 服务发送密码的主要内容,如果未能解决你的问题,请参考以下文章
从 Windows Phone 设备向 Web 服务发送推送通知