在 git repo 中保護 API Key 的方法

在串接各種網路服務的時候,我們會拿到許許多多的 key/token,即使只是要寄個信也需要帳號密碼,不過這些敏感性的資料,極端不建議提交到 repo 中,誰知道那天這些 repo hoster 會不會被攻破,讓 token 被人看光,更別提有些本來就想要 open source 出來的 project。

如果 project 是跑在 server 上的 service,那最好把這些 key 設定為系統的環境變數,然後在 code 裡面讀出來,例如這篇文章中用的方式。

不過裝在使用者電腦上執行的程式就不能用這個方法,必須要把這些 key 寫到 code 中一起編譯,但是又不想把這些資訊一起放到 repo 中,要怎麼做呢?我的目標要做到:

  1. key 不能存到 repo 中
  2. 不要在 git add 的時候一直跳出來讓我有機會把 key 存到 repo 裡面
  3. clone repo 之後不要缺檔案還需要另外手動加

首先,新增一個標頭檔,專門儲存這些 key,例如建立一個 keys.h 檔案如下:

#define SecretKey ""

CVT2HUGO: keys.h

然後在要用到 key 的地方匯入來用

#import "keys.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [Service setApplicationKey:@SecretKey];
    ...
    return YES;
}

CVT2HUGO: AppDelegate.m

然後將 keys.h commit 到 git repo 中,然後下一個 git 指令 git update-index --assume-unchanged keys.h,這樣之後對 keys.h 的任何修改都不會被 git 追蹤。因此接下來只要在 keys.h 中填入真正的 key,整個設定就完成了。

之前聽到的另外一個方法是將 keys.h 加入 .gitignore 中,但是如果從一開始就沒有把 keys.h 加入 repo 中的話,在 clone project 的時候 keys.h 會完全不存在,還是要另外提供範本。如果加入 repo 後再修改 .gitignore,在填入真正的 key 之後,git 還是會追蹤到檔案有修改,一不小心還是很容易把 key 送到 repo 中。

如果日後有需要新增 key 到 keys.h 中,可以先把已經設定的 key 清空,然後下相反的指令 git update-index --no-assume-unchanged keys.h,這樣檔案就重新被 git 追蹤。然後加入要新增的 key,commit 之後,一樣重新下 git update-index --assume-unchanged keys.h,最後再把 key 填回去。

Contents

comments powered by Disqus