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

时间:2016-01-27 18:33:45

标签: c# .net api api-key

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

private const string ApiKey = "YOUR_API_KEY";

我想将此转换为

private const string ApiKey = "THE_ACTUAL_API_KEY";

编译时。我该怎么做呢?

编辑:抱歉任何含糊之处;我问如何防止GitHub上的源代码的查看者看到字符串,而不必在本地构建期间更改它。这个问题与加密无关。

3 个答案:

答案 0 :(得分:11)

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

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

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,现在一切都运行良好。

答案 1 :(得分:2)

我通常把它们放在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

答案 2 :(得分:0)

你做不到。唯一的解决方案是不得存储在您的公共GitHub存储库中。你永远不能允许秘密的任何非公开部分......公开。

对此的解决方案是您必须将秘密存储在离您的托管更近的位置。以下是Azure Websites has built in secret protection如何与持续部署无缝集成的示例。其他云提供商有类似的结构,为自己做主机...你必须自己做。您构建了一个构建后的步骤,该步骤将从非公共位置交换秘密。

单独选项是维护包含密钥的公共仓库的私有分支。然后,您只需根据需要将公共仓库中的更新提取到您的私人仓库。但最理想的是,您希望将密钥保持在源代码控制之外。