我正在为Windows 10制作一个客户端应用程序。我有一个问题,我想开源代码,但让其他人看不到API密钥。这是我的源文件的相关部分:
private const string ApiKey = "YOUR_API_KEY";
我想将此转换为
private const string ApiKey = "THE_ACTUAL_API_KEY";
编译时。我该怎么做呢?
编辑:抱歉任何含糊之处;我问如何防止GitHub上的源代码的查看者看到字符串,而不必在本地构建期间更改它。这个问题与加密无关。
答案 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 diff
或git 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.config
或web.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如何与持续部署无缝集成的示例。其他云提供商有类似的结构,为自己做主机...你必须自己做。您构建了一个构建后的步骤,该步骤将从非公共位置交换秘密。
单独选项是维护包含密钥的公共仓库的私有分支。然后,您只需根据需要将公共仓库中的更新提取到您的私人仓库。但最理想的是,您希望将密钥保持在源代码控制之外。