網絡上常常有對RSA、DH算法,以及中間人攻擊的討論。
壹種說法是“RSA密鑰協商(交換)不會受到中間人攻擊”,聽起來似乎RSA比DH做密鑰協商更優。
這種說法有些不負責任。下面把這個問題中涉及到的概念都解釋壹下,再來看這個問題。
中間人攻擊,可以這樣解釋:攻擊者壹定程度上控制了網絡,成為網絡雙方通信的中間者,從而獲取到雙方的通信信息;而通信雙方都感知不到中間人的存在。
這個話題往往和加密通信壹起討論:如果加密信道中存在中間人,那明文就會被中間人獲取,而通信雙方還不會知曉。
中間人攻擊的根本,在於通信雙方沒有進行身份認證。即:不知道和自己直接通信的人是誰。如果雙方能確認直接通信的人就是對方,也就不存在中間人攻擊了。
RSA加密算法 是壹種非對稱加密技術。由壹對密鑰(公鑰+私鑰)組成。
可以利用私鑰來生成公鑰。
壹般來說,私鑰會被秘密保存起來,而公鑰則分發出去。
公鑰加密,私鑰解密,稱為RSA加密算法。 是為了保證公鑰加密的內容,只有私鑰持有者可以解密。常常用在客戶端賬密登錄過程:客戶端對密碼進行公鑰加密,發送到服務端後用私鑰解密,這樣即使請求被截獲也不會泄露密碼(實際上要更復雜壹些)。
私鑰加密,公鑰解密,稱為RSA簽名算法。 是為了保證公鑰持有者獲取的內容,確實是來自私鑰持有者的正確內容。比如服務器持有私鑰,將壹個重要信息計算hash再私鑰簽名後,和信息本身壹起發送到客戶端;客戶端用公鑰解密簽名得到hash值,再計算信息的hash值,進行比對,就知道內容是否被篡改。由於私鑰的保密性,攻擊者無法偽造有效的簽名。
DH密鑰交換算法 並不是 加密算法,而是雙方在不安全的網絡中交換信息而生成雙方僅有的密鑰的壹種方法。其結果是,交換的雙方得到了壹樣的會話密鑰,而其他任何人不能得到這個密鑰。
由於算法的結果是通信雙方擁有了壹樣的密鑰,雙方往往會利用這個密鑰進行 對稱 加密通信。
DH算法的過程可以簡單解釋如下:通信雙方AB,各自生成壹對DH密鑰(Pa,Sa)和(Pb,Sb)(P代表公鑰,S代表私鑰)。雙方交換各自的公鑰P,於是A持有Sa、Pb,B持有Sb、Pa。通過某種計算,Sa、Pb可以生成會話密鑰K,Sb、Pa也可以生成相同的K。
DH算法本身不包含身份認證機制,所以中間人攻擊是其明顯的問題。
設想:
在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就都不會發現他們的通信被劫持了。
密鑰協商(key establishment)包括“密鑰傳輸”(key transmission)和“密鑰交換”(key exchange)。
所謂RSA密鑰協商實際是密鑰傳輸,即壹方生成密鑰,傳遞給另壹方,而不必雙方交換。
具體來說,就是A自己生成壹個密鑰K,用自己的RSA公鑰加密,再傳遞給B;B用RSA私鑰解密得到K。僅就這個過程而言,不會存在中間人攻擊。
但是這不是說RSA就比DH就更安全了。設想上面的情況,必須先要令A持有RSA公鑰,B持有RSA私鑰。這首先先進行壹次RSA公鑰傳遞,而這個傳遞過程是存在中間人攻擊的。
設想:
B生成壹對RSA密鑰Pb、Sb,將公鑰Pb發送給A。而AB中有C。C截獲了Pb,而自己生成了壹對RSA密鑰Pc、Sc,將Pc發送給A。
A用Pc加密了會話密鑰K,發送給B,被C截獲。C用Sc解密得到K,再用Pb加密後給B。這時C完成了中間人攻擊。
所以說: RSA的公鑰在端與端間傳遞時,存在中間人攻擊問題。
RSA最好的使用場景在服務端/客戶端之間,服務端持有私鑰,客戶端直接內置好公鑰,就不用擔心中間人攻擊了。
平時我們使用的,號稱安全的https協議,也存在中間人攻擊問題。比如Fiddler這種抓包軟件,就能充當https通信中的中間人。
壹般上網時使用的https是 單向認證 ,即客戶端通過CA認證服務器持有有效證書,來確認其身份。服務器不會驗證客戶端的身份。
如果使用 雙向認證 ,通過CA確認兩端的身份都是正確的,就可以防止中間人攻擊了。這種雙向認證壹般出現在企業應用對接中。
網絡上有這樣壹種說法:
通信兩端交換RSA公鑰,通過對方公鑰加密數據,自己私鑰解密。這樣就實現了端到端加密。
實際上這 不是端到端加密 。因為不能保證服務器無法修改數據:服務器可以用公鑰來加密任何的數據發給兩端。
而且,按之前所說的,這種交換, 存在中間人攻擊問題 。