如何安全地将 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 diff
或git 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.config
或 web.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 存储库拉到您的私人存储库。但最佳情况下,您希望密钥不受源代码控制。
我正在为 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 diff
或git 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.config
或 web.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 存储库拉到您的私人存储库。但最佳情况下,您希望密钥不受源代码控制。