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