在Git中隐藏API密钥的正确方法

时间:2014-02-14 08:58:27

标签: c# git api-key

在我的C#项目中有APIKeys.cs文件,其中包含带有API密钥的const字符串。 我希望这些字符串在Git服务器中是空的,但在我的本地计算机中有实际的API密钥。 因此,拉动项目的人可以毫无问题地编译它,并且我的本地计算机仍然可以在同一个文件中使用API​​密钥。

如果我尝试上传带有空字符串的APIKeys.cs文件,那么我就不能拥有带有API密钥的本地文件,因为当我尝试推送它时,它会覆盖空的APIKeys.cs文件。此外,我也不能忽略此文件,因为它将从Git服务器中删除空的APIKeys.cs文件。

那么这个问题的最佳自动化方法是什么,它允许在服务器中使用空字符串的类文件,所以当人们拉出它并在本地计算机上有真正的类文件时,项目是可编译的?

4 个答案:

答案 0 :(得分:10)

接受您无法在公共空间中隐藏未加密的私钥。

您可以做的是将密钥移动到私有空间,然后从代码中引用该私有空间。

您的私人空间可能是环境变量或Windows注册表,它应该是您应用源代码之外的内容。

另一种方法是创建一个专门用于存储私钥的新配置文件(例如keys.config),然后从源代码控制中排除此文件。

这意味着您不共享您的私钥,但这也意味着您需要记录(可能在readme.md中)用户需要重新创建自己的keys.config。更好(感谢@Joey)是在解决方案中包含一个示例配置文件(keys.sample.config),说明需要什么。

Here is an example

答案 1 :(得分:8)

我现在想出另一种解决方案,这种解决方案并不完美,但对我来说仍然足够好,例如:

APIKeys.cs档案:

public static partial class APIKeys
{
    public static readonly string ImgurClientID = "";
    public static readonly string ImgurClientSecret = "";
    public static readonly string GoogleClientID = "";
    public static readonly string GoogleClientSecret = "";
    public static readonly string PastebinKey = "";
    ...
}

APIKeysLocal.cs档案:

public static partial class APIKeys
{
    static APIKeys()
    {
        ImgurClientID = "1234567890";
        ImgurClientSecret = "1234567890";
        GoogleClientID = "1234567890";
        GoogleClientSecret = "1234567890";
        PastebinKey = "1234567890";
        ...
     }
}

忽略Git中的APIKeysLocal.cs文件,如果从解决方案资源管理器中删除此文件,那么没有此文件的人仍然可以编译项目。

如果使用项目预构建事件尚未存在,我还会自动创建空APIKeysLocal.cs文件:

cd $(ProjectDir)APIKeys\

if not exist APIKeysLocal.cs (
    type nul > APIKeysLocal.cs
)

这样用户无需做任何事情就可以编译项目。

答案 2 :(得分:4)

您有两种选择:

  1. 告诉Git忽略对本地计算机上APIKeys.cs的更改:

    git update-index --skip-worktree APIKeys.cs
    

    这将导致本地更改不会被提交。如果您想要提交对文件的更改,则必须使用--no-skip-worktree标记撤消此操作。

  2. APIKeys.cs文件重命名为APIKeys.template.cs,包含您要共享的空字符串。将此文件保留在存储库中。将该文件复制到APIKeys.cs。将APIKeys.cs添加到.gitignore。添加复制模板文件的说明,并使用本地设置进行修改。

    git mv APIKeys.cs APIKeys.template.cs
    $EDITOR APIKeys.template.cs
    git commit
    cat APIKeys.cs >> .gitignore
    cp APIKeys.template.cs APIKeys.cs
    

答案 3 :(得分:1)

这与将构建号注入组件的问题非常相似吗?我这样做的方法是有一个预构建步骤,根据一些环境变量生成一个名为AssemblyVersionInfo.cs的文件。您可以使用API​​密钥执行相同的操作。

在编译API密钥的组件的预构建步骤中,输入如下内容: -

if not defined API_KEY set API_KEY=DEFAULT_KEY
echo public class ApiKeys>"$(SolutionDir)src\ApiKeys.cs"
echo {>>"$(SolutionDir)src\ApiKeys.cs"
echo public const string Key="%API_KEY%";>>"$(SolutionDir)src\ApiKeys.cs"
echo }>>"$(SolutionDir)src\ApiKeys.cs"

然后在本地计算机上设置用户或系统环境变量,其中包含真实密钥。

setx API_KEY THE_REAL_KEY

要避免Git想要提交文件,只需将其添加到.gitignore。