【问题标题】:Exchanging secure data between exe and Service在 exe 和服务之间交换安全数据
【发布时间】:2011-11-02 02:57:09
【问题描述】:

我有一个 Windows exe,它必须将一些 安全 数据写入 HKEY_LOCAL_MACHINE (HKLM)。我还有一个作为 NetworkService 帐户运行的服务,它必须读取该安全数据。请注意,exe 和服务以不同的用户身份运行。

这里的问题是保护数据。我尝试使用CryptProtectData,但问题是服务无法解密,因为数据未使用 NetworkService 帐户加密。我不想在调用 CryptProtectData 时使用 CRYPTPROTECT_LOCAL_MACHINE 标志,因为任何用户都可以解密它并且基本上使它不安全。

我猜这是一个常见的用例,但找不到任何解决方案。请问有什么想法吗?

仅供参考,我正在使用 Visual C++ 编写 exe 和服务。

【问题讨论】:

    标签: windows windows-services winapi data-security


    【解决方案1】:

    您尝试将注册表用作进程间通信 (IPC) 机制,但您发现它不是很优雅。

    对于您正在寻找的更好的架构是完全在服务内处理加密/解密,并使用 real IPC 机制(TCP 套接字、邮槽等)来传输数据从EXE到服务进行加密。

    编辑:

    注册表听起来不适合存放这些数据,除了加密。戴上我的“系统管理员帽子”,我宁愿将您的数据放在文件系统中,也不愿放在注册表中。使用注册表作为存储转发队列机制给了我很大的勇气。

    就加密架构而言,我认为最好使用非对称加密。让 EXE 使用服务的公钥加密数据。该服务可以使用其私钥解密数据。

    【讨论】:

    • 在注册表中存储加密数据的原因是因为exe运行时服务不会运行(也不会创建),exe会从用户那里收集安全数据并存储它在注册表中,以便在安装并启动服务后,它可以选择该数据,解密并开始使用它。
    • 我同意你关于文件优先于注册表的观点,除非不可避免,否则不要使用注册表是很有意义的。关于加密,是否很容易转储进程并查看代码中存在的密钥? (我是 Windows 编程新手,所以我不确定该密钥的安全性)
    • 如果您能提供帮助,您绝对不想将密钥嵌入您的代码中。我建议您继续使用 CryptProtectData,但让可执行文件安装并启动服务(必要时在特殊模式下)并使用 IPC 加密 NetworkService 帐户上下文中的数据。 (如果实在无法提前安装服务,请为此创建第二个服务。)
    • 另外,您可能需要考虑使用 NetworkService 以外的安全上下文。许多代码在 NetworkService 中运行,如果其中任何代码存在漏洞,那么您也一样。如果这是 Windows 7,请考虑使用托管服务帐户或虚拟帐户(尽管我不确定虚拟帐户是否支持加密)。
    • @evan-anderson,根据您的建议,我尝试将其存储在文件中并加密文件(EFS)并授予 NetworkService 帐户解密文件的权限,但这不起作用(我猜测)因为 NetworkService 帐户没有任何与之关联的证书。非常感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2022-01-21
    相关资源
    最近更新 更多