Skip to main content

不用相信我們:零知識證明與公開名冊

前面幾篇我一直說:連政府都查不出你是誰,而且不需要相信我們。這兩件事聽起來矛盾:什麼都不公開,大家怎麼確定我們沒有作弊?什麼都公開,隱私又在哪裡?

讓這兩件事同時成立的,是一種密碼學技術,叫做零知識證明(zero-knowledge proof)。它在區塊鏈上已經被大量使用,例如 Zcash 用它做不公開金額和對象的轉帳。我們使用的這套工具,來自以太坊基金會的研究團隊。

零知識證明是什麼​

想像你要證明自己有一把能打開某扇門的鑰匙。零知識證明做的事是:讓對方確定你有這把鑰匙,但你不用交出鑰匙,也不用告訴他門牌號碼。

用在人類的證明上,你證明的是一件事:

我是一張合法、有效的自然人憑證的持有者。

除此之外什麼都不透露。姓名、身分證字號、卡片序號都不會送出去;檢查證明的人只知道「這是一張內政部發的、沒有被廢止的自然人憑證」。證明是在你自己的電腦上算出來的,憑證不會離開你的電腦。

姓名、身分證字號、卡片序號留在你的電腦裡;送出去的只有「合法、有效的自然人憑證持有者」、這個平台的代號和要綁定的帳號

名冊公開什麼​

每完成一次驗證,我們就在公開名冊上記下一筆:

  • 代號:這張卡在這個平台的代號。
  • 證明:上面那份零知識證明,任何人都能拿去重新檢查。
  • 綁定的帳號:例如某個 Threads 帳號。
  • 驗證時間。

名冊上沒有姓名、身分證字號、卡片序號,以及憑證本身。這像選舉的開票:選票上沒有名字,但任何人都能到開票所看唱票、自己記票數。

任何人都能自己檢查​

證明和名冊都是公開的,所以你不需要相信我們,可以自己檢查四件事:

  1. 每一份證明都是真的。 拿名冊上的證明重新驗算,就知道它是不是一張有效的自然人憑證簽的。
  2. 一張卡在一個平台只綁一個帳號。 每個代號在同一個平台只會出現一次。我們偷偷讓同一張卡綁第二個帳號,名冊上就會出現重複的代號。
  3. 證明綁的就是這個帳號。 卡片當場簽的那段文字裡寫著要綁哪個帳號,我們沒辦法把一份合法的證明貼到另一個帳號旁邊。
  4. 歷史沒有被偷改。 名冊只能新增、不能修改。我們事後刪掉或改掉某一筆,保存過舊版名冊的人一比對就會發現。

任何人都能串接​

名冊之上,我們提供一個查詢服務。例如有人問「Threads 帳號 @xxx 有沒有驗證過?」,它會回答:有,驗證時間和到期時間是什麼,證明放在這裡,你可以自己檢查。

你插卡在瀏覽器產生證明,我們檢查後寫進公開名冊,查詢服務提供給一般人、外掛、民調、記者和 Bluesky;任何人也能下載整份名冊自己重算

會用到它的人很多:

  • 一般人:打開查詢頁,或點對方個人簡介裡的徽章連結。
  • 瀏覽器外掛、動態牆、標籤服務:標出哪些帳號是驗證過的真人,或讓真人的留言排前面。
  • 民調、售票、論壇:只讓驗證過的帳號投票、搶票或發文,一人一份。
  • 記者和事實查核組織:分析一則爆紅貼文的讚,有多少來自驗證帳號。
  • Bluesky:同一份名冊可以直接變成 Bluesky 上的標籤,訂閱就看得到,不用另外裝外掛。

名冊記的是每一次的動作:綁定、續期、轉移、作廢。舊的紀錄不會被改掉,只會一筆一筆往下記,像存摺一樣(軟體工程裡叫 event sourcing)。查詢服務把這些動作依序串起來,算出一個帳號現在的狀態。

名冊像存摺一樣只往下記:綁定、續期、轉移三筆紀錄,依序算出 @alice_new 有徽章、@alice 沒有徽章

算的規則是公開的。你連查詢服務都不想相信的話,可以下載整份名冊,照著規則從頭重算,會得到一樣的答案。

就算被駭了,也沒有東西可以偷​

很多需要驗證身分的服務,會要你上傳證件照片再存起來。這種資料庫一旦被駭,傷害是永久的:密碼可以改,身分證字號和臉不能換。2025 年 10 月,Discord 一家負責客服的外包廠商被駭,大約 7 萬名用戶為了驗證年齡上傳的證件照片可能外洩。

人類的證明沒有這種資料庫。姓名、身分證字號、卡片序號從來沒有離開你的電腦;名冊上的東西本來就是公開的;我們也不保留你的 Threads 登入權限。伺服器被駭,駭客能拿到的只有任何人都能下載的那份名冊。

唯一的例外,是能讓你的卡簽名的人,這點〈它幫不了誰〉會講。