Payload 簽章
FortressFlag 送到你任何一個應用程式的每一個酬載(payload)都帶著簽章,而每個 SDK 都會在任何一個 flag 值改變之前檢查它。你不必做任何事就能得到這一點:SDK 出貨時內建正式環境的公鑰,並且預設就會驗證。這一頁說明這帶給你什麼、兩個策略設定各是什麼意思,以及你的應用程式今天信任哪些金鑰。
簽的是什麼,為什麼要簽
Section titled “簽的是什麼,為什麼要簽”當你的應用程式輪詢時,FortressFlag 用兩樣東西回答:酬載(用戶端平面上是你的裝置的 flag 值,伺服器平面上是完整的 ruleset),以及對該酬載精確位元組的一個簽章。簽章以一把只有 FortressFlag 持有的私鑰產生;你的 SDK 用隨它出貨的、與之配對的公鑰來檢查。
如果位元組在我們的伺服器和你的應用程式之間的任何地方被改過(一個代理伺服器、一個 CDN、裝置上被誰編輯過的快取檔案),檢查就會失敗,SDK 會忽略這個回應。它繼續提供它最後驗證過的值(見回退承諾),而不是信任它無法擔保的位元組。
簽章不做的兩件事,免得有人過度依賴它:
- 它不隱藏任何東西。酬載沒有加密:用戶端金鑰設計上就是公開的,針對它提供的一切也是。別把機密或你的使用者的個人資料放進規則裡。
- 它不取代 TLS。SDK 同樣透過 HTTPS 與 FortressFlag 通訊;簽章是第二道鎖,用在路徑上 TLS 涵蓋不到的部分(快取、裝置上的儲存空間)。
每個 SDK 都有一個簽章策略,帶兩個設定:
required:預設值。SDK 用它信任的金鑰驗證每一個酬載,並拒絕任何未簽章的、用它不認識的金鑰簽章的、或對不同位元組簽章的東西。在每一個與 FortressFlag 通訊的建置裡,你要的都是這個。disabled:接受未簽章的酬載。它只為一種情況存在:對著一個沒有設定簽章金鑰的本地 FortressFlag 後端執行。它是一個有名字、grep 得到的設定,而不是無聲的回退,所以「為什麼這沒有在驗證?」在你自己的原始碼裡總是找得到答案。絕對不要帶著它發布正式環境的建置。
中間沒有「警告」模式。一個酬載要嘛通過驗證,要嘛被忽略。
你的應用程式信任的金鑰
Section titled “你的應用程式信任的金鑰”FortressFlag 以每個環境一把金鑰簽章,而 SDK 出貨時只信任正式環境的金鑰。如果你對著 staging(fortressflag.net)測試,請把 staging 金鑰明確加進你的 SDK 的信任金鑰。
| 環境 | 金鑰 ID | 公鑰(base64url) |
|---|---|---|
正式環境(fortressflag.com) |
prod-2026-09-k1 |
EaEF8MHNu3onHxemTg3-OcrKrq7ODsZIVEp-IVV2ojg |
Staging(fortressflag.net) |
staging-2026-09-k1 |
RHFhzt8i3hQ4NKv_IrB92YuXmyNfDXx8eWN8cOrEBc8 |
同樣的金鑰以原始位元組的十六進位形式列出,如果你的設定要的是這種格式:
prod-2026-09-k1 11a105f0c1cdbb7a271f17a64e0dfe39cacaaeaece0ec648544a7e215576a238staging-2026-09-k1 447161cedf22de143834abff22b07dd98b979b235f0d7c7c79637c70eac405cf每把金鑰都是一個 32 位元組的 Ed25519 公鑰。金鑰 ID 是每個簽章的中間部分(ed25519:prod-2026-09-k1:…),SDK 就是靠它知道該用哪把金鑰來檢查。這些值是公開的:你可以毫無顧慮地把它們貼進設定檔或儲存庫。
當 FortressFlag 輪替金鑰時,新的公鑰先隨一個 SDK 版本出貨,而我們只在外面的 SDK 已經信任它之後才開始用它簽章。輪替永遠不會要求你在期限前發布應用程式:一個同時信任舊金鑰和新金鑰的 SDK 全程持續驗證。
如果你在 Web 上
Section titled “如果你在 Web 上”Web SDK 用你瀏覽器內建的 Web Crypto 驗證。這需要 Ed25519 支援(Safari 17+、Chrome 137+、Firefox 130+)以及一個安全上下文:https:// 頁面和 http://localhost。在一個純 http:// 頁面上,比如從區域網路位址提供的,瀏覽器根本不會提供 Web Crypto。
在瀏覽器無法驗證的地方,SDK 不會假裝它驗證了,也不會把一份好的快取丟掉。它把酬載回報為無法驗證,繼續提供它最後驗證過的值或你的程式碼的預設值,並把原因記錄一次。用 HTTPS 提供你的應用程式,這種情況就永遠不會出現。
- Flag 如何送達你的應用程式:兩個平面,以及兩者底下的回退承諾
- 金鑰:為什麼
ffc_是公開的而ffs_是機密