端對端加密(E2EE)-參考文章
Signal protocol是真正的端到端的通訊加密協(xié)議蚯嫌,號稱是世界上最安全的通訊協(xié)議云茸,任何第三方包括服務(wù)器都無法查看通訊內(nèi)容鹰晨,熱門應(yīng)用facebook messenger抛虏,whatsapp苗膝,singal app都采用的此協(xié)議殃恒。而我們所熟知的telegram的默認(rèn)會話模式并不是端到端加密,服務(wù)器是可以獲取用戶私鑰并解密聊天內(nèi)容的荚醒,雖然目前報道表明telegram向任何機(jī)構(gòu)出售用戶聊天內(nèi)容芋类,但是用戶的隱私安全由一家公司的職業(yè)操守來保障,總是不太穩(wěn)妥界阁。
signal protocol可應(yīng)用在雙方通訊侯繁,群組通訊中,能保證傳輸?shù)南⑴萸瑘D片贮竟,音頻,視頻等文件的加密傳輸较剃。即使某個消息的密鑰泄露咕别,黑客也無法解密以前的消息和之后的消息,所以signal protocol能提供前向安全和后向安全写穴。
為了使此篇文章盡量簡潔易懂惰拱,有些細(xì)節(jié)沒有詳述甚至被忽略,請各位看官諒解啊送。
迪菲-赫爾曼密鑰交換協(xié)議
迪菲-赫爾曼密鑰交換協(xié)議(Diffie–Hellman key exchange偿短,后文簡稱DH協(xié)議)可以使雙方無需預(yù)先溝通欣孤,在不安全的網(wǎng)絡(luò)中即可確定一個“協(xié)商密鑰”,這個密鑰可以在后續(xù)的通訊中作為對稱密鑰來加密消息內(nèi)容昔逗。這樣避免了雙方網(wǎng)上協(xié)商密鑰帶來的泄露風(fēng)險降传。假設(shè)Alice和Bob要確定一個消息密鑰,DH協(xié)議的原理可以用下面的公式來表示:
DH(A的私鑰,B的公鑰) = 協(xié)商密鑰S = DH(B的私鑰,A的公鑰)
DH協(xié)議算法需要2個參數(shù):自己的私鑰和對方的公鑰荷科。對于Alice和Bob來說,他們只需知道對方的公鑰段只,計(jì)算出的密鑰S就是一樣的。
DH協(xié)議的應(yīng)用流程如下:
Alice和Bob各自創(chuàng)建符合DH協(xié)議的密鑰對卡乾,假設(shè)Alice密鑰對為(私鑰A翼悴,公鑰A),Bob密鑰對為(私鑰B幔妨,公鑰B)鹦赎;
雙方發(fā)送自己的公鑰給對方,即使有黑客監(jiān)聽误堡,他只能得到公鑰A古话,公鑰B;
Alice用自己的私鑰和Bob的公鑰計(jì)算消息密鑰為S锁施,即DH(私鑰A陪踩,公鑰B)=密鑰S;
Bob用自己的私鑰和Alice的公鑰計(jì)算消息密鑰也為S悉抵;即DH(私鑰B肩狂,公鑰A)=密鑰S;
雙方同時確定了協(xié)商密鑰S姥饰,后續(xù)可以通過S衍生出消息密鑰傻谁,進(jìn)行加密通訊。
黑客只知道公鑰A和公鑰B列粪,因?yàn)椴恢廊我庖环降乃借€审磁,所以無法計(jì)算出密鑰S。
綜上可知岂座,2個密鑰對可以安全地創(chuàng)建一個“協(xié)商密鑰”态蒂。在加密通訊中使用DH協(xié)議創(chuàng)建密鑰,是非常安全的方法费什。
X3DH ——DH協(xié)議的3倍擴(kuò)展版
signal protocol采用的是X3DH協(xié)議創(chuàng)建消息密鑰钾恢。X3DH協(xié)議基于DH協(xié)議,但是引入更多的公鑰參數(shù)以提高安全性。在X3DH協(xié)議下瘩蚪,有3個角色:
會話發(fā)起者刑桑,本例我們假設(shè)是Alice;
會話接收者募舟,本例我們假設(shè)是Bob;
服務(wù)器: 用于存儲所有用戶的各種公鑰闻察。
在X3DH協(xié)議里拱礁,也許是為了提高安全性,每個人都要創(chuàng)建3種密鑰對辕漂,分別如下:
身份密鑰對(Identity Key Pair) —— 一個長期的符合DH協(xié)議的密鑰對,用戶注冊時創(chuàng)建呢灶,與用戶身份綁定;
已簽名的預(yù)共享密鑰(Signed Pre Key) ——一個中期的符合DH協(xié)議的密鑰對钉嘹,用戶注冊時創(chuàng)建鸯乃,由身份密鑰簽名,并定期進(jìn)行輪換跋涣,此密鑰可能是為了保護(hù)身份密鑰不被泄露缨睡;
一次性預(yù)共享密鑰(One-Time Pre Keys) —— 一次性使用的 Curve25519 密鑰對隊(duì)列,安裝時生成陈辱,不足時補(bǔ)充奖年。
所有人都要將這3種密鑰對的公鑰上傳到服務(wù)器上,以便其他人發(fā)起會話時使用沛贪。
假如Alice要給Bob發(fā)送消息陋守,首先要和Bob確定消息密鑰,流程大致如下
Alice 要創(chuàng)建一個臨時密鑰對(ephemeral key)利赋,我們設(shè)成EPK-A水评,此密鑰對是為了后面棘輪算法準(zhǔn)備,在此處作用不大媚送;
Alice從服務(wù)器獲取Bob的三種密鑰對的公鑰:身份密鑰對IPK-B中燥;已簽名的預(yù)共享密鑰SPK-B;一次性預(yù)共享密鑰OPK-B
Alice開始使用DH協(xié)議計(jì)算協(xié)商密鑰季希,要引入?yún)?shù)包括:自己創(chuàng)建的2個密鑰對的私鑰褪那,以及Bob的三個公鑰。然后用類似排列組合的方式式塌,將自己的私鑰與對方的公鑰分別帶入DH算法計(jì)算博敬,
DH1 = DH(IPK-A, SPK-B)
DH2 = DH(EPK-A, IPK-B)
DH3= DH(EPK-A, SPK-B)
DH4 = DH(IPK-A, OPK-B)
如圖所示
然后將計(jì)算得到的四個值,前后連接起來峰尝,就得到了初始密鑰偏窝,如下
DH = DH1 || DH2 || DH3 || DH4
注:“||”代表連接符,比如 456||123=456123
但是DH這個密鑰太長,不適合作為消息密鑰祭往,所以對這個初始密鑰進(jìn)行一次KDF計(jì)算(KDF是密鑰衍生算法的一種伦意,可以看成加強(qiáng)版的hash),以衍生出固定長度的消息密鑰S
S = KDF(DH1 || DH2 || DH3 || DH4)
這一步硼补,Alice終于計(jì)算出了消息密鑰S驮肉。
Alice使用消息密鑰S對消息進(jìn)行加密,連同自己的身份公鑰IPK-A和臨時公鑰EPK-A一同發(fā)給Bob
Bob收到Alice的信息后已骇,取出Alice的2個公鑰离钝,連同自己的密鑰,使用與Alice相同的算法計(jì)算消息密鑰S褪储。
Bob和Alice使用消息密鑰進(jìn)行加密通訊卵渴。
由上可知,X3DH實(shí)際是復(fù)雜版的DH協(xié)議鲤竹,解決了在不安全的網(wǎng)絡(luò)里如何確定消息密鑰的問題浪读。但是仍然不夠安全,你可以想一下辛藻,一旦消息密鑰被破解(雖然概率很小碘橘,但是也有可能發(fā)生),那么Alice和Bob所有的消息就都能解密了吱肌,泄露一個密鑰蛹屿,所有的聊天就會被破解,這代價有些太大了岩榆。
如果可以做到每發(fā)一條消息错负,就換一次消息密鑰,那么即使某個消息密鑰被破解了勇边,黑客也只能解密這一條消息犹撒,其它消息仍然無法解密。這樣簡直就完美了粒褒,于是识颊,棘輪算法就誕生了。
棘輪算法
棘輪(ratchet)是一種特殊齒輪奕坟,這種齒輪有個特點(diǎn)祥款,就是只能向一個方向旋轉(zhuǎn),而不能倒轉(zhuǎn)月杉。下圖就是一個棘輪
Signal Protocol采用棘輪算法來生成消息密鑰刃跛,使用1個棘輪算法,能實(shí)現(xiàn)每條消息使用不同的密鑰苛萎,即使一條消息的密鑰被破解了桨昙,只能推算后面消息的密鑰检号,而不能向前推算之前消息的密鑰,我們稱之為前向安全蛙酪。
如果再加上一個棘輪算法齐苛,就可以再前向安全的基礎(chǔ)上保障后向安全,即一條消息的密鑰被破解桂塞,之前和之后的消息密鑰都無法推算凹蜂,這種算法被稱為“雙棘輪算法”
Signal Protocol在雙方通訊中采用的雙棘輪算法是“KDF鏈棘輪”+“DH棘輪”。以保證消息的前向安全和后向安全阁危。
“KDF鏈”棘輪
KDF是一種密鑰導(dǎo)出函數(shù)炊甲,通過附加一些數(shù)據(jù)(數(shù)據(jù)被稱為“鹽”,附加數(shù)據(jù)又稱“加鹽”)欲芹,將原始密鑰導(dǎo)出新的密鑰,提高原始密鑰的保密性吟吝。公式表達(dá)為
KDF (原密鑰菱父,鹽) = 導(dǎo)出密鑰
KDF算法可用于更安全地保存用戶密碼,普通的密碼管理方式是服務(wù)器保存用戶密碼的哈希值剑逃,以避免服務(wù)器被攻擊后黑客拿到用戶密碼原文浙宜,但是一些簡單密碼的哈希值仍然可以通過少量的碰撞破解出來,比如123456的哈希值就很容易被碰撞出來蛹磺。更加安全的做法是在用戶哈希值附加其它信息(比如用戶注冊時間粟瞬,用戶住址等等),通過KDF算法導(dǎo)出萤捆,得出的密鑰具有非常強(qiáng)的隨機(jī)性裙品,就很難被碰撞出來。比如原始密碼是123456的哈希值為"hash (123456)"俗或,使用KDF算法得出最終密鑰
KDF(hash (123456)市怎,用戶注冊時間)=最終密鑰
服務(wù)器只保存最終密鑰。這樣的密碼管理方式的好處是辛慰,不管用戶設(shè)置的密碼多么簡單区匠,服務(wù)器保存的密鑰都是非常隨機(jī)的,很難被碰撞出來帅腌。
“KDF鏈棘輪”就是運(yùn)用KDF算法驰弄,設(shè)計(jì)出一種密鑰不斷變化的效果,的流程如下:
第一步里速客,將初始密鑰使用KDF算法導(dǎo)出新的密鑰戚篙,新的密鑰被切成2部分,前半部分作為下一次KDF計(jì)算的輸入溺职,后半部分作為消息密鑰已球。每迭代一次(也可以說 棘輪步進(jìn)一次)臣镣,就會生成新的消息密鑰。
假設(shè)每發(fā)一條消息智亮,就棘輪步進(jìn)一次忆某,那么每條消息的密鑰都會不同,而且由于KDF算法的單向性阔蛉,通過這條消息的密鑰無法倒推出上一條消息密鑰的弃舒。這就保證了密鑰的前向安全。
但是這種設(shè)計(jì)不能保證后向安全状原,黑客一旦破解了某條密鑰聋呢,并掌握了鹽的內(nèi)容,那么它就可以按照這種算法計(jì)算出以后所有的消息密鑰颠区。
所以削锰,為了保證后向安全,就要設(shè)計(jì)一種算法毕莱,使每次迭代時引入的鹽是隨機(jī)的器贩,從而保證每次的消息密鑰是不可以向后推算的。Signal Protocol 通過增加“DH棘輪”來保證鹽的隨機(jī)性朋截。
DH棘輪算法
“DH棘輪”算法能保證每次計(jì)算引入的鹽的隨機(jī)性蛹稍。由前文可知,2對密鑰對可以通過DH協(xié)議生成一個安全的協(xié)商密鑰部服,如果更換其中一個密鑰對唆姐,新的協(xié)商密鑰也會變化。DH棘輪算法就是通過輪流更換一個密鑰對廓八,每次生成不同的協(xié)商密鑰奉芦,作為KDF棘輪算法的鹽。每進(jìn)行一個消息輪回剧蹂,DH棘輪就更新一次臨時密鑰對仗阅,鹽就被更新,KDF棘輪算法生成的消息密鑰就具有后向安全性国夜。
在前文提過减噪,Alice要給Bob發(fā)送消息,根據(jù)X3DH協(xié)議车吹,Alice要創(chuàng)建一個臨時密鑰對(EK-A)筹裕,用于創(chuàng)建初始消息密鑰S。其實(shí)這個臨時密鑰對還有另外一個用途窄驹,就是用于生成第一個鹽朝卒。
繼續(xù)接前文Alice和Bob通過X3DH協(xié)議建立了會話,Bob要給Alice回復(fù)消息乐埠,那么DH棘輪大概的流程如下:
由上圖可知抗斤,每當(dāng)收到對方的消息囚企,并回應(yīng)時,自己都要新生成一個隨機(jī)DH密鑰對瑞眼,用以生成新的DH密鑰作為新鹽龙宏。從而保證了每次生成的消息密鑰都是完全隨機(jī)的。
更復(fù)雜一點(diǎn)的情況伤疙,在上例中第三回合银酗,假如Bob沒有回復(fù)Alice,Alice又發(fā)了一條消息給Bob徒像,此時消息密鑰是如何計(jì)算的呢黍特?此時因?yàn)橄⑦€沒有進(jìn)行一次輪回(就像打乒乓球,球發(fā)過去了锯蛀,但是對方?jīng)]打回來灭衷,不算一個回合),DH密鑰對不進(jìn)行更新旁涤,也就是說KDF棘輪引入的鹽不變翔曲,但是消息密鑰仍然是變化的。流程如下
這種設(shè)計(jì)可以保證在亂序接收消息時拭抬,接收方仍能正確解密消息。篇幅有限侵蒙,具體原因就不詳述了造虎。
綜上所述,雙棘輪算法提供加密的前向和后向安全纷闺。同時我們也知道算凿,在Signal Protocol中,與每一個人的單獨(dú)對話犁功,都會保存單獨(dú)的KDF鏈棘輪和DH棘輪氓轰,所以相對于普通會話,加密對話會消耗更多的運(yùn)算和存儲空間浸卦。
Signal Protocol在群組聊天中的設(shè)計(jì)又有所不同署鸡,由于群聊的保密性要求相對低一些,只采用了KDF鏈棘輪以保障加密的前向安全限嫌。
Signal Protocol 的群組聊天設(shè)計(jì)
Signal Protocol的群組聊天是通過KDF棘輪算法+公鑰簽名來進(jìn)行加密通訊的靴庆。通訊流程是這樣的,
(1) 每個群組成員都要首先生成隨機(jī) 32 字節(jié)的KDF鏈密鑰(Chain Key)怒医,用于生成消息密鑰炉抒,以保障消息密鑰的前向安全性,同時還要生成一個隨機(jī)Curve25519 簽名密鑰對稚叹,用于消息簽名焰薄。
(2) 每個群組成員用向其它成員單獨(dú)加密發(fā)送鏈密鑰(Chain Key)和簽名公鑰拿诸。此時每一個成員都擁有群內(nèi)所有成員的鏈密鑰和簽名公鑰。
(3) 當(dāng)一名成員發(fā)送消息時塞茅,首先用KDF鏈棘輪算法生成的消息密鑰加密消息亩码,然后使用私鑰簽名,再將消息發(fā)給服務(wù)器凡桥,由服務(wù)器發(fā)送給其它成員蟀伸。
(4) 其它成員收到加密消息后,首先使用發(fā)送人的簽名公鑰驗(yàn)證缅刽,驗(yàn)證成功后啊掏,使用相應(yīng)的鏈密鑰生成消息密鑰,并用消息密鑰解密衰猛。
(5) 當(dāng)群組成員離開時迟蜜,所有的群組成員都清除自己鏈密鑰和簽名公鑰并重新生成,再次單獨(dú)發(fā)給每一位成員啡省。這樣操作娜睛,離開的成員就無法查看群組內(nèi)的消息了。
由上可知卦睹,一個人在不同的群組里畦戒,會生成不同的鏈密鑰和簽名密鑰對,以保障群組之間的隔離结序。在每個群組中障斋,每個成員還要存儲其它成員的KDF鏈和簽名公鑰,如果群組成員過多徐鹤,加解密運(yùn)算量非常大垃环,會影響發(fā)送和接收速度,同時密鑰管理數(shù)據(jù)庫也會非常大返敬,讀取效率也會降低遂庄。所以,群組聊天使用signal Protocol協(xié)議劲赠,群人數(shù)不宜太多涛目。
以上介紹了Signal Protocol在雙方通訊和群組聊天中的加密設(shè)計(jì),可以看出凛澎,Signal Protocol是真正端到端加密通訊協(xié)議泌绣,提供了消息的前向安全和后向安全,是最安全的加密協(xié)議之一预厌。
本文參考來源
[1] 《雙棘輪算法》,爛磁頭阿迈,https://blog.lancitou.net/double-ratchet-algorithm/
[2] 《【翻譯】WhatsApp 加密概述(技術(shù)白皮書)》, p農(nóng)民伯伯q, http://www.cnblogs.com/over140/p/8683171.html
[3] 《The X3DH Key Agreement Protocol》,Moxie Marlinspike, Trevor Perrin (editor)轧叽,https://www.signal.org/docs/specifications/x3dh/
[4] 《The Double Ratchet Algorithm》苗沧,Trevor Perrin (editor), Moxie Marlinspike刊棕,https://www.signal.org/docs/specifications/doubleratchet/