WhatsApp 加密概述(技術白皮書),whatsapp 免費下載WhatsApp 加密概述(技術白皮書)目錄簡介術語客戶端注冊會話初始化設置接收會話設置交換信息傳輸媒體和附件群組消息通話設置狀態實時位置(待填坑)驗證密匙傳輸安全結論簡介本白皮書提供了WhatsApp端到端加密系統的技術說明。WhatsApp Mes......
目錄
簡介
術語
客戶端注冊
會話初始化設置
接收會話設置
交換信息
傳輸媒體和附件
群組消息
通話設置
狀態
實時位置(待填坑)
驗證密匙
傳輸安全
結論
簡介
本白皮書提供了WhatsApp端到端加密系統的技術說明。
WhatsApp Messenger允許人們自由的交換消息(包括聊天,群聊,圖片,視頻,語音消息和文件),并在發快遞者和接收者之間使用端對端加密(在2016年3月31之后的版本)。
Signal協議是由Open Whisper Systems(非盈利軟件開發團體)設計,是WhatsApp端對端加密的基礎。這種端對端加密協議旨在防止第三方和WhatsApp對消息或通話進行明文訪問。更重要的是,即使用戶設備的密鑰泄露,也不能解密之前傳輸的消息。
本文檔概述了Singal協議在WhatsApp中的應用。
術語
公鑰類型
·身份密鑰對(Identity Key Pair)——一個長期Curve25519密鑰對,安裝時生成。
·已簽名的預共享密鑰(Signed Pre Key)——一個中期Curve25519密鑰對,安裝時生成,由身份密鑰簽名,并定期進行輪換。
·一次性預共享密鑰(OneTime Pre Keys)——一次性使用的Curve25519密鑰對隊列,安裝時生成,不足時補充。
會話密鑰類型
·根密鑰(Root Key)——32字節的值,用于創建鏈密鑰。
·鏈密鑰(Chain Key)——32字節的值,用于創建消息密鑰。
·消息密鑰(Message Key)——80個字節的值,用于加密消息內容。32個字節用于AES256密鑰,32個字節用于HMACSHA256密鑰,16個字節用于IV。
客戶端注冊
在注冊時,WhatsApp客戶端將身份公鑰(public Identity Key)、已簽名的預共享公鑰(public Signed Pre Key)和一批一次性預共享公鑰(OneTime Pre Keys)發快遞給服務器。WhatsApp服務器存儲用戶身份相關的公鑰。WhatsApp服務器無法訪問任何客戶端的私鑰。
會話初始化設置
要與另一個WhatsApp用戶通信,WhatsApp客戶端需要先建立一個加密會話。加密會話一旦被創建,客戶端就不需要再重復創建會話,除非會話失效(例如重新安裝應用或更換設備)。
建立會話:
1.會話發起人為接收人申請身份公鑰(public Identity Key)、已簽名的預共享公鑰(public Signed Pre Key)和一個一次性預共享密鑰(OneTime Pre Key)。
2.服務器返回所請求的公鑰。一次性預共享密鑰(OneTime Pre Key)僅使用一次,因此請求完成后將從服務器刪除。如果一次性預共享密鑰(OneTime Pre Key)被用完且尚未補充,則返回空。
3.發起人將接收人的身份密鑰(Identity Key)存為Irecipient,將已簽名的預共享密鑰(Signed Pre Key)存為Srecipient,將一次性預共享密鑰(OneTime Pre Key)存為Orecipient。
4.發起者生成一個臨時的Curve25519密鑰對——Einitiator
5.發起者加載自己的身份密鑰(Identity Key)作為Iinitiator
6.發起者計算主密鑰mastersecret=ECDH(Iinitiator,Srecipient)ECDH(Einitiator,Irecipient)ECDH(Einitiator,Srecipient)ECDH(Einitiator,Orecipient)。如果沒有一次性預共享密鑰(OneTime Pre Key),最終ECDH將被忽略。
7.發起者使用HKDF算法從mastersecret創建一個根密鑰(Root Key)和鏈密鑰(Chain Keys)。
接收會話設置
在建立長期加密會話后,發起人可以立即向接收人發快遞消息,即使接收人處理離線狀態。在接收方響應之前,發起方所有的消息都會包含創建會話所需的信息(在消息的header里)。其中包括發起人的Einitiator和Iinitiator。當接收方收到包含會話設置的消息時:
接收人使用自己的私鑰和消息header里的公鑰來計算相應的主密鑰
接收人刪除發起人使用的一次性預共享密鑰(OneTime Pre Key)
發起人使用HKDF算法從主密鑰派生出相應的根密鑰(Root Key)和鏈密鑰(Chain Keys)
交換消息
一旦建立了會話,通過AES256消息密鑰加密(CbC模式)和HMACSHA256驗證來保護客戶端交換消息。
消息密鑰是短暫的且在每次發快遞消息后都會變化,使得用于加密消息的消息密鑰不能從已發快遞或已接收后的會話狀態中重建。
消息密鑰在發快遞消息時對發快遞人的鏈密鑰(Chain Key)進行向前的“棘輪(ratchets)”派生而來。此外,每次消息巡回都執行一個新的ECDH協議以創建一個新的鏈密鑰(Chain Key)。通過組合即時“哈希棘輪(hash ratchet)”和巡回“DH棘輪(DH ratchet)”提供前向安全。
通過鏈密鑰(Chain Key)計算消息密鑰(Message Key)
消息發快遞者每次需要新的消息密鑰時,計算如下:
1.消息密鑰(Message Key)=HMACSHA256(Chain Key,0x01)
2.鏈密鑰(Chain Key)隨后更新為:鏈密鑰(Chain Key)=HMACSHA256(Chain Key,0x02)
這樣形成向前“棘輪(ratchets)”鏈密鑰(Chain Key),這也意味不能使用存儲的消息密鑰推導出當前或過去的鏈密鑰(Chain Key)值。
通過根密鑰(Root Key)計算鏈密鑰(Chain Key)
每一條發快遞的消息都附帶一個短期的Curve25519公鑰。一旦收到響應,新的鏈密鑰(Chain Key)計算如下:
1.ephemeralsecret=ECDH(Ephemeralsender,Ephemeralrecipient)
2.鏈密鑰(Chain Key),根密鑰(Root Key)=HKDF(Root Key,ephemeralsecret)
一個鏈密鑰只能給一個用戶發消息,所以消息密鑰不能被重用。由于消息密鑰和鏈密鑰(Chain Keys)的計算方式,消息可能會延遲、亂序或完全丟失而不會有問題。
傳輸媒體和附件
任何類型的大附件(視頻,音頻,圖像或文件)也都是端對端加密的:
1.發件人(發消息的WhatsApp用戶)生成一個32字節的AES256臨時密鑰和一個32字節HMACSHA256臨時密鑰。
2.發件人通過AES256密鑰(CBC模式)和隨機IV給附件加密,然后附加使用HMACSHA256密文的MAC。
3.發件人將加密的附件以上傳到服務器以二進制存儲。
4.發件人給收件人發快遞一個包含加密密鑰、HMAC密鑰、加密二進制的SHA256哈希值和指向二進制存儲的指針的加密消息
5.收件人解密消息,從服務器檢索加密的二進制數據,驗證AES256哈希,驗證MAC并解密為明文。
群組消息
傳統未加密的聊天應用通常對群組消息使用“服務器扇出(serverside fanout)”來發群組消息。當一個用戶向群組發消息時,服務器將消息分發給每一個群組成員。
而“客戶端扇出(clientside fanout)”是客戶端將消息發給每一個群組成員。
WhatsApp的群組消息基于上面列出的成對加密會話構建,以便高效實現大量群組消息通過服務器扇出(serverside fanout)。這是通過Signal傳輸協議(Signal Messaging Protocol)的“發快遞者密鑰(Sender Keys)”來完成的。
WhatsApp群組成員第一次發消息到群組:
1.發快遞人生成一個隨機32字節的鏈密鑰(Chain Key)。
2.發快遞人生成一個隨機Curve25519簽名密鑰對。
3.發快遞人將32位鏈密鑰(Chain Key)和簽名密鑰中的公鑰組合成消息發快遞人密鑰(Sender Key)。
4.發件人用成對傳輸協議為每個群組成員單獨加密發快遞人密鑰(Sender Keys)。
所有后續發給該群組的消息:
1.發快遞人從鏈密鑰(Chain Key)中獲取消息密鑰(Message Key)并更新鏈密鑰(Chain Key)
2.發快遞人在CbC模式下使用AES256加密消息
3.發快遞人使用簽名密鑰(Signature Key)簽名密文
4.發快遞人將單個密文消息發給服務器,服務器將消息分發給所有群組成員
消息發快遞人鏈密鑰(Chain Key)的“哈希棘輪(hash ratchet)”提供向前安全。當群組成員離開時時,所有剩下的群組成員都清除發快遞人密鑰(Sender Key)并重新生成。
通話設置
WhatsApp語音和視頻通話也是端對端加密。當WhatsApp用戶發起語音或視頻通話時:
1.發起人與接收人建立加密會話(如果還沒有建立過)
2.發起人生成一個隨機32字節的安全實時傳輸協議(SRTP)主密鑰(master secret)
3.發起人向接收人發快遞一個包含安全實時傳輸協議(SRTP)主密鑰的加密消息用于發通話信號
4.如果應答了呼叫,跟著發起安全實時傳輸協議(SRTP)呼叫
狀態
WhatsApp狀態加密方式和群組消息非常相似。給指定的一組接收人第一次發狀態遵循向群組第一次發消息相同的步驟。類似地,給同一組接收人發快遞后續狀態也遵循發群組消息相同的步驟。當狀態發快遞人更改狀態隱私設置或從地址簿種刪除號碼來刪除接收人時,狀態發快遞人會清除發快遞人密鑰(Sender Key)并重新生成。
驗證密鑰
WhatsApp用戶還可以驗證與之通信用戶的密鑰,以便他們能夠確認未授權的第三方(或WhatsApp)未發起中間人攻擊。通過掃描二維碼或通過比較60位數字來完成。
二維碼包括:
1.版本號
2.雙方的用戶身份
3.雙方完整的32字節身份公鑰
當用戶掃描對方的二維碼時,將比較這些密鑰以確保二維碼中的身份密鑰與服務器檢索到的相匹配。
通過拼接兩個用戶身份密鑰的30位數字指紋來計算60位數字號碼。計算30位數字指紋步驟:
1.重復SHA512哈希身份公鑰和用戶標識符5200次
2.獲取最后輸出哈希的前30個字節
3.將30個字節分成6組每組5字節的數據塊
4.通過解析每組5字節數據塊為bigendian無符號整形并且取模10萬次轉換為5個數字
5.把六組每組5個數字連接成30位數字
傳輸安全
WhatsApp客戶端和服務器之間所有通信都在單獨的加密通道內分層。在Windows Phone、iPhone和Android上,這些端對端加密客戶端可以使用噪音管道(Noise Pipes),使用噪聲協議框架(Noise Protocol Framework)中的Curve25519、AESGCM和SHA256實現長期運行的交互連接。
這為客戶端提供了一些不錯的屬性:
1.極快的輕量級連接設置和恢復
2.加密隱藏元數據防止未授權的網絡監聽。沒有透露連接用戶身份相關的信息。
3.服務器上不存儲客戶端的安全認證信息。客戶端使用Curve25519密鑰進行身份驗證,因此服務器僅保存客戶端認證公鑰(public authentication key)。如果服務器的用戶數據庫被入侵,也不會泄露個人認證憑證。
結論
WhatsApp用戶之間的消息受到端對端加密協議的保護,因此第三方和WhatsApp都無法獲知消息內容,消息只能由接收人解密。所有WhatsApp消息(包括聊天、群聊、圖片、視頻、語音消息和文件)和WhatsApp通話都受到端對端加密的保護。
WhatsApp服務器無法訪問WhatsApp用戶的私鑰,并且WhatsApp用戶可以選擇驗證密鑰以確保其通訊完整。
WhatsApp使用的Signal協議庫是開源的,代碼:https://github.com/whispersystems/libsignalprotocoljava/
參考
維基百科:端到端加密
Signal協議中的雙棘輪算法
農民伯伯翻譯
特別聲明:以上文章內容僅代表作者本人觀點,不代表ESG跨境電商觀點或立場。如有關于作品內容、版權或其它問題請于作品發表后的30日內與ESG跨境電商聯系。
平臺顧問
微信掃一掃
馬上聯系在線顧問
小程序
ESG跨境小程序
手機入駐更便捷
返回頂部