兩臺主機(jī)通信的時候,如果是通過明文的方式通信的話兩者之間的數(shù)據(jù)很容易被截獲,兩臺主機(jī)要安全通信,需要在這兩者之間實(shí)現(xiàn)數(shù)據(jù)的加密。主要涉及到對稱加密、非對稱加密、哈希函數(shù)。
對稱加密
所謂對稱加密,即加密和解密使用相同的密鑰,這個密鑰可以理解為就是密碼。
這里A用一個對稱加密密鑰haha001加密了一個數(shù)據(jù),然后把加密之后的數(shù)據(jù)發(fā)送給B之后,因?yàn)槭羌用軘?shù)據(jù),所以B是打不開的。所以A需要把密碼告訴B才行,但是如何告訴B密鑰是haha001呢?這是一個問題,因?yàn)檫@個過程很可能被別人監(jiān)測到。
非對稱加密
對于非對稱加密算法來說,包括了2個密鑰一個是公鑰,一個是私鑰。公鑰是可以公開的,私鑰需要保護(hù)好。對于非對稱加密來說主要作用有兩個,一是數(shù)據(jù)加密,二是數(shù)字簽名。
數(shù)據(jù)加密
上圖里鎖的圖標(biāo)表示公鑰,鑰匙的圖標(biāo)表示私鑰。
- 第一步:B把公鑰發(fā)送給A
- 第二步:A用B的公鑰加密數(shù)據(jù)
- 第三步:A把加密后的數(shù)據(jù)發(fā)送給B
- 第四步:B用自己的私鑰對加密數(shù)據(jù)進(jìn)行解密。
因?yàn)閯e人獲取不到B的私鑰,所以在第三步里即使數(shù)據(jù)被截獲了也解密不了,因?yàn)橹挥蠦的私鑰才能解密。
如果把對稱加密和非對稱加密結(jié)合使用的話,這樣利用非對稱加密就可以解決了前面對稱加密算法中,對稱密鑰不方便傳輸?shù)膯栴}了。
- 第一步:B把公鑰發(fā)送給A。
- 第二步:A用B的公鑰加密對稱加密的密鑰haha001。
- 第三步:A把加密后的密鑰發(fā)送給B
- 第四步:B用自己的私鑰解密A發(fā)送過來的數(shù)據(jù),得到對稱加密的密鑰haha001。
- 第五步:B用haha001解密A發(fā)送過來的對稱加密的數(shù)據(jù)。
這樣A用對稱加密的數(shù)據(jù)發(fā)送給B之后,B也能順利的打開了。這種方式看起來安全,但其實(shí)很容易受到中間人攻擊,因?yàn)樵诘谝徊嚼镂覀兗僭O(shè)的是A獲取的就是B的公鑰,而不是別人冒充的。
下面我們看一下中間人攻擊的過程,這里假設(shè)C是壞人即中間人。
- 第一步:B把公鑰發(fā)送給A,但C把原本發(fā)送給A的公鑰截獲了,此時C有了B的公鑰。
- 第二步:C把自己的公鑰發(fā)送給A,但是宣稱是“B的公鑰”,A不明真相,以為就是B的公鑰
- 第三步:A用"B的公鑰"(其實(shí)是C的公鑰)加密對稱加密的密鑰
- 第四步:把加密后的對稱加密的密鑰發(fā)送給B,但是這個又被C截獲了。因?yàn)閷?shí)際用的是C的公鑰加密的,所以C用自己的私鑰是能夠解密的。此時C獲取了對稱加密的密鑰haha001。
- 第五步:C用B的公鑰加密對稱加密密鑰haha001,之后發(fā)送給B。
- 第六步:B用自己的私鑰解密數(shù)據(jù),得到對稱密鑰haha001。
- 到現(xiàn)在為止,A和B以為他們之間是直接溝通的,但是這當(dāng)中有個中間人C也獲取了對稱加密的密鑰。
- 第七步:A把用對稱加密后的數(shù)據(jù)發(fā)送給B,但也被C截獲了。因?yàn)镃知道了對稱加密密鑰,所以C是能看到數(shù)據(jù)里的內(nèi)容并做修改的。
- 第八步:C再次用對稱密鑰haha001加密數(shù)據(jù)之后轉(zhuǎn)發(fā)給B
第九步:B用對稱密鑰haha001解密數(shù)據(jù)。
整個過程A和B都以為他們是直接通信的,殊不知這中間所有的數(shù)據(jù)都被C看到了,這就是中間人攻擊。那么如何解決這個問題呢?我們先了解數(shù)字簽名。
數(shù)字簽名
數(shù)字簽名是私鑰加密數(shù)據(jù),公鑰解密數(shù)據(jù),先看下圖。
-
第1步:B先把公鑰發(fā)送給A,
-
第2步:B然后用哈希函數(shù)對所要傳輸?shù)臄?shù)據(jù)求得哈希值hash1。哈希函數(shù)的特點(diǎn)的是輸入不定長的值總是能得到定長的值。比如:
root@vms61:~# wc -c /etc/hosts
291 /etc/hosts
root@vms61:~# wc -c /etc/services
19183 /etc/services
root@vms61:~#
root@vms61:~#
root@vms61:~# md5sum /etc/hosts
219ebb29a192b6e41af2dc98865df58e /etc/hosts
root@vms61:~# md5sum /etc/services
567c100888518c1163b3462993de7d47 /etc/services
root@vms61:~#
-
第3步:B會用自己的私鑰對哈希值hash1進(jìn)行加密。
-
第4步:B把原始數(shù)據(jù)和加密后的哈希值發(fā)送給A。
-
第5步:A先用B的公鑰把收到的加密后的哈希值hash1解密,得到hash1,這個hash1和第2步生成的hash1是一樣的。
-
第6步:B會對收到的數(shù)據(jù)data求得哈希值hash2。
-
第7步:B對比hash1和hash2來判斷data在傳輸過程中是不是被修改過。如果兩個hash值是一樣的話,就說明數(shù)據(jù)data在傳輸過程中是沒有被修改的,如果兩個哈希值不一樣說明數(shù)據(jù)在傳輸過程中被修改過。
這里會帶來兩個問題:
- 第一:這里也會遇到中間人攻擊的問題,即第1步的公鑰被C截獲了,然后把自己的公鑰發(fā)送給了A。在第四步里,數(shù)據(jù)data和hash1被C截獲,然后C修改了data的數(shù)據(jù),然后求得哈希值之后用自己的私鑰做數(shù)據(jù)簽名。
其實(shí)所有的中間人攻擊的根本問題在于
- 第二,即使沒有中間人攻擊,B的密鑰對跟B這個主體之間沒有必然的聯(lián)系,因?yàn)锽可以隨時刪除掉自己的密鑰對,然后重新生成。
證書中心
在互聯(lián)網(wǎng)上存在一種權(quán)威機(jī)構(gòu)叫做證書中心(簡稱CA),一個前提就是我們都要信任CA。
前面講中間人攻擊的主要原因就是A獲取B的公鑰可能是假冒的,所以A不會信任別人發(fā)給他的公鑰的,且B也知道他直接把他自己生成的公鑰發(fā)給別人,別人也不信任,所以B不會再生成公鑰了。
- 第一步:B會用自己的私鑰生成一個證書請求文件(類似于申請書)
- 第二步:B把證書請求文件發(fā)送到CA去申請證書。
- 第三步:CA會審核B的身份,之后會頒發(fā)證書給B。這個證書其實(shí)就是公鑰,只是上面有了CA的數(shù)字簽名,以證明這個證書是CA頒發(fā)的。這一步解決了“數(shù)字簽名”部分B和他的密鑰對之間沒有必然聯(lián)系的問題,因?yàn)檫@里有CA來證明這個密鑰對就是B的,B不可抵賴。
- 第四步:B會把證書發(fā)送給A,說這是我的證書并且上面有CA的數(shù)字簽名,不會被別人偽冒。
- 第五步:A是持懷疑態(tài)度的,到底是不是真的是由CA頒發(fā)的,還是別人偽冒的呢?所以A要驗(yàn)證這個證書的真?zhèn)涡浴4藭rA需要CA的公鑰(像瀏覽器里都內(nèi)置了權(quán)威CA的公鑰的),然后會用權(quán)威CA的公鑰驗(yàn)證 B證書的公鑰上的數(shù)字簽名。
之后A會用B的證書加密對稱加密算法的密鑰發(fā)送給B,B用私鑰解密。這樣A和B之間就可以安全的傳輸數(shù)據(jù)了,整個過程叫做TLS(傳輸層安全)。 這里只有A驗(yàn)證了B的證書的合法性,所以叫做單向TLS。如果A也有自己的私鑰及CA頒發(fā)的證書,那么除了A要驗(yàn)證B證書的合法性之外,B也要驗(yàn)證A證書的合法性,即兩邊互相驗(yàn)證,這個就叫做mTLS(mutual TLS,雙向TLS)了。
|