openssl是web安全通信的基石历谍,沒有openssl,可以說我們的信息都是在裸奔。要想了解openssl爆班,有幾個(gè)前置的概念需要先熟悉一下:
SSL
SSL的全名叫做secure socket layer(安全套接字層),最開始是由一家叫網(wǎng)景的互聯(lián)網(wǎng)公司開發(fā)出來辱姨,主要是防止信息在互聯(lián)網(wǎng)上傳輸?shù)臅r(shí)候不被竊聽或者篡改柿菩,后來網(wǎng)景公司提交SSL給ISOC組織做標(biāo)準(zhǔn)化,改名為TLS雨涛。
有些同學(xué)可能會好奇枢舶,說好好的數(shù)據(jù)怎么就被竊聽以及修改呢?這個(gè)其實(shí)是很容易的替久,如果你上網(wǎng)連得的是wifi凉泄,那么你的數(shù)據(jù)一定會經(jīng)過wifi路由器,通過對路由器做些手腳就可以拿到這些數(shù)據(jù)侣肄。
非對稱加密
在數(shù)學(xué)上有這樣一個(gè)現(xiàn)象:給兩個(gè)質(zhì)數(shù)旧困,很容易算出他們的乘積,但是給你一個(gè)很大的數(shù)稼锅,你很難分解出兩個(gè)質(zhì)數(shù)吼具,讓他們的乘積正好等于這個(gè)很大的數(shù)。
非對稱加密就是基于以上的現(xiàn)象產(chǎn)生的矩距,用一個(gè)密鑰對數(shù)據(jù)進(jìn)行加密拗盒,然后可以使用另外一個(gè)不同的密鑰對數(shù)據(jù)進(jìn)行解密,這兩個(gè)密鑰就是:公鑰和私鑰锥债。
公鑰和私鑰是可以相互推導(dǎo)的陡蝇,根據(jù)私鑰痊臭,你可以很容易的算出公鑰,但是根據(jù)公鑰登夫,你卻很難很難算出私鑰广匙,在互聯(lián)網(wǎng)上,私鑰一般由服務(wù)器掌握恼策,公鑰則由客戶端使用鸦致。根據(jù)公鑰,理論上需要花費(fèi)地球上所有的計(jì)算機(jī)計(jì)算數(shù)萬年才能算出私鑰涣楷,所以認(rèn)為是非常安全的分唾。
數(shù)字簽名
將報(bào)文使用一定的HASH算法算出一個(gè)固定位數(shù)的摘要信息,然后用私鑰將摘要加密狮斗,連同原來的報(bào)文一起绽乔,發(fā)送給接收者,接受者通過公鑰將摘要解出來碳褒,也通過HASH算法算出報(bào)文摘要折砸,如果兩個(gè)摘要一致,說明數(shù)據(jù)未被篡改沙峻,數(shù)據(jù)是完整的鞍爱。
因?yàn)榻邮照呤鞘褂霉€解出的數(shù)據(jù),如果數(shù)據(jù)完整专酗,證明發(fā)送數(shù)據(jù)的人持有私鑰睹逃,就能證明發(fā)送者的身份,因此數(shù)字簽名具有證明發(fā)送者身份和防篡改的功能祷肯。
數(shù)字證書
由CA頒發(fā)給網(wǎng)站的身份證書沉填,里面包含了該網(wǎng)站的公鑰,有效時(shí)間佑笋,網(wǎng)站的地址翼闹,CA的數(shù)字簽名等。
所謂的CA數(shù)字簽名蒋纬,實(shí)際上就是使用了CA的私鑰將網(wǎng)站的公鑰等信息進(jìn)行了簽名猎荠,當(dāng)客戶端請求服務(wù)器的時(shí)候,網(wǎng)站會把證書發(fā)給客戶端蜀备,客戶端首先可以通過CA的數(shù)字簽名校驗(yàn)CA的身份关摇,也能證明證書的真實(shí)完整性(之前說了,數(shù)字簽名擁有證明身份和防篡改的功能)碾阁。
客戶端有沒有可能到一個(gè)假冒的CA去校驗(yàn)數(shù)字證書呢输虱?不太可能,因?yàn)镃A的地址是內(nèi)嵌在瀏覽器中的脂凶,很難被篡改宪睹。
SSL如何保護(hù)數(shù)據(jù)
SSL保護(hù)數(shù)據(jù)的原理可以分為三部分
1)認(rèn)證用戶和服務(wù)器愁茁,確保數(shù)據(jù)發(fā)送到正確的客戶端和服務(wù)器;
2)加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊韧げ 鹅很;
3)維護(hù)數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過程中不被改變罪帖。
認(rèn)證用戶和服務(wù)器
現(xiàn)在來思考這樣的一個(gè)問題道宅,當(dāng)我們訪問百度的時(shí)候,我們怎么知道自己訪問的是真百度還是假百度胸蛛?是不是有可能有人劫持了我們訪問百度的請求,然后路由給了一臺他偽造的服務(wù)器樱报?
為了確定我們訪問的服務(wù)器沒有被偽造葬项,在SSL的通信流程中做了這樣一個(gè)規(guī)定:一旦我們向服務(wù)器發(fā)送了請求后,服務(wù)器必須返回它的數(shù)字證書迹蛤,當(dāng)我們拿到數(shù)字證書之后民珍,我們可以根據(jù)里面的ca數(shù)字簽名,校驗(yàn)證書的合法性(不是被偽造的)盗飒。
此時(shí)嚷量,我們只能夠證明證書確實(shí)是屬于百度的,但不代表發(fā)送給我們證書的服務(wù)器就是百度逆趣,怎么辦呢蝶溶?
在證書里面會帶有百度服務(wù)器的公鑰,在之后的通信當(dāng)中宣渗,客戶端會使用該公鑰加密數(shù)據(jù)給百度服務(wù)器抖所,百度服務(wù)器必須使用私鑰才能夠解出里面的數(shù)據(jù),假設(shè)百度服務(wù)器是假冒的痕囱,他一定沒有正確的私鑰田轧,那么之后的通信都無法進(jìn)行,所以假冒服務(wù)器是無法操作的鞍恢。
由此傻粘,SSL就解決了服務(wù)器認(rèn)證的問題。
加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊取
客戶端第一次給服務(wù)器發(fā)送請求的時(shí)候(拿到證書前的一次)帮掉,會在請求里面放一個(gè)隨機(jī)數(shù)C1弦悉,服務(wù)器在返回證書的響應(yīng)里也會帶一個(gè)隨機(jī)數(shù)F,客戶端拿到證書后蟆炊,會使用公鑰加密一個(gè)隨機(jī)數(shù)C2送給服務(wù)器警绩,這樣客戶端、服務(wù)器都擁有了三個(gè)隨機(jī)數(shù):C1盅称、F肩祥、C2后室,雙方使用這些隨機(jī)數(shù)和一個(gè)相同的算法生成一個(gè)對稱密鑰,之后所有的通信都使用這個(gè)對稱密鑰來進(jìn)行混狠。
這個(gè)密鑰會不會被泄露呢岸霹?不會,因?yàn)槊荑€是由3個(gè)隨機(jī)數(shù)產(chǎn)生的将饺,對于第一個(gè)隨機(jī)數(shù)C1贡避,他可能會被中間人監(jiān)聽到,然后第二個(gè)隨機(jī)數(shù)F予弧,也可能會被中間人監(jiān)聽到刮吧,但是第三個(gè)隨機(jī)數(shù)C2,因?yàn)槭怯霉€加密的掖蛤,除非中間人有私鑰杀捻,否則是不可能解出來的。
為什么要生成一個(gè)對稱密鑰來進(jìn)行數(shù)據(jù)通信呢蚓庭?因?yàn)榉菍ΨQ加密在解密的時(shí)候相當(dāng)耗費(fèi)性能致讥,換成對稱密鑰后,會好很多器赞。
維護(hù)數(shù)據(jù)的完整性
這個(gè)主要是針對服務(wù)器發(fā)送數(shù)字證書這一過程來說的垢袱,服務(wù)器的數(shù)字證書中含有ca數(shù)字簽名,可以很有效的保證證書的真實(shí)性和完整性(沒有被篡改)
openssl是什么
回過頭來港柜,我們來了解一下openssl请契,上面的SSL只是一個(gè)協(xié)議,openssl則是SSL的實(shí)現(xiàn)版夏醉,另外openssl還包含了公鑰私鑰的生成姚糊、摘要生成等各種工具。
openssl有什么使用場景
我們知道授舟,有些時(shí)候我們?yōu)g覽網(wǎng)站的時(shí)候會有一些廣告救恨,這些廣告什么的不一定是原網(wǎng)站掛上去的,也有可能是中間的運(yùn)營商在中間篡改了內(nèi)容導(dǎo)致的释树,可以使用https技術(shù)(一般是基于openssl)來對數(shù)據(jù)進(jìn)行加密肠槽,保證數(shù)據(jù)不被篡改。