本系列文章包含以下內(nèi)容
- 單向TLS不認(rèn)證,客戶端不檢查服務(wù)端證書的有效性
- 單向TLS認(rèn)證,客戶端檢查服務(wù)端證書的有效性
- 雙向TLS認(rèn)證,服務(wù)端驗(yàn)證客戶端證書的有效性
- 升級協(xié)議,在通信過程中升級成TLS通信
本系列文章中大寫C統(tǒng)一表示客戶端,大寫S表示服務(wù)器端。
簡介
TLS(Transport layer layer)是一種安全協(xié)議,目的為互聯(lián)網(wǎng)通信提供安全及完整性保障
定義摘自維基百科。
完整性保障很容易理解,C(客戶端)與S(服務(wù)器端)通信,客戶端發(fā)出信息[轉(zhuǎn)10000給張三],經(jīng)過網(wǎng)絡(luò)傳輸后,由于網(wǎng)絡(luò)丟包變成了[轉(zhuǎn)100塊給張三],客戶端估計(jì)會被張三揍哭。因此服務(wù)端(收到信息的一方)需要保證收到的信息確實(shí)一絲一毫都沒變。這就是完整性。
保證完整性通常通過哈希值來實(shí)現(xiàn)。比如我們可以設(shè)計(jì)一種弱雞的算法,計(jì)算字?jǐn)?shù)的個(gè)數(shù)作為哈希,那么信息變成了[轉(zhuǎn)10000塊給張三,10],其中10就是哈希值,那么如果服務(wù)端收到的信息是[轉(zhuǎn)100塊給張三,10],服務(wù)端檢查到哈希值不正確就知道消息在傳輸過程中發(fā)生了錯(cuò)誤。然而如果信息變成了[轉(zhuǎn)20000塊錢給張三,10],這個(gè)弱雞算法就不能幫助服務(wù)器檢查到這個(gè)錯(cuò)誤。因此哈希算法基礎(chǔ)的要求就是碰撞(給定信息1,構(gòu)造另一段信息2,使得2的哈希值與1相等)的難度。
什么是安全性呢?
安全性包含兩個(gè)方面,假定C是你,S是你女朋友。S給C發(fā)信息[給我打10000塊]。C的第一反應(yīng)是什么?是確認(rèn)S真的是你女朋友。因此安全性的第一個(gè)方面是確定雙方的通信身份。
假如C想給S回復(fù)[今晚XXXX不可描述],C需要確認(rèn)什么?一定是這段信息沒人在竊聽。這就是安全性的第二個(gè)方面。
如何解決第一個(gè)問題:C和S如何確定你真的是你? 在C和S互為男女朋友的情況下,C可以和S約定一下暗號,比如天王蓋地虎對小雞燉蘑菇,在每次通信之前先對一下暗號。
如果只有C和S通信,約定暗號自然是可行的。但是如果C或者S不只一個(gè)呢。比如有C1,C2,那么如果用同樣的暗號,C2知道暗號是什么后就可以欺騙S說自己是C1。如果都約定不同的暗號,那么假如有C1,C2,... ,C10000,那么就有S就需要記住10000個(gè)暗號,并且每新來一個(gè)C,就需要多記住一個(gè)暗號。
S表示,太累了?!敖o你們一段我的手寫體吧,以后你們驗(yàn)證筆跡一樣就能確定我是我了”
"筆跡,太容易偽造了吧!", 數(shù)學(xué)表示,"是時(shí)候看我展現(xiàn)真正的實(shí)力了!"
困難問題在數(shù)學(xué)中通常是"討厭"的存在,數(shù)學(xué)家們會窮盡畢生去解決。密碼學(xué)卻是數(shù)學(xué)中的一個(gè)有趣的分支,它反其道而行之,核心是去證明某個(gè)問題是困難的。什么是困難問題?民科定義就是在現(xiàn)有的公開的數(shù)學(xué)下,要解決這個(gè)問題得花成百上千年。專業(yè)術(shù)語表達(dá)是NP問題,或者從安全意義上說解決這個(gè)問題獲得的利益小于解決問題付出的代價(jià)。
"嘿嘿嘿,這道題你們做不出來,但是我有后門,我會做"。加密算法站了出來。
先用非對稱加密(加密密鑰和解密密鑰不相同)來解決你真的是你這個(gè)問題。
在非對稱算法中,有兩個(gè)密鑰,一個(gè)是公鑰,一個(gè)私鑰。通常情況下私鑰自己留著,公鑰給對外公開。私鑰加密后的信息,公鑰可以解密還原內(nèi)容。由公鑰以及已經(jīng)發(fā)生過的加密解密信息推算出私鑰是一個(gè)困難問題。
我們來嘗試構(gòu)造一個(gè)弱雞的非對稱算法,并假裝它是一個(gè)困難問題。
這個(gè)算法是這樣的,假定我們發(fā)出的信息只能是[1,2,3,4,5,...,10], 公鑰是10。并且我們自己保留私鑰7。加密算法是 (x+7)%17, 解密算法是 (x+10)%17。我們假裝通過10和已經(jīng)發(fā)生過的加解密的過程無法推算出私鑰7。
由于((x+7)%17+10)%17 = x, 比如對信息5加密,用私鑰7加密5+7=12,用公鑰10解密(12+10)%17=22%17=5, 就可以將信息還原。
有了這個(gè)算法,C需要驗(yàn)證S的身份只需要說一句,“嘿,6加密后的數(shù)據(jù)是什么”,S算了以下回復(fù),“13”,客戶端用公鑰運(yùn)算(13+10)%17果然是6,就可以快樂的回應(yīng),“來啦,老弟!”
在上面的場景中,有了非對稱密鑰算法,S可以換成說,“我的公鑰放在網(wǎng)上了,你們自己去拿,拿好以后,以后驗(yàn)證我私鑰加密過的信息解密后就確認(rèn)我是我了”。(注:這里不談及CA及信任鏈,默認(rèn)C拿到證書后可以確認(rèn)這個(gè)證書確實(shí)是S的證書)
如何解決第二個(gè)問題:C和S如何確保通信沒有被竊聽,或者即使被竊聽也不能聽懂內(nèi)容究竟是什么?
在互聯(lián)網(wǎng)環(huán)境下,保證第一條是不可能的,公開網(wǎng)絡(luò)中任何一個(gè)節(jié)點(diǎn)都有可能被抓包解析。非對稱加密通過私鑰加密信息在網(wǎng)上傳輸可以應(yīng)對這個(gè)問題。但這樣做有兩個(gè)缺點(diǎn):一個(gè)是非對稱加密通常相對比較慢,第二個(gè)問題是雖說非對稱加密是安全的,但架不住老是拿同樣的公鑰私鑰來傳輸大量的信息,這樣做會破壞它的安全性。因此,通常會選擇使用用公鑰溝通,得出一個(gè)在一次對話過程中使用的對稱加密(公鑰和私鑰相同)的密鑰來(密鑰交換協(xié)議),并在之后的通信中使用對稱加密算法來加密傳輸內(nèi)容,來保證傳輸過程的安全性。
對稱加密容易理解,這里不做多談。
注意:以上簡介均非規(guī)范描述,只是以簡化的形式來描述網(wǎng)絡(luò)通信面臨的安全問題以及解決的方法。
簡介中提到的對稱加密算法,非對稱加密算法,和沒有提及的如何在一次會話中采用安全的協(xié)議來溝通出對稱密鑰,均可以在維基百科上找到相應(yīng)的介紹。