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

Jae*_*aex 7 c# git api-key

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

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

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

Ed *_*ess 10

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

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

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

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

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

这是一个例子

  • 我通常使用配置文件方法并在源代码控制中包含一个`foo.config.sample`,然后可以将其复制到`foo.config`,其中实际的密钥或密码或开发人员特定的设置驻留在哪里,并且也被源忽略控制. (3认同)

Jae*_*aex 10

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

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 = "";
    ...
}
Run Code Online (Sandbox Code Playgroud)

APIKeysLocal.cs 文件:

public static partial class APIKeys
{
    static APIKeys()
    {
        ImgurClientID = "1234567890";
        ImgurClientSecret = "1234567890";
        GoogleClientID = "1234567890";
        GoogleClientSecret = "1234567890";
        PastebinKey = "1234567890";
        ...
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

cd $(ProjectDir)APIKeys\

if not exist APIKeysLocal.cs (
    type nul > APIKeysLocal.cs
)
Run Code Online (Sandbox Code Playgroud)

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