我们如何在 .net 核心控制台应用程序中存储加密的 API 密钥

Posted

技术标签:

【中文标题】我们如何在 .net 核心控制台应用程序中存储加密的 API 密钥【英文标题】:How we can store API keys encrypted inside .net core console application 【发布时间】:2021-07-25 01:02:39 【问题描述】:

我正在开发一个与第 3 方 API 集成的 .NET 核心控制台应用程序。为了进行集成,我需要在 API 请求中传递 API 密钥。所以我的问题是我可以在哪里/如何将 API 密钥存储在我的控制台应用程序中?在常规 .NET 控制台应用程序中,我使用将 API 密钥存储在 app.config 中并使用 Aspnet_regiis.. 加密密钥。但不确定如何在 .NET 核心控制台应用程序中这样做?

【问题讨论】:

您的应用程序将在什么上下文中运行?只是在内部,还是您会将其分发给数百名用户?它会安装在用户的 PC 上还是数据中心的服务器上?你主要想保护谁的密钥? 您需要将它们存储在应用程序中吗?为什么不使用 Azure Key Vault? 如果您不需要加密,您可以使用 Secret Manger - docs.microsoft.com/en-us/aspnet/core/security/… 如果您需要对其进行加密,您需要在数据保护 API 的帮助下自行实施 - docs.microsoft.com/en-us/aspnet/core/security/data-protection/… @Codo 它将在开发应用程序时在实时 Windows 2012 r2 服务器 + 开发服务器上运行。关于我要保护的对象,我想保护它免受开发人员或任何用户的影响访问实时服务器 【参考方案1】:

你可以考虑...

为不同的环境获取单独的密钥(以便泄露的密钥可以过期/取消而不会影响其他环境)。

在操作系统提供的密钥库 [https://docs.microsoft.com/en-us/dotnet/standard/security/cryptography-model] 中存储加密的密钥(例如)。 (这只是意味着它们不会被随便的路人“闲置”。)

从控制台应用程序中删除用于检索密钥的代码,可能是普通开发人员无权访问的简单服务或库。 (一定程度的分离。)

要在应用程序中嵌入信息,请考虑资源文件 [https://docs.microsoft.com/en-us/dotnet/framework/resources/creating-resource-files-for-desktop-apps]

底线:这个问题说明了公钥(非对称)密码学 [https://en.wikipedia.org/wiki/Public-key_cryptography] 但任何处理一条“在流动中解密”的信息使该信息容易受到任何有权处理(调试)实时应用程序或在系统上使用诊断工具的人的攻击。 (如果一个人需要一把钥匙来开门,那么你必须给他们一把钥匙来开门,这样就不能防止不诚实地滥用该特权。)

有点偏执是健康的,但太多可能会成为完成工作的障碍。

【讨论】:

【参考方案2】:

开发中的安全性

对于本地开发,您可以使用Secrets Manager Tool(仅用于开发,从不用于生产)。此工具允许您将敏感数据本地存储在项目树之外的计算机上。

这个工具不是超级安全的,密钥也没有加密,但它提供了一种简单的方法来避免在项目配置文件中存储秘密,并且必须记住将它们添加到源代码管理忽略列表中。

生产中的安全性

一种常见的方法是将机密存储在外部保管库中。

如果您在 Azure 上托管应用程序,Azure 还提供更安全的选项:Azure Key Vault。

Key Vault 是一种用于管理机密的云托管服务,您授权的应用程序可以通过加密通道访问该服务。

【讨论】:

您通过 clientId 和 clientSecret 访问保管库。那么如何加密这些呢?不就是同一个问题吗?【参考方案3】:

建议不要将加密密钥存储在 .NET 控制台应用程序中。更理想的做法是将机密分开,在开发模式下使用机密管理工具存储它们,然后像​​前面提到的那样将 Azure KeyVault 等服务用于生产。

请参阅https://dev.to/dotnet/how-to-store-app-secrets-for-your-asp-net-core-project-2j5b 上有关应用机密和配置的链接以及为什么我们需要一个工具来管理它,以获取有关如何执行此操作的详细说明。

【讨论】:

以上是关于我们如何在 .net 核心控制台应用程序中存储加密的 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何在.net核心中加密和解密字符串

在实体框架模型类中实现加密

核心数据 SQLite 加密?

如何在 Firebase(客户端)中加密文件存储?

.Net 加密

如何对 ASP.NET Core 控制器或模型对象进行单元测试?