如何在 .net core 控制台应用程序中加密存储 API 密钥

5

我正在开发一个与第三方API集成的.NET核心控制台应用程序,需要在API请求中传递API密钥。问:我应该在控制台应用程序中存储API密钥?在常规的.NET控制台应用程序中,我通常将API密钥存储在app.config中,并使用Aspnet_regiis加密密钥。但不确定如何在.NET核心控制台应用程序中实现?


1
你的应用程序将在什么样的环境下运行?只在内部使用还是要分发给数百个用户?它将安装在用户的个人电脑上还是在数据中心的服务器上?你主要想保护密钥不被谁获取? - Codo
3
需要在应用程序中存储它们吗?为什么不使用 Azure Key Vault? - Connell.O'Donnell
1
如果您不需要加密,可以使用 Secret Manager - https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.1&tabs=windows#secret-manager - Stanisalv Dontsov
1
如果您需要加密它,您将需要借助数据保护 API 自己实现 - https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/using-data-protection?view=aspnetcore-5.0 - Stanisalv Dontsov
听起来控制台应用程序不是您的用例的正确选择。 应该有一个后端(服务器)组件,它公开功能但不公开API密钥。 然后可以有一个客户端连接到它,可以是基于Web的客户端(如单页应用程序)或基于控制台的客户端,但这也只会调用您的后端,后端可以安全地保存机密信息(API密钥)。 - Gabor Lengyel
显示剩余3条评论
3个回答

0

您可以考虑以下几点:

  • 为不同的环境发行单独的密钥(这样就可以在不影响其他环境的情况下使泄露的密钥失效/取消)。

  • 加密存储密钥 - 例如 - 在操作系统提供的密钥库中 [https://learn.microsoft.com/en-us/dotnet/standard/security/cryptography-model]。(这意味着它们不会“随意留在那里”供路人观看。)

  • 从控制台应用程序中删除检索密钥的代码,可能将其移到普通开发人员无法访问的简单服务或库中。(一种分离级别。)

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

底线:这个问题说明了公钥(非对称)加密[https://en.wikipedia.org/wiki/Public-key_cryptography]的存在意义,但任何处理“解密流程”信息的应用程序都会使该信息容易受到所有具有工作权限(调试)的人或在系统上使用诊断工具的人的攻击。(如果一个人需要一把钥匙打开一扇门,那么你必须给他一把可以打开它的钥匙,不能防止不诚实的滥用这种特权。)
有点偏执是健康的,但太多可能会成为完成任务的障碍。

0

开发中的安全性

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

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

生产环境中的安全性

一个常见的方法是将秘密存储在外部保险库中。

如果你的应用程序托管在Azure上,Azure还提供了一种更安全的选择:Azure Key Vault

Key Vault是一个云托管的服务,用于管理秘密,只有通过加密通道授权的应用程序才能访问。


2
您通过clientId和clientSecret访问保险库。那么,如何加密这些信息呢?这不是同样的问题吗? - Luke

0

建议不要将加密密钥存储在.NET控制台应用程序中。更理想的做法是将密钥与应用程序分开,使用开发模式下的秘密管理工具进行存储,并像之前提到的Azure KeyVault一样,在生产环境中查看服务。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接