如何安全地将 API 凭据存储在 GitHub 上共享的 C# 文件中?

How to safely store API credentials in a C# file shared on GitHub?

我正在为 Windows 10 制作一个客户端应用程序。我有一个问题,我想开源我的代码,但让其他人看不到 API 密钥。这是我的源文件的相关部分:

private const string ApiKey = "YOUR_API_KEY";

我想将其转换为

private const string ApiKey = "THE_ACTUAL_API_KEY";

编译时。我该怎么做?


编辑: 如有任何歧义,请见谅;我问的是如何防止 GitHub 上的源代码查看者看到该字符串,同时又不必在本地构建期间更改它。这个问题与加密没有任何关系。

这是我最终解决问题的方法。

我在名为 Credentials.cs 的项目中添加了一个 class:

public static class Credentials
{
    public const string ApiKey = "YOUR_API_KEY";
}

所有对 API 键的进一步引用都是通过我添加的字段进行的。例如:

public void MakeRequest()
{
    var client = new ApiClient(Credentials.ApiKey);
    client.DoSomething();
}

现在是神奇的部分。通过 Git 提交该文件后,我 运行 git update-index --assume-unchanged Credentials.cs(根据 this SO answer)告诉 Git 停止跟踪文件更改。换句话说,如果你修改文件运行git diffgit status,什么也不会显示。

然后我用文件中的实际 API 密钥替换了 YOUR_API_KEY,现在一切正常。

我通常将它们放在 Web.config.Template.xml 文件中。然后我将我的真实密钥放入 web.debug.config(例如),当项目构建时,我将 Web.config.Template.xml 转换为 web.debug.config 并将转换转储到 web.config。我使用 nuget 包 XmlTransformer 并将这一行放在 "prebuild" 事件中以在每次构建项目时完成此操作:"$(SolutionDir)packages\XmlTransformer.1.1.0.4\lib\net40\XmlTransformer.exe" /s:"$(ProjectDir)Web.config.Template.xml" /t:"$(ProjectDir)Web.$(ConfigurationName).config" /d:"$(ProjectDir)Web.config" /k:Transform

我从不向 SC 提交 web.configweb.debug.config,只有 web.template.config

这里有一些关于配置转换的更多信息:https://msdn.microsoft.com/en-us/library/dd465326(v=vs.110).aspx

你不能。唯一的解决办法是 不能存储在您的 public GitHub 存储库 中。您永远不能允许秘密的任何非 public 部分成为... public.

这个问题的解决方案是您必须将机密存储在离您的主机更近的地方。下面是 Azure Websites has built in secret protection 如何与持续部署无缝集成的示例。其他云提供商也有类似的结构,自己托管……你必须自己做。您构建一个 post-构建步骤,该步骤将从非 public 位置交换秘密。

单独的选项是维护包含密钥的 public 存储库的私有分支。然后,您只需根据需要将更新从 public 存储库拉到您的私人存储库。但最佳情况下,您希望密钥不受源代码控制。