c# - 如何在分布式 Windows 应用程序之间共享秘密而不将其保存到程序集中?
问题描述
我有一个分布式 Windows 应用程序 - 不同机器上的多个 IIS 网站和 Windows 服务。
我需要加密敏感的用户数据(如第三方 API 凭据),然后解密以在应用程序中使用它。
这种加密的目标 - 防止对数据库和文件系统的访问受限(例如只读访问)的用户能够访问敏感的管理员凭据。
显然,我需要我的应用程序共享一个公共秘密(私钥),以便能够在一个应用程序中加密并在另一个应用程序中解密。
我正在考虑将此密钥作为安装程序的一部分分发的选项,但这种方法会使安装程序本身变得敏感。由于它们是通过不安全的“商业渠道”分发的,我想避免它。
我认为我正在寻找的东西是我的安装程序上的签名,它将由目标 Windows 机器检查,这将使我能够访问内置机制来加密-解密数据。ProtectedData.Protect之类的东西,但DataProtectionScope
不限于用户或机器。理想情况下,它应该在公司范围内。
解决方案
我有一些新的想法,所以它已经可以算作一个答案(虽然不是最终的解决方案)。
如果我在安装过程中生成新的公钥/私钥对,然后将其存储在机器上,它将为一台机器完成这项工作。现在的问题是如何在不同机器上的应用程序之间安全地交换这个密钥。
较旧的Crypto API 文档有此引用:
如果各个 CSP 可以直接通信,这将更容易,但它们不能。由于 CSP 无法通信,因此密钥必须从一个 CSP 导出,传输到目标应用程序,然后导入目标 CSP。如果通信路径不受信任,此过程可能会变得更加复杂。
较新的CNG 文档有这样的短语:
您可以使用 CNG 导入和导出对称密钥和非对称密钥。您可以使用密钥导出和导入功能在机器之间移动密钥。
所以看起来 Windows 机器之间的信任转换是安装过程的一部分。例如,安装后可以建议用户导出私钥,然后在从属安装过程中使用。
推荐阅读
- mysql - 如何在MySql中借助外键选择外键表的属性?
- javascript - Semantic UI React - 如何防止在按钮按下时滚动以获取表单中所需的输入?
- python - 在树莓派中写入 CSV 时切换列
- sql - SQLite 如何使用生成的列在同一个查询中进行额外的计算
- sql - 如何透视表以创建二进制数据?
- search - 如何在 SOLR 中正确查询父子文档?
- javascript - 在一组 HTML 单选按钮中,如何突出显示正确/错误的选择
- asp.net - EF Core DbContext sql 连接字符串错误(在 MS Docs 中尝试了以下信息)
- javascript - req.body.username 没有输出正确的值
- amazon-web-services - 将存储在 S3 中的 .csv 文件迁移到 DynamoDB 的方法?