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