Signal是在IT界與安全界都非常有名的一個(gè)端對(duì)端加密產(chǎn)品,它既符合FS(Forward secrecy计贰,前向安全)钦睡,也同時(shí)符合PCS(Post-Compromise security,后向安全)躁倒。
Signal的核心技術(shù)是X3DH(3倍增加版的Diffie Hellman)荞怒,以及Double Ratchet(雙棘輪)
我打算分開兩篇文章詳解相關(guān)的技術(shù)細(xì)節(jié):
第一篇:簡(jiǎn)單講解相關(guān)的技術(shù)背景,以及代碼級(jí)別詳解X3DH秧秉。
第二篇:詳解Double Ratchet雙棘輪的算法褐桌。
下面開始第一篇,我們先講講剛剛提到的技術(shù)點(diǎn):FS前向安全象迎,PCS后向安全荧嵌,DH算法。然后再講密碼學(xué)中的HMAC, KDF, HKDF砾淌,這些跟雙棘輪有關(guān)完丽。然后再細(xì)講X3DH。
一些技術(shù)背景
Forward secrecy拇舀,前向安全
前向安全,一般人的理解是:如果某一輪的密鑰泄漏了蜻底,不會(huì)導(dǎo)致之前的消息被破解骄崩。但我查過一些相關(guān)的文獻(xiàn)聘鳞,如Wiki,Handbook of applied cryptography等要拂,定義可能比較多抠璃,綜合了一下,我更傾向于將前向安全定義為:
FS/前向安全 = 無論long-term key長(zhǎng)期密鑰脱惰,或者中期密鑰搏嗡,或者某輪密鑰泄露,都不會(huì)導(dǎo)致之前的消息被破解拉一。
Post-Compromise security / Future Secrecy / 后向安全
同樣采盒,我更傾向于將后向安全定義為:在密鑰Compromise之后, 在一定時(shí)間內(nèi)蔚润,可以恢復(fù)磅氨。(recovery from compromise)
DH (Diffie Hellman) / ECDH
這個(gè)到處都有說,不展開了嫡纠,最簡(jiǎn)單的理解是:
DH: A的私鑰 + B的公鑰 = 密鑰 = A的公鑰 + B的私鑰
ECDH就是基于橢圓曲線的Diffie Hellman烦租。
HMAC
全稱Hash-based Message Authentication Code,就是用于生成摘要除盏,驗(yàn)證消息完整性以及源身份叉橱。不再展開了。
KDF
KDF全稱是key derivation function者蠕,我也不知道怎么翻譯好窃祝。像上面說的DH出來的密鑰,其實(shí)不是離散均勻的蠢棱,更多情況下需要KDF或HKDF
HKDF
基于HMAC的KDF锌杀,細(xì)節(jié)可以看看其它文章,簡(jiǎn)單地說泻仙,就是
HKDF(key, salt, info) => T(0), T(1), T(2), T(..)個(gè)密鑰糕再。
X3DH
我們剛剛說了X3DH就是三倍的DH。從signal官方文檔說玉转,X3DH就是下圖的樣子:
圖中:
IKA:A的長(zhǎng)期Key Pair突想;
EKA:A的臨時(shí)Key Pair;
IKB:B的長(zhǎng)期Key Pair究抓;
SPKB:B的中期Key Pair猾担;
OPKB:B的臨時(shí)Key Pair;
圖中的1,2,3,4。其實(shí)就是做4次ECDH刺下。我們從代碼看看他是如何實(shí)現(xiàn)的绑嘹。
PS:我們拿Javascript的代碼,更好理解
我已經(jīng)在圖上標(biāo)注了如何做的橘茉。簡(jiǎn)單說工腋,就是:
Final = (DH1 + DH2 + DH3 + DH4)
值得注意的是姨丈,像上圖的虛線,X3DH并不一定需要OPKB擅腰,從代碼也可以看到蟋恬,ECDH4不一定會(huì)做。
Double Ratchet雙棘輪
上面說的內(nèi)容算是比較簡(jiǎn)單的趁冈,雙棘輪才是Signal的經(jīng)典歼争,我們將在下一篇文章詳細(xì)講解。如果你對(duì)HKDF渗勘,HMAC沐绒,X3DH還不太清楚,可以多看幾遍此文章呀邢。