我們繼續(xù)講解signal的核心技術(shù):雙棘輪来氧。
在上一篇,我們先講了:X3DH香拉,F(xiàn)S(前向安全)啦扬,PCS(后向安全),然后簡單提了密碼學中的DH凫碌,HMAC, KDF, HKDF扑毡。這一篇,我們將詳細講解雙棘輪這個核心技術(shù)盛险。
如果你要跟某個人進行安全通信瞄摊,你會如何設(shè)計
假設(shè)你要做個系統(tǒng),可以和某個人安全通信苦掘,站在安全性的角度换帜,技術(shù)上應(yīng)該如何設(shè)計?
思考時間......
思考時間......
思考時間......
- 首先鹤啡,你可能會想到惯驼,如何與對方進行密鑰協(xié)商,這就涉及到DH递瑰。
- 其次祟牲,出于極致的安全性要求,你會考慮FS(前向安全)泣矛,PCS(后向安全)疲眷。如何保證在某次通信中,被破解出來的密鑰您朽,不能破解出之前的消息,而且在一定周期內(nèi),這個破解出來的密鑰將不會再起作用哗总。
下面几颜,我們來看看雙棘輪是如何做的
棘輪
我們先來感性認識一下棘輪:
從感觀上,棘輪就是一種特殊的齒輪讯屈,他只能往一個方向轉(zhuǎn)下去蛋哭,而不能往回轉(zhuǎn)。
在技術(shù)上涮母,做到"只能往一個方向轉(zhuǎn)下去谆趾,而不能往回轉(zhuǎn)",是達到FS(前向安全)的關(guān)鍵叛本。比如KDF沪蓬,導(dǎo)出的KDF鏈只能往后面派生,而不能計算出前向的密鑰来候,這就保證了跷叉,如果某一輪的密鑰被破解出來,但前面的密鑰是無法計算出來的营搅,也就是前面的消息無法被解密云挟。
雙棘輪
雙棘輪,就是說转质,signal用了兩個棘輪來保證其安全性园欣。這里先不展開,我們到最后再看休蟹,可能會更加清楚沸枯。
我們以一個真實場景來講解signal的通信技術(shù)
我們還是以Alice與Bob通信為例,講解這個核心技術(shù)鸡挠。
Alice主動給Bob發(fā)第一條消息
X3DH
Alice要主動與Bob聯(lián)系辉饱,首先要進行密鑰協(xié)商。由于Bob可能不在線拣展,所以Alice可以借助Bob存放在Server的公鑰進行彭沼。
Signal用的是X3DH,即Alice會去Server拿到Bob的長期公鑰IdentityKey备埃,以及中期的公鑰SignedPreKey姓惑,以及臨時的公鑰PreKey。然后做X3DH按脚,導(dǎo)出一個密鑰于毙。
X3DH的具體做法可以看我的上一篇文章。
發(fā)送鏈與接收鏈
在signal中辅搬,Alice與Bob都分別有自己的發(fā)送鏈(chain)以及接收鏈唯沮。如下圖所示:
這兩種鏈分別計算發(fā)送密鑰以及接收密鑰脖旱。
第一條消息
總體流程如下圖(為了能更簡單清晰地解釋,下面的圖已經(jīng)是簡化過后的圖):
Alice要給Bob第一條消息介蛉,需要初始化發(fā)送鏈:
DH棘輪:Alice首先使用雙棘輪中的第一個棘輪:DH棘輪萌庆,進行DH計算,具體流程是:
a) Alice生成一對臨時的key pair(公私鑰對)
b) 用這個臨時的key pair的私鑰與Bob SignedPreKey的公鑰進行DH計算币旧。KDF棘輪:Alice再使用雙棘輪中的第二個棘輪:KDF棘輪践险,導(dǎo)出三個密鑰KeyA1、Key1以及Key2吹菱。其中巍虫,KeyA1用于下一次發(fā)送鏈的Root Key(即salt),Key1用于加密消息鳍刷,Key2用于派生下一輪的密鑰占遥。
發(fā)送鏈密碼派生:如果Bob一直不給Alice發(fā)送消息,則Alice則一直使用此發(fā)送鏈發(fā)送消息倾剿,如上圖所示筷频,第二輪使用Key2加鹽進行派生,第三輪使用Key4前痘。
(PS:Signal實際的實現(xiàn)要比上述的復(fù)雜凛捏,但原理上一致的)
Bob接收到消息
Bob接收到消息后,會做兩件事情芹缔,第一件是初始化接收鏈坯癣,第二件是初始化發(fā)送鏈。
初始化接收鏈
如下圖所示:
與Alice的發(fā)送鏈對應(yīng)最欠,Bob使用相同的規(guī)則初始化接收鏈示罗。
由于Bob進行X3DH,以及DH之后的值芝硬,是一樣的蚜点,所以可以產(chǎn)生相同的Key1,Key3進行解密拌阴。
初始化發(fā)送鏈
Bob在收到Alice的消息后绍绘,就可以初始化發(fā)送鏈了:
與Alice一樣:
- DH棘輪:Bob生成一個臨時的key pair,與Alice進行DH
- KDF棘輪:與Alice一樣迟赃,用上述的DH做Salt陪拘,導(dǎo)出三個密鑰
- 發(fā)送鏈密碼派生:與Alice一樣,第二輪使用Key2加鹽進行派生纤壁,第三輪使用Key4
在初始化發(fā)送鏈后左刽,Bob就可以發(fā)送消息了。
Bob給Alice回消息
如下圖所示:
Bob用自己發(fā)送鏈的密鑰加密消息后酌媒,給Alice發(fā)送消息欠痴。Alice在接收消息后迄靠,會做兩件事情,一個是初始化自己的接收鏈斋否,第二個是重置自己的發(fā)送鏈梨水。
初始化自己的接收鏈如上圖所示拭荤,重置自己的發(fā)送鏈要重點講講茵臭。
Alice在收到Bob的消息后,會重置發(fā)送鏈
如下圖所示:
Alice在收到Bob的消息后舅世,會重置自己的發(fā)送鏈旦委,可以想像為棘輪往后移了一格,這樣雏亚,KDF將重新計算缨硝,如果之前某輪的密鑰泄密了,從此刻開始罢低,之前的密鑰將無法解密到消息查辩,這滿足了PCS(后向安全)的特性。
具體做法是:
- Alice生成新的臨時key pair网持,與Bob的SigndPreKey做DH
- 將上一輪Key Chain導(dǎo)出的KeyA1做Salt宜岛,與上述的DH做KDF,導(dǎo)出KeyA2, Key1, Key2功舀,同樣萍倡,KeyA2為下一輪發(fā)送鏈的salt, Key1用于此輪加密消息辟汰,Key2用于KDF列敲。
Ping Pong
如上圖所示,Bob在收到Alice的消息后帖汞,也會重置發(fā)送鏈戴而。
其實就是Ping Pong,Alice收到Bob消息會重復(fù)發(fā)送鏈翩蘸,Bob也一樣所意。
從Alice的角度總結(jié)
從Alice的角度上看,發(fā)送鏈如下變化:
總結(jié)
本文詳細講解了signal中的核心技術(shù):雙棘輪鹿鳖,包括了DH棘輪以及KDF棘輪扁眯。KDF棘輪保證了FS,而DH棘輪保證了PCS翅帜。
如果有什么問題姻檀,歡迎留言。