你買了一台新手機。你想把 messaging app 搬過去,帶上聊天紀錄、聯絡人、群組,所有東西。
如果你用 WhatsApp:在新手機上裝好 → 輸手機號 → 收簡訊 → app 從 Meta 的伺服器把你的帳號歷史(以及越來越多的端到端加密訊息)拉下來。你的資料在遷移過程中繞了一遍第三方 —— 傳輸是加密的,但 metadata(什麼時候上傳、多大、是哪個帳號)暴露,而那個加密 blob 在他們的雲上停留你完成設定所需要的整段時間。
如果你用 Signal:體驗更友好一些 —— 掃 QR code 綁定新手機,新裝置透過 Signal 的中繼跟舊裝置認證。舊訊息預設不遷移;想要的話走另一個獨立的備份-還原流程,用一組單獨生成的口令。
BlindPost 跟兩者都不一樣。你的新手機和舊手機直接透過本機 Wi-Fi 連線,建立一條封死的端到端加密通道,它們之間互傳你的帳號材料。我們的伺服器全程看不到遷移這件事發生。你的身分、金鑰、聊天歷史,沒有任何一位元組經過我們的基礎設施。
下面講講這是怎麼做到的。
資料走的那條路
- 同一個網路。兩台手機要在同一區域網路 —— 家裡 Wi-Fi、手機熱點,任何能讓兩台裝置直接互通的地方都行。(不能跨網際網路遷移。遷移設計上就是「手對手」操作:兩台手機你都得在場。)
- QR 握手。新手機顯示一個 QR code,裡面是一次性的握手資料。舊手機掃一下。兩台裝置用剛剛交換的內容,在它們之間臨時建立一條封死的端到端加密通道 —— 這次遷移專用的金鑰,跟你的帳號金鑰獨立,用一次就丟。
- 預檢 (preflight check)。帳號材料開始轉移之前,兩台用戶端做一系列短的驗證 —— 確認它們確實能看到對方、確認沒有第三方插進來、確認新裝置狀態準備好接收。任何一步看起來不對,遷移在資料動之前就中止。
- 封閉通道傳輸。你的身分金鑰、當前和歷史 prekey、你所在每一個群組的群金鑰、本機聊天歷史,全部在這條點對點通道裡從舊手機流向新手機。用剛才交換的遷移金鑰端到端加密。除了區域網這一段,所有東西都不上公網。
- 校驗+收尾。新手機校驗「收到的」跟「應該收到的」一致,把自己標記為帳號的當前活躍裝置。舊手機問你要不要清空自己(或者保留為副裝置 —— 你定)。
整個流程幾秒到幾分鐘,看你帳號有多大(純帳號資訊幾秒,帶幾年訊息歷史和媒體附件可能一兩分鐘)。
我們的伺服器在這個過程中看到什麼
幾乎什麼都看不到。
QR code 內容我們看不到(只在兩台手機之間短暫存在)。兩台裝置之間的封閉通道我們看不到(是區域網 TCP 連線,根本沒到我們這邊)。傳了什麼我們看不到(全部走那條本機通道,不上我們這兒)。我們甚至看不到「有沒有發生過遷移」 —— 新裝置的下一次連線看起來跟「舊裝置做了一次軟體升級」完全一樣,沒法區分。
跟「雲備份」模式對照:WhatsApp 那邊,即便開了端到端加密備份,Meta 的伺服器還是持有你聊天歷史的一個加密 blob。他們知道這個 blob 多大、什麼時候上傳、你有這麼個東西。blob 是只能用你的金鑰解的,但**「它的存在和它的 metadata」全暴露**。BlindPost 這邊,這種 blob 在我們這邊不存在。位元組是在你掌控的兩台裝置之間直接走的。
代價
兩個真實的限制:
- 必須兩台手機都在場。「舊手機丟了,想在新手機上還原歷史」 —— 我們這邊沒辦法。遷移通道是兩台裝置之間的,兩台都得在線、能互通。如果舊手機壞了 / 丟了 / 被偷了,你唯一的還原手段是那 12 個詞的助記詞(前一篇文章講過),它能還原你的身分,但還原不了歷史訊息 —— 因為那些訊息只在舊手機上存在過,從沒在我們伺服器上。
- 得在退役舊手機之前做這件事。這是「沒有雲備份」帶來的一個小但真實的摩擦。我們沒有(架構上也不能)從一個我們從未做過的備份裡還原你的訊息。同一個屬性給你換來了「你對我們的隱私」,同時也意味著你沒法「懶遷移」。
我們聽過這個請求 —— 「你們能不能加一個可選的、opt-in 的加密雲備份?」 —— 我們持續婉拒。可選功能往往會因為細小的 UX 引導慢慢變成預設。且一旦「雲備份」這個東西存在,伺服器端就必須有支撐它的資料結構。那一刻,整套「架構式隱私」的故事就塌成了「承諾式隱私」(見另一篇)。我們寧可讓遷移變成一次手對手、你有意識地做一次、自己定時的操作。
你得到的
一次你親眼能看到發生的遷移 —— 兩台手機擺在你面前、兩塊螢幕都顯示進度、它們在資料動之前先驗證對方。沒有第三方看到這場操作;任何入侵也還原不出「那些從沒經過的東西」。
我們在別的文章裡講過的整套隱私架構,如果背後掛著一個雲備份,那些努力會被一個側信道全部抵消。「不經過伺服器的遷移」是讓整套架構保持誠實的那一塊。
BlindPost