簡介
本白皮書提供了 WhatsApp 端到端加密系統的技術說明。請訪問 WhatsApp 的網站 www.whatsapp.com/security 瞭解更多。
WhatsApp Messenger 容許人們自由的交換消息(包括聊天,羣聊,圖片,視頻,語音消息和文件),並在發送者和接收者之間使用端對端加密(在 2016 年 3 月 31 以後的版本)。
Signal 協議是由 Open Whisper Systems (非盈利軟件開發團體)設計,是 WhatsApp 端對端加密的基礎。這種端對端加密協議旨在防止第三方和 WhatsApp 對消息或通話進行明文訪問。更重要的是,即便用戶設備的密鑰泄露,也不能解密以前傳輸的消息。
本文檔概述了 Singal 協議在 WhatsApp 中的應用。java
交換消息
一旦創建了會話,經過 AES256 消息密鑰加密(CbC 模式)和 HMAC-SHA256 驗證來保護客戶端交換消息。
消息密鑰是短暫的且在每次發送消息後都會變化,使得用於加密消息的消息密鑰不能從已發送或已接收後的會話狀態中重建。
消息密鑰在發送消息時對發送人的鏈密鑰(Chain Key)進行向前的「棘輪(ratchets)」派生而來。此外,每次消息巡迴都執行一個新的 ECDH 協議以建立一個新的鏈密鑰(Chain Key)。經過組合即時 「哈希棘輪(hash ratchet)」 和巡迴 「DH 棘輪(DH ratchet)」 提供前向安全。git
經過鏈密鑰(Chain Key)計算消息密鑰(Message Key)
消息發送者每次須要新的消息密鑰時,計算以下:github
這樣造成向前「棘輪(ratchets)」鏈密鑰(Chain Key),這也意味不能使用存儲的消息密鑰推導出當前或過去的鏈密鑰(Chain Key)值。算法
經過根密鑰(Root Key)計算鏈密鑰(Chain Key)
每一條發送的消息都附帶一個短時間的 Curve25519 公鑰。一旦收到響應,新的鏈密鑰(Chain Key)計算以下:數據庫
一個鏈密鑰只能給一個用戶發消息,因此消息密鑰不能被重用。因爲消息密鑰和鏈密鑰(Chain Keys)的計算方式,消息可能會延遲、亂序或徹底丟失而不會有問題。安全
傳輸媒體和附件
任何類型的大附件(視頻,音頻,圖像或文件)也都是端對端加密的:服務器
羣組消息
傳統未加密的聊天應用一般對羣組消息使用「服務器扇出(server-side fan-out)」來發羣組消息。當一個用戶向羣組發消息時,服務器將消息分發給每個羣組成員。
而「客戶端扇出(client-side fan-out)」是客戶端將消息發給每個羣組成員。
WhatsApp 的羣組消息基於上面列出的成對加密會話構建,以便高效實現大量羣組消息經過服務器扇出(server-side fan-out)。這是經過 Signal 傳輸協議(Signal Messaging Protocol)的 「發送者密鑰(Sender Keys)」來完成的。
WhatsApp 羣組成員第一次發消息到羣組:網絡
全部後續發給該羣組的消息:app
消息發送人鏈密鑰(Chain Key)的「哈希棘輪(hash ratchet)」提供向前安全。當羣組成員離開時時,全部剩下的羣組成員都清除發送人密鑰(Sender Key)並從新生成。框架
通話設置
WhatsApp 語音和視頻通話也是端對端加密。當 WhatsApp 用戶發起語音或視頻通話時:
狀態
WhatsApp 狀態加密方式和羣組消息很是類似。給指定的一組接收人第一次髮狀態遵循向羣組第一次發消息相同的步驟。相似地,給同一組接收人發送後續狀態也遵循發羣組消息相同的步驟。當狀態發送人更改狀態隱私設置或從地址簿種刪除號碼來刪除接收人時,狀態發送人會清除發送人密鑰(Sender Key)並從新生成。
驗證密鑰
WhatsApp 用戶還能夠驗證與之通訊用戶的密鑰,以便他們可以確認未受權的第三方(或 WhatsApp)未發起中間人攻擊。經過掃描二維碼或經過比較 60 位數字來完成。
二維碼包括:
當用戶掃描對方的二維碼時,將比較這些密鑰以確保二維碼中的身份密鑰與服務器檢索到的相匹配。
經過拼接兩個用戶身份密鑰的 30 位數字指紋來計算 60 位數字號碼。計算 30 位數字指紋步驟:
傳輸安全
WhatsApp 客戶端和服務器之間全部通訊都在單獨的加密通道內分層。在 Windows Phone、iPhone 和 Android 上,這些端對端加密客戶端可使用噪音管道(Noise Pipes),使用噪聲協議框架(Noise Protocol Framework)中的 Curve2551九、AES-GCM 和 SHA256 實現長期運行的交互鏈接。
這爲客戶端提供了一些不錯的屬性:
結論
WhatsApp 用戶之間的消息受到端對端加密協議的保護,所以第三方和 WhatsApp 都沒法獲知消息內容,消息只能由接收人解密。全部 WhatsApp 消息(包括聊天、羣聊、圖片、視頻、語音消息和文件)和 WhatsApp 通話都受到端對端加密的保護。
WhatsApp 服務器沒法訪問 WhatsApp 用戶的私鑰,而且 WhatsApp 用戶能夠選擇驗證密鑰以確保其通信完整。
WhatsApp 使用的 Signal 協議庫是開源的,代碼:https://github.com/whispersystems/libsignal-protocol-java/
參考
過年期間翻譯了一下,原本英語就差很是吃力,正好作這塊硬着頭皮試着翻譯一下,但願對英語也很差的朋友有一點幫助。對了,招人,看我博客首頁招 Swifter :)