背景
網(wǎng)絡(luò)上常常有對RSA衬鱼、DH算法业筏,以及中間人攻擊的討論。
一種說法是“RSA密鑰協(xié)商(交換)不會受到中間人攻擊”鸟赫,聽起來似乎RSA比DH做密鑰協(xié)商更優(yōu)蒜胖。
這種說法有些不負責(zé)任消别。下面把這個問題中涉及到的概念都解釋一下,再來看這個問題台谢。
中間人攻擊 MITM
(MITM) is an attack where the attacker secretly relays and possibly alters the communication between two parties who believe they are directly communicating with each other.
中間人攻擊寻狂,可以這樣解釋:攻擊者一定程度上控制了網(wǎng)絡(luò),成為網(wǎng)絡(luò)雙方通信的中間者朋沮,從而獲取到雙方的通信信息蛇券;而通信雙方都感知不到中間人的存在。
這個話題往往和加密通信一起討論:如果加密信道中存在中間人樊拓,那明文就會被中間人獲取纠亚,而通信雙方還不會知曉。
中間人攻擊的根本筋夏,在于通信雙方?jīng)]有進行身份認證蒂胞。即:不知道和自己直接通信的人是誰。如果雙方能確認直接通信的人就是對方条篷,也就不存在中間人攻擊了骗随。
RSA加密算法
RSA加密算法是一種非對稱加密技術(shù)。由一對密鑰(公鑰+私鑰)組成拥娄。
可以利用私鑰來生成公鑰蚊锹。
一般來說,私鑰會被秘密保存起來稚瘾,而公鑰則分發(fā)出去牡昆。
公鑰加密,私鑰解密摊欠,稱為RSA加密算法丢烘。是為了保證公鑰加密的內(nèi)容,只有私鑰持有者可以解密些椒。常常用在客戶端賬密登錄過程:客戶端對密碼進行公鑰加密播瞳,發(fā)送到服務(wù)端后用私鑰解密,這樣即使請求被截獲也不會泄露密碼(實際上要更復(fù)雜一些)免糕。
私鑰加密赢乓,公鑰解密,稱為RSA簽名算法石窑。是為了保證公鑰持有者獲取的內(nèi)容牌芋,確實是來自私鑰持有者的正確內(nèi)容。比如服務(wù)器持有私鑰松逊,將一個重要信息計算hash再私鑰簽名后躺屁,和信息本身一起發(fā)送到客戶端;客戶端用公鑰解密簽名得到hash值经宏,再計算信息的hash值犀暑,進行比對驯击,就知道內(nèi)容是否被篡改。由于私鑰的保密性耐亏,攻擊者無法偽造有效的簽名徊都。
DH密鑰交換算法
DH密鑰交換算法并不是加密算法,而是雙方在不安全的網(wǎng)絡(luò)中交換信息而生成雙方僅有的密鑰的一種方法苹熏。其結(jié)果是碟贾,交換的雙方得到了一樣的會話密鑰,而其他任何人不能得到這個密鑰轨域。
由于算法的結(jié)果是通信雙方擁有了一樣的密鑰,雙方往往會利用這個密鑰進行對稱加密通信杀餐。
DH算法的過程可以簡單解釋如下:通信雙方AB干发,各自生成一對DH密鑰(Pa,Sa)和(Pb,Sb)(P代表公鑰,S代表私鑰)史翘。雙方交換各自的公鑰P枉长,于是A持有Sa、Pb琼讽,B持有Sb必峰、Pa。通過某種計算钻蹬,Sa吼蚁、Pb可以生成會話密鑰K,Sb问欠、Pa也可以生成相同的K肝匆。
DH的問題:中間人攻擊
DH算法本身不包含身份認證機制,所以中間人攻擊是其明顯的問題顺献。
設(shè)想:
在AB間旗国,有一C。AB交換DH公鑰P時注整,C在中間截獲能曾;C自己生成一對DH密鑰(Pc,Sc),用Pc和A肿轨、B完成密鑰交換寿冕。于是C與A間有了會話密鑰Kac=f(Pa,Sc)=f(Pc, Sa),C與B間有了會話密鑰Kcb=f(Pb,Sc)=f(Pc, Sb)萝招。只要C從一方獲得的信息蚂斤,重新加密后傳遞給另一方,AB就都不會發(fā)現(xiàn)他們的通信被劫持了槐沼。
RSA密鑰協(xié)商
密鑰協(xié)商(key establishment)包括“密鑰傳輸”(key transmission)和“密鑰交換”(key exchange)曙蒸。
所謂RSA密鑰協(xié)商實際是密鑰傳輸捌治,即一方生成密鑰,傳遞給另一方纽窟,而不必雙方交換肖油。
具體來說,就是A自己生成一個密鑰K臂港,用自己的RSA公鑰加密森枪,再傳遞給B;B用RSA私鑰解密得到K审孽。僅就這個過程而言县袱,不會存在中間人攻擊。
但是這不是說RSA就比DH就更安全了佑力。設(shè)想上面的情況式散,必須先要令A(yù)持有RSA公鑰,B持有RSA私鑰打颤。這首先先進行一次RSA公鑰傳遞暴拄,而這個傳遞過程是存在中間人攻擊的。
設(shè)想:
B生成一對RSA密鑰Pb编饺、Sb乖篷,將公鑰Pb發(fā)送給A。而AB中有C透且。C截獲了Pb撕蔼,而自己生成了一對RSA密鑰Pc、Sc石蔗,將Pc發(fā)送給A罕邀。
A用Pc加密了會話密鑰K,發(fā)送給B养距,被C截獲诉探。C用Sc解密得到K,再用Pb加密后給B棍厌。這時C完成了中間人攻擊肾胯。
所以說:RSA的公鑰在端與端間傳遞時,存在中間人攻擊問題耘纱。
RSA最好的使用場景在服務(wù)端/客戶端之間敬肚,服務(wù)端持有私鑰,客戶端直接內(nèi)置好公鑰束析,就不用擔(dān)心中間人攻擊了艳馒。
HTTPS中的中間人攻擊
平時我們使用的,號稱安全的https協(xié)議,也存在中間人攻擊問題弄慰。比如Fiddler這種抓包軟件第美,就能充當(dāng)https通信中的中間人。
一般上網(wǎng)時使用的https是單向認證陆爽,即客戶端通過CA認證服務(wù)器持有有效證書什往,來確認其身份。服務(wù)器不會驗證客戶端的身份慌闭。
如果使用雙向認證别威,通過CA確認兩端的身份都是正確的,就可以防止中間人攻擊了驴剔。這種雙向認證一般出現(xiàn)在企業(yè)應(yīng)用對接中省古。
RSA公鑰交換:非端到端加密
網(wǎng)絡(luò)上有這樣一種說法:
通信兩端交換RSA公鑰,通過對方公鑰加密數(shù)據(jù)仔拟,自己私鑰解密衫樊。這樣就實現(xiàn)了端到端加密。
實際上這不是端到端加密利花。因為不能保證服務(wù)器無法修改數(shù)據(jù):服務(wù)器可以用公鑰來加密任何的數(shù)據(jù)發(fā)給兩端。
而且载佳,按之前所說的炒事,這種交換,存在中間人攻擊問題蔫慧。