BlindPost BlindPost ← 所有文章
English简体中文繁體中文

用戶端怎麼知道群組裡誰有什麼權力

一個 10 萬人的群組。有人發出一條管理信令:「移除使用者 X」。

你的用戶端憑什麼決定要不要相信這條信令?

大多數 messenger 的答案是查一張表 —— 伺服器的、本機的、或者兩邊的。WhatsApp 的伺服器查群組成員表。Telegram bot framework 問伺服器「這個人是管理員嗎」。Discord 本機快取一份角色表,相信快取。歸根到底就是「伺服器記得 + 用戶端快取伺服器說過的」。

BlindPost 的答案不一樣。我們的伺服器不知道任何群組裡誰是管理員,因為我們沒有「角色」這張表。你的用戶端也不查自己本機資料庫去驗證。信令自己帶著證明走。任何發出管理動作的人,都附帶一條密碼學鏈,任何持有這個群組公開識別符的人都可以端到端驗證它 —— 不用問任何其他來源。

下面用標準密碼學的層面,講清楚這條鏈怎麼搭。

三層角色

BlindPost 裡每條群組操作都由這三層之一簽發:

整個角色模型就這三層。沒有表、沒有名單、沒有任何資料庫裡的「角色」欄位。每一層的權威建立方式都是同一個範式:證明自己持有某把私鑰

群主信令怎麼自證

群主發出一個動作(踢人、改設定、輪換金鑰)的時候,把動作 payload 用群組的 Ed25519 身分私鑰簽名。

接收方驗證就一步:

  1. 取出群組的公開識別符 —— 也就是這同一對金鑰的公鑰半。這個公鑰你加入群組的時候就已經有了
  2. 用這個公鑰驗信令上的簽名。

簽名能過 → 這條動作就出自持有群組私鑰的人 —— 按定義就是群主沒有伺服器往返。沒有本機資料庫查詢。 驗證方所需要的一切,要麼在信令裡(簽名 + payload),要麼在它自己加入群組時就已經有的公開識別符裡。

管理員信令怎麼自證:兩步簽名鏈

管理員這層更有意思,因為管理員是被授權出來的。管理員有自己的一對金鑰(我們叫它 admin keypair),群主在某個時刻「宣布過這把 admin 公鑰被授權」。

這個「宣布」本身就是一次簽名:群主用群組身分私鑰,對 admin 的公鑰簽了一次。後來 admin 真的發動作的時候,用 admin 私鑰對 payload 簽名。接收方收到的是:信令 + admin 對它的簽名 + admin 的公鑰(連同群主對這把 admin 公鑰的簽名)一起打包。

驗證兩步:

  1. 驗證 admin 對 payload 的簽名,用 admin 公鑰。
  2. 驗證群主對 admin 公鑰的授權簽名,用群組的公開識別符。

兩步都過 → 這條動作出自被群主授權過的人。完事。還是沒有資料庫。還是沒有伺服器。

這其實就是 TLS 憑證鏈的同款模式 —— 葉子憑證 + 根憑證,葉子由根簽發,根公開可信 —— 只是搬到了群組治理上。

成員信令怎麼自證:它存在,就證明了自己

成員級信令的證明最優雅:如果你成功解開了這條信令,那傳送方就是個成員。 任何沒拿到群組加密金鑰的人,根本造不出一段能在這把金鑰下正確解密的密文。「成員身分」塌縮成「持有金鑰」

對於需要明確歸屬的動作(投票裡誰投了什麼、訊息上誰加了哪個 reaction),信令裡額外帶上成員的身分公鑰和簽名,接收方做一次驗證。但對於不需要明確歸屬的動作,這一步都省了 —— 能解密本身就是證明

「踢人」實際上是金鑰輪換

整套架構的題眼:當你從 BlindPost 群組裡移除一個管理員或成員時,沒有任何「成員表」被改動 —— 因為根本沒有那張表。實際發生的是:群組的內容加密金鑰被輪換,被踢的人不在新金鑰的分發名單裡

他的舊金鑰還能解他之前已經收到的訊息。但解不了輪換之後發的任何新訊息。密碼學邊界移動,社會結構跟著對齊。撤銷管理員也是同款:那條舊的授權簽名在數學上永遠有效,只是它不再 matter —— 那個被撤的 admin 沒辦法再參與加密 channel 了。

你不需要相信什麼

要在 BlindPost 群組裡評估一條管理信令,你不需要相信:

你只需要相信數學,以及你已經在的那個群組的公開識別符(既然你在群組裡,你顯然有這個識別符)。剩下的事,信令自己帶著證明走

我們的標語是「伺服器是盲的」。這是補齊的另外一半:用戶端也不需要全知全能。密碼學授權透過網路傳播,沒有人需要去查任何表 —— 任何地方都不查

立即體驗 BlindPost