2014-02-14 69 views
5

在我的C#項目中有APIKeys.cs文件,其中包含具有API密鑰的常量字符串。 我希望這些字符串在Git服務器中爲空,但在本地計算機中有實際的API密鑰。 因此,拉動項目的人們可以毫無問題地編譯它,而我的本地計算機仍然會在同一個文件中使用API​​密鑰。正確的方法來隱藏Git中的API密鑰

如果我嘗試上傳帶有空字符串的APIKeys.cs文件,那麼我無法使用API​​密鑰獲取本地文件,因爲當我嘗試推送它時,它將覆蓋空的APIKeys.cs文件。我也不能忽略這個文件,因爲它會從Git服務器中刪除空的APIKeys.cs文件。

那麼什麼是最好的自動化方法,這個問題將允許服務器中的空字符串的類文件,所以當人們拉它並在本地計算機上有真實的類文件時項目將可編譯?

+0

不幸的是,沒有自動的方式來做到這一點(我知道)。每次提交時,您可能只需從暫存區域刪除文件。 –

回答

7

我想出現在另一種解決方案是不完美的,但還是不夠好對我來說,例如:

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"; 
     ... 
    } 
} 

忽略APIKeysLocal.cs文件Git和沒有這個文件的人如果從解決方案exp中刪除這個文件,仍然可以編譯項目lorer。

如果尚未存在,它使用項目前期建設情況我還自動創建空APIKeysLocal.cs文件:

cd $(ProjectDir)APIKeys\ 

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

這樣,用戶不需要做任何能夠編譯項目。

9

接受您無法在公共空間隱藏未加密的私鑰。

你可以做的是將密鑰移到私有空間,然後從代碼引用該私有空間。

您的私人空間可能是環境變量或Windows註冊表,它應該是您的應用程序源代碼之外的東西。

另一種方法是創建專門用於存儲私鑰的新配置文件(例如keys.config),然後從源代碼管理中排除此文件。

這意味着您不共享您的私鑰,但這也意味着您需要記錄(可能在readme.md中)用戶需要重新創建自己的keys.config。更好的(感謝@Joey)是在解決方案中包含示例配置文件(keys.sample.config),說明需要什麼。

Here is an example

+2

我通常使用配置文件的方法,並在源代碼控制中包含一個'foo.config.sample',然後可以將其複製到'foo.config',其中實際的鍵或密碼或開發人員特定的設置駐留在源代碼管理。 – Joey

+0

一個空的keys.config是一個壞主意,因爲更改將不會再次進入源代碼管理:-)。 – Joey

+0

我知道我不能隱藏密鑰,但API服務所有者有規則不公開共享密鑰,所以即使它很容易反編譯並在C#應用程序中看到它們,我仍然必須隱藏他們在Git中。我不認爲在註冊表中存儲30個不同的上傳API密鑰是個好主意。 – Jaex

3

你有兩個選擇:

  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 
    
+0

我試過假設 - 不變,它工作完美。當我拉,Git不會覆蓋我的api密鑰文件與空的一個,我不能推我的API密鑰服務器覆蓋空文件,所以它正是我想要的。但是,如果一個開發人員忘記假設 - 不變,那麼該人可能會不小心推動問題的API鍵。但我不認爲我能找到比假設更好的解決方案 - 不變。 – Jaex

+0

@Jaex,是的,這對於'--assume-unchanged'是一個真正的風險。我提出的另一種方法是[Ed Guiness](http://stackoverflow.com/users/4200/ed-guiness)[和[回傳](http://stackoverflow.com/a/21775224/354577)喬伊](http://stackoverflow.com/users/73070/73070),實際上是我的首選方法。 – Chris

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。