跳到內容

金鑰

FortressFlag 有兩種金鑰,而且它們是刻意設計成彼此相反的。知道哪個是哪個,並各自對應地看待,就是需要知道的大部分內容。

用戶端金鑰:ffc_,設計上就是公開的

Section titled “用戶端金鑰:ffc_,設計上就是公開的”

用戶端金鑰為用戶端平面進行驗證:你的 iOS、Android 和 Web 應用程式。它隨著你的應用程式的每一份副本出貨,任何拿到你的二進位檔或頁面原始碼的人都能把它讀出來。設計上就假設了這一點。一把用戶端金鑰:

  • 是唯讀的,範圍限於一個專案和一個環境
  • 只能抓取單一裝置評估後的值,永遠拿不到你的規則、另一台裝置的資料,或管理 API 的任何東西
  • 依金鑰、依裝置各自限速

所以放心把它放進你的應用程式設定。別人拿到你的用戶端金鑰能學到的,是你在一個環境裡的 flag 鍵,而那些他們本來就能從裝著金鑰的二進位檔裡讀出來。ffc_ 前綴的存在,是為了讓機密掃描器能認出它是用戶端金鑰,並且不要把任何人叫醒。

伺服器金鑰:ffs_,貨真價實的機密

Section titled “伺服器金鑰:ffs_,貨真價實的機密”

伺服器金鑰為伺服器平面進行驗證:你自己的後端下載完整的 ruleset(包含鎖定規則)進行本地評估。把它完全當成資料庫密碼來對待:

  • 存在機密管理器或環境變數裡
  • 永遠不放進用戶端程式碼、永遠不放進儲存庫、永遠不放進日誌
  • ffs_ 前綴的存在,是為了讓洩漏掃描器把它歸類為應該把人叫醒的真正機密,正好和 ffc_ 相反,這也是為什麼兩者不共用前綴

伺服器金鑰的範圍同樣限於一個專案和一個環境,同樣是唯讀,同樣碰不到管理 API。但它洩漏時的波及範圍是你的鎖定規則,而不只是 flag 鍵,因此處理方式不同。

金鑰在每個專案的 SDK 金鑰畫面管理(Admin 和 Owner 可以鑄造和撤銷;Developer 可以檢視清單):

  • 鑄造會建立一把綁定於一個專案 + 環境的金鑰。完整的金鑰只會在鑄造當下顯示一次,當時就要複製,因為之後清單只會顯示足以辨認它的部分。沒有「再次顯示金鑰」這回事:一把可以再次顯示的金鑰,就是一把以可被竊取的形式儲存的金鑰。
  • 撤銷在金鑰下一次被使用時生效:不用發布應用程式、不用部署。而且在壓力下做也是安全的:持有已撤銷金鑰的 SDK 會回退到它們的快取,而不是壞掉。

每個環境同時有好幾把有效的金鑰是合法的,而這正是輪替的配方:鑄造新金鑰,把它推送到你的應用程式或伺服器,然後撤銷舊的。沒有停機、flag 供應沒有空窗,而兩把金鑰同時有效的窗口由你掌控。