信任

Gateway 可以完成呼叫,但讀不了已封存的 Payload。

工具參數、上游回應,以及交回給 Agent 的結果,共用一個 AES-256-GCM 信封。資料金鑰以 ML-KEM-1024 封給 Saturn 不持有的公鑰。

閱讀白皮書

三層保護,彼此分開。

密碼、成員私鑰與工具 Payload 不共用同一把秘密。

01

登入

瀏覽器先把密碼雜湊再送出。Saturn 再用 PBKDF2 雜湊一次,不保存密碼本身。

02

成員私鑰

另一把只在瀏覽器衍生的金鑰包住 ML-KEM 私鑰。登入用的雜湊解不開它。

03

工具 Payload

一把隨機的 AES-256-GCM 資料金鑰加密請求與回應。ML-KEM-1024 再把這把金鑰封給組織與每位成員。Saturn 隨即丟棄資料金鑰。

04

上游憑證

Access token 與 client secret 用 Gateway 自己的 ML-KEM-1024 金鑰封存,已授權的呼叫才能完成。Agent 拿不到密鑰。

一整筆呼叫,一個信封。

這些欄位一起封存。演算法是 ML-KEM-1024-HKDF-SHA384-AES-256-GCM。

參數

Agent 隨工具呼叫送出的參數。

上游請求

Saturn 轉送給工具的請求。

上游回應

工具回來的原始內容。

下游結果

Saturn 交回給 Agent 的結果。

Saturn 打得開與打不開的東西。

Saturn 打不開

  • 組織或成員的私鑰
  • 復原金鑰
  • 密碼,以及用來包成員私鑰的那把金鑰
  • 已封存的工具 Payload

Saturn 打得開

  • 誰呼叫、哪個工具、政策版本,以及決策
  • 上游憑證,且只在一筆已授權呼叫進行的期間
  • 主控台 API 只回報密鑰是否存在,不回報內容

常見問題

Saturn 能解密審計 Payload 嗎?
不能。資料金鑰封給組織與成員的公鑰後即被丟棄。經授權的成員登入後,在瀏覽器裡解密。
登入密碼會在伺服器上解開私鑰嗎?
不會。登入送出的是雜湊。私鑰用另一把從不離開瀏覽器的金鑰包裝。
Agent 看得到 API Key 或 OAuth Token 嗎?
看不到。這些密鑰留在憑證金庫。Agent 只拿得到一筆經授權呼叫的結果。
組織還沒有 Payload 金鑰呢?
新的工具內容不會被保存。審計列只標示尚未加密,不寫入明文。

白皮書

Saturn 如何封存金鑰、Payload 與憑證

2026 年 10 月 16 日

本文件說明 Saturn MCP 在登入、成員金鑰、工具 Payload 與上游憑證上使用的密碼學。

範圍

Saturn 位於 AI Agent 與它獲准呼叫的 MCP Server 之間。Gateway 驗證呼叫者、評估政策、轉送已核准的呼叫,並寫下一筆審計紀錄。本文件涵蓋支撐這項工作的四條密碼學路徑:登入驗證值、成員私鑰、工具 Payload 信封,以及上游憑證金庫。

以下描述對應產品裡實際運行的機制。本文件不陳述認證、第三方稽核,或軟體沒有實作的控制措施。

角色

  • Agent 透過 Saturn MCP 呼叫工具,並收到一筆已授權呼叫的結果。
  • Gateway 評估呼叫,在政策允許時用上游憑證完成呼叫,並封存 Payload。
  • 成員在瀏覽器持有 ML-KEM-1024 解封裝金鑰,登入後打開已封存的 Payload。
  • 組織有一把 ML-KEM-1024 封裝公鑰。對應的私鑰只存在於復原備份與成員備份之中。

登入

密碼在請求離開頁面之前,先由瀏覽器雜湊。瀏覽器對標籤 saturn-login-v1、一個換行,以及密碼計算 SHA-256,再送出前綴 v1. 與 64 個小寫十六進位字元。註冊、重設密碼、變更密碼、重新驗證、接受邀請,以及 OAuth 登入表單,都使用同一個驗證值。

Gateway 保存的是這串十六進位的 PBKDF2-HMAC-SHA256:210,000 次迭代、16 位元組隨機鹽,格式為 pbkdf2_sha256$210000$salt$digest。仍以明文密碼送出的呼叫者(例如營運種子帳號)會先套用同一個帶標籤的 SHA-256,再做 PBKDF2,因此存檔的驗證值與瀏覽器一致。

登入驗證值與成員金鑰的包裝金鑰以標籤分開。登入所保存的字串是第二層雜湊的輸入,與包裝成員私鑰的材料是兩個不同的值。

成員私鑰

Payload 金鑰為 ML-KEM-1024(FIPS 203)。封裝公鑰為 1,568 位元組。備份所記錄的私鑰是 64 位元組種子。瀏覽器把這顆種子展開成解封裝金鑰。Gateway 保存封裝公鑰與加密備份,不以明文保存種子。

成員備份在瀏覽器裡用密碼建立。包裝材料是標籤 saturn-member-wrap-v1、一個換行與密碼的 SHA-256。PBKDF2-HMAC-SHA256 再對該摘要與隨機鹽迭代 600,000 次,並以 AES-256-GCM 加密種子。附加資料是 password、換行與使用者 id。登入驗證值無法通過這次解密。

組織復原備份使用建立組織金鑰時顯示的復原金鑰。HKDF-SHA256 以 info saturn-recovery-v1 衍生 AES-256-GCM 金鑰。附加資料是 recovery、組織 id 與金鑰版本。復原金鑰不存放在 Gateway。

Payload 信封

組織已有 Payload 金鑰時,一筆審計事件產生一個信封。一起封存的欄位是工具參數、上游請求、上游回應、Gateway 結果,以及交回給 Agent 的結果。等待核准的參數使用同一種包裝,並標示 org-mlkem1024-v1。

Gateway 抽取 32 位元組隨機資料金鑰,以 AES-256-GCM 加密正規化 JSON。附加資料是組織 id、紀錄 id、Payload 類型與格式版本,以換行分隔。格式版本為 1。密文含 16 位元組驗證標籤。同一份正規化 JSON 的 SHA-256 與密文一起保存。

資料金鑰再封給組織封裝公鑰與每位成員的封裝公鑰。ML-KEM-1024 封裝產生 32 位元組共享秘密與 1,568 位元組密文。HKDF-SHA384 把共享秘密變成 32 位元組 AES 金鑰。鹽為空,亦即 HKDF-SHA384 所規定的 48 個零位元組;info 為 saturn-payload-mlkem1024-v1。信封上的演算法名稱是 ML-KEM-1024-HKDF-SHA384-AES-256-GCM。

每一份包裝依序是版本位元組 0x02、KEM 密文、12 位元組 nonce,以及資料金鑰的 AES-256-GCM 密文。所有包裝寫入後,Gateway 刪除資料金鑰。成員在瀏覽器以解封裝金鑰打開包裝、核對內容雜湊,並在瀏覽器裡閱讀 Payload。

長度不是 1,568 位元組的公鑰會被略過。若沒有可用的 ML-KEM 金鑰,Gateway 不寫入工具內容。審計列標示加密不可用。

上游憑證

Access token 與 client secret 使用另一把屬於 Gateway 的 ML-KEM-1024 金鑰。種子是一把固定的 64 位元組金鑰。每筆密鑰封成前綴 pq1.,接著是 ML-KEM-1024 封裝、info 為 saturn-credential-aes-256-gcm-v1 的 HKDF-SHA384,以及 AES-256-GCM。

Gateway 在一筆已授權呼叫進行期間打開該密鑰,再用於上游。主控台 API 回報密鑰是否存在。Agent 收到的是呼叫結果。這把金庫金鑰與組織 Payload 金鑰是兩把金鑰:Gateway 完成呼叫,成員打開已封存的審計 Payload。

審計紀錄

保持可讀的那一列寫下呼叫者、工具、政策版本與決策,以及加密狀態與內容雜湊。被封住的本文就是上述信封。經授權的成員在瀏覽器解開成員金鑰之後,於本地解密。

邊界

  • 封給較早 X25519 金鑰的信封維持密封。組織需建立新的 ML-KEM-1024 Payload 金鑰。
  • 在帶標籤的登入雜湊之前、以明文密碼建立的驗證值,需先重設密碼,該帳號才能用目前的用戶端登入。
  • 能讀取 Gateway 憑證種子的人可以打開上游密鑰。這顆種子的用途是讓 Gateway 完成已授權的呼叫。
  • 持有密碼與密碼備份的成員可以打開自己的私鑰,以及封給該金鑰的 Payload。
  • 成員備份與組織復原金鑰同時遺失時,那些 Payload 維持密封。

用你自己的工具看一次。

接上一台 MCP Server,再到瀏覽器打開一筆加密的審計紀錄。