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