我們繼續(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,導出的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,導出一個密鑰。
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棘輪,導出三個密鑰KeyA1、Key1以及Key2。其中,KeyA1用于下一次發(fā)送鏈的Root Key(即salt),Key1用于加密消息,Key2用于派生下一輪的密鑰。
發(fā)送鏈密碼派生:如果Bob一直不給Alice發(fā)送消息,則Alice則一直使用此發(fā)送鏈發(fā)送消息,如上圖所示,第二輪使用Key2加鹽進行派生,第三輪使用Key4。
(PS:Signal實際的實現(xiàn)要比上述的復雜,但原理上一致的)
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,導出三個密鑰
- 發(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導出的KeyA1做Salt,與上述的DH做KDF,導出KeyA2, Key1, Key2,同樣,KeyA2為下一輪發(fā)送鏈的salt, Key1用于此輪加密消息,Key2用于KDF。
Ping Pong
如上圖所示,Bob在收到Alice的消息后,也會重置發(fā)送鏈。
其實就是Ping Pong,Alice收到Bob消息會重復發(fā)送鏈,Bob也一樣。
從Alice的角度總結(jié)
從Alice的角度上看,發(fā)送鏈如下變化:

總結(jié)
本文詳細講解了signal中的核心技術(shù):雙棘輪,包括了DH棘輪以及KDF棘輪。KDF棘輪保證了FS,而DH棘輪保證了PCS。
如果有什么問題,歡迎留言。