跳转到内容

密钥

FortressFlag 有两种密钥,而且它们是故意做成对立面的。知道哪个是哪个——并相应地对待每一个——就是要知道的东西的大部分了。

客户端密钥:ffc_——设计上公开

Section titled “客户端密钥:ffc_——设计上公开”

客户端密钥为客户端平面做身份验证:你的 iOS、Android 和 Web 应用。它随你的应用的每一份副本一起发布,任何拿到你的二进制或页面源码的人都能把它读出来。设计上就假定了这一点。一个客户端密钥:

  • 是只读的,作用范围是一个项目和一个环境
  • 只能获取单台设备评估后的值——永远拿不到你的规则、拿不到另一台设备的数据、拿不到管理 API 里的任何东西
  • 按密钥和按设备限速

所以,放心地把它放进你的应用配置里。一个人拿到你的客户端密钥能学到的,是你在一个环境里的 flag key——而这些他本来就能从密钥所在的那个二进制里读出来。ffc_ 前缀的存在,是为了让机密扫描器能把它识别为客户端密钥,从而不把任何人叫醒。

服务器密钥:ffs_——真正的机密

Section titled “服务器密钥:ffs_——真正的机密”

服务器密钥为服务端平面做身份验证:你自己的后端下载完整的 ruleset——包括定向规则——用于本地评估。像对待数据库密码一样对待它:

  • 存在机密管理器或环境变量里
  • 绝不放进客户端代码,绝不放进仓库,绝不放进日志
  • ffs_ 前缀的存在,是为了让泄露扫描器把它归类为应该把人叫醒的真正机密——与 ffc_ 恰恰相反,这也是为什么两者不共用前缀

服务器密钥同样作用于一个项目和一个环境,同样只读,同样无法触及管理 API。但它泄露时的影响范围是你的定向规则,而不只是你的 flag key——因此处理方式不同。

密钥在每个项目的 SDK 密钥页面管理(Admin 和 Owner 可以签发和吊销;Developer 可以查看列表):

  • 签发创建一个绑定到一个项目 + 环境的密钥。完整的密钥在签发时只显示一次——当时就复制它,因为之后列表里只显示足够辨认它的部分。没有“再次显示密钥”这回事:一个能被再次显示的密钥,就是一个以可被窃取的形式存储着的密钥。
  • 吊销在密钥下一次被使用时生效——不需要发版,不需要部署。而且在压力之下这样做是安全的:持有已吊销密钥的 SDK 会回退到它们的缓存,而不是坏掉。

每个环境同时存在多个有效密钥是合法的,而这就是轮换的配方:签发新密钥,把它推到你的应用或服务器上,然后吊销旧的。没有停机,没有 flag 服务的空档,而两个密钥同时有效的那段窗口由你来控制。