不用相信我們:零知識證明與公開名冊
前面幾篇我一直說:連政府都查不出你是誰,而且不需要相信我們。這兩件事聽起來矛盾:什麼都不公開,大家怎麼確定我們沒有作弊?什麼都公開,隱私又在哪裡?
讓這兩件事同時成立的 ,是一種密碼學技術,叫做零知識證明(zero-knowledge proof)。它在區塊鏈上已經被大量使用,例如 Zcash 用它做不公開金額和對象的轉帳。我們使用的這套工具,來自以太坊基金會的研究團隊。
零知識證明是什麼
想像你要證明自己有一把能打開某扇門的鑰匙。零知識證明做的事是:讓對方確定你有這把鑰匙,但你不用交出鑰匙,也不用告訴他門牌號碼。
用在人類的證明上,你證明的是一件事:
我是一張合法、有效的自然人憑證的持有者。
除此之外什麼都不透露。姓名、身分證字號、卡片序號都不會送出去;檢查證明的人只知道「這是一張內政部發的、沒有被廢止的自然人憑證」。證明是在你自己的電腦上算出來的,憑證不會離開你的電腦。
名冊公開什麼
每完成一次驗證,我們就在公開名冊上記下一筆:
- 代號:這張卡在這個平台的代號。
- 證明:上面那份零知識證明,任何人都能拿去重新檢查。
- 綁定的帳號:例如某個 Threads 帳號。
- 驗證時間。
名冊上沒有姓名、身分證字號、卡片序號,以及憑證本身。這像選舉的開票:選票上沒有名字,但任何人都能到開票所看唱票、自己記票數。
任何人都能自己檢查
證明和名冊都是公開的,所以你不需要相信我們,可以自己檢查四件事:
- 每一份證明都是真的。 拿名冊上的證明重新驗算,就知道它是不是一張有效的自然人憑證簽的。
- 一張卡在一個平台只綁一個帳號。 每個代號在同一個平台只會出現一次。我們偷偷讓同一張卡綁第二個帳號,名冊上就會出現重複的代號。
- 證明綁的就是這個帳號。 卡片當場簽的那段文字裡寫著要綁哪個帳號,我們沒辦法把一份合法的證明貼到另一個帳號旁邊。
- 歷史沒有被偷改。 名冊只能新增、不能修改。我們事後刪掉或改掉某一筆,保存過舊版名冊的人一比對就會發現。
任何人都能串接
名冊之上,我們提供一個查詢服務。例如有人問「Threads 帳號 @xxx 有沒有驗證過?」,它會回答:有,驗證時間和到期時間是什麼,證明放在這裡,你可以自己檢查。
會用到它的人很多:
- 一般人:打開查詢頁,或點對方個人簡介裡的徽章連結。
- 瀏覽器外掛、動態牆、標籤服務:標出哪些帳號是驗證過的真人,或讓真人的留言排前面。
- 民調、售票、論壇:只讓驗證過的帳號投票、搶票或發文,一人一份。
- 記者和事實查核組織:分析一則爆紅貼文的讚,有多少來自驗證帳號。
- Bluesky:同一份名冊可以直接變成 Bluesky 上的標籤,訂閱就看得到,不用另外裝外掛。
名冊記的是每一次的動作:綁定、續期、轉移、作廢。舊的紀錄不會被改掉,只會一筆一筆往下記,像存摺一樣(軟體工程裡叫 event sourcing)。查詢服務把這些動作依序串起來,算出一個帳號現在的狀態。
算的規則是公開的。你連查詢服務都不想相信的話,可以下載整份名冊,照著規則從頭重算,會得到一樣的答案。
就算被駭了,也沒有東西可以偷
很多需要驗證身分的服務,會要你上傳證件照片再存起來。這種資料庫一旦被駭,傷害是永久的:密碼可以改,身分證字號和臉不能換。2025 年 10 月,Discord 一家負責客服的外包廠商被駭,大約 7 萬名用戶為了驗證年齡上傳的證件照片可能外洩。
人類的證明沒有這種資料庫。姓名、身分證字號、卡片序號從來沒有離開你的電腦;名冊上的東西本來就是公開的;我們也不保留你的 Threads 登入權限。伺服器被駭,駭客能拿到的只有任何人都能下載的那份名冊。
唯一的例外,是能讓你的卡簽名的人,這點〈它幫不了誰〉會講。