首页 > 解决方案 > 如何在分布式 Windows 应用程序之间共享秘密而不将其保存到程序集中?

问题描述

我有一个分布式 Windows 应用程序 - 不同机器上的多个 IIS 网站和 Windows 服务。

我需要加密敏感的用户数据(如第三方 API 凭据),然后解密以在应用程序中使用它。

这种加密的目标 - 防止对数据库和文件系统的访问受限(例如只读访问)的用户能够访问敏感的管理员凭据。

显然,我需要我的应用程序共享一个公共秘密(私钥),以便能够在一个应用程序中加密并在另一个应用程序中解密。

我正在考虑将此密钥作为安装程序的一部分分发的选项,但这种方法会使安装程序本身变得敏感。由于它们是通过不安全的“商业渠道”分发的,我想避免它。

我认为我正在寻找的东西是我的安装程序上的签名,它将由目标 Windows 机器检查,这将使我能够访问内置机制来加密-解密数据。ProtectedData.Protect之类的东西,但DataProtectionScope不限于用户或机器。理想情况下,它应该在公司范围内。

标签: c#windowsencryptioncryptography

解决方案


我有一些新的想法,所以它已经可以算作一个答案(虽然不是最终的解决方案)。

如果我在安装过程中生成新的公钥/私钥对,然后将其存储在机器上,它将为一台机器完成这项工作。现在的问题是如何在不同机器上的应用程序之间安全地交换这个密钥。

较旧的Crypto API 文档有此引用:

如果各个 CSP 可以直接通信,这将更容易,但它们不能。由于 CSP 无法通信,因此密钥必须从一个 CSP 导出,传输到目标应用程序,然后导入目标 CSP。如果通信路径不受信任,此过程可能会变得更加复杂。

较新的CNG 文档有这样的短语:

您可以使用 CNG 导入和导出对称密钥和非对称密钥。您可以使用密钥导出和导入功能在机器之间移动密钥

所以看起来 Windows 机器之间的信任转换是安装过程的一部分。例如,安装后可以建议用户导出私钥,然后在从属安装过程中使用。


推荐阅读