新聞中心
寫在最前面

最近一段時(shí)間,國(guó)內(nèi)各大網(wǎng)站紛紛用上了https連接,在訪問這些網(wǎng)站的時(shí)候,很多瀏覽器會(huì)給予“特別關(guān)照”,給它們的鏈接旁邊加上一個(gè)綠色的小鎖,那么,什么是https,它與網(wǎng)絡(luò)安全又有什么關(guān)系呢?今天我們就來談?wù)刪ttps與tls(傳輸層安全)。
我不是計(jì)算機(jī)專業(yè)的學(xué)生,沒有系統(tǒng)學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)的知識(shí),寫這篇文章是因?yàn)橹敖o自己挖過一個(gè)坑不得不填上,文章內(nèi)容大部分來自于網(wǎng)絡(luò),我大概只是做了下整合,所以如果有什么錯(cuò)誤還請(qǐng)大家指出,謝謝。
http之罪,為什么不安全?
http協(xié)議在制定之初,其目的僅僅是為了方便地完成html網(wǎng)頁(yè)內(nèi)容的交換,沒有過多考慮安全性問題,http連接不進(jìn)行身份認(rèn)證,同時(shí)內(nèi)容是明文傳輸,因此采用http協(xié)議傳輸?shù)膬?nèi)容對(duì)于任何人來說都是公開的;這帶來了很嚴(yán)重的安全問題:如果有人創(chuàng)建一個(gè)開放熱點(diǎn),并對(duì)連接該熱點(diǎn)的用戶http數(shù)據(jù)進(jìn)行抓包,便可以輕松獲取用戶的用戶名、密碼或者其他敏感信息;這里有一個(gè)通過Wireshark抓包獲取用戶名、密碼的例子:Wireshark如何抓明文用戶名和密碼;其它情況下還可以做到的,諸如分析你瀏覽的頁(yè)面內(nèi)容、替換頁(yè)面內(nèi)容等等,在此不再一一舉例;
什么是https/TLS?
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版,它建立在SSL(Secure Sockets Layer 安全套接層)之上,其目的是保障網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)陌踩?。TLS(Transport Layer Security 傳輸層安全)是SSL的繼任者,從對(duì)應(yīng)關(guān)系上看應(yīng)該可以算是SSL的子集。可以說,目前的https都是基于TLS而得以實(shí)現(xiàn)的,因此下面我們就來著重講一講TLS的實(shí)現(xiàn)及其安全性。
TLS
一個(gè)形象的解釋(感謝知乎的天才老哥們)
生活中大家應(yīng)該都用過一種鎖,你可以用對(duì)應(yīng)的鑰匙打開它,打開之后如果拔出鑰匙,你將合不上鎖(我知道現(xiàn)在很多鎖拔出鑰匙后也能合上了,但請(qǐng)大家稍微配合一下_(:з)∠)_):
下面我們用鎖來講一個(gè)故事,幫助大家更好地理解TLS的工作方式。
A和B是分隔兩地的商業(yè)伙伴,兩地之間除了信件往來沒有其他的通訊方式,并且兩地之間的信件通行狀況非常糟糕,經(jīng)常有人偽裝成郵遞員私拆信件甚至更改信件內(nèi)容,曾經(jīng)也有人用普通鎖鎖上堅(jiān)固的盒子來快遞,但是并沒有安全的方法能把鑰匙安全地送給對(duì)方而不被中間人復(fù)制;A與B想要互通信件,但是又不想讓交流的內(nèi)容被別人知道;恰好兩人都了解有一個(gè)很聰明的人發(fā)明了一種鎖,這種鎖不同于以往,它需要用兩把鑰匙分別完成開鎖和合鎖的過程,一把鑰匙只能開不能合,另一把只能合不能開(非對(duì)稱加密),于是兩人在信件內(nèi)容沒有被篡改的情況下約定了一種交流方式:
* A現(xiàn)在手持一把特殊鎖{Special_Lock}和兩把對(duì)應(yīng)的鑰匙{Public_Key}(公鑰)與{Private_Key}(私鑰),其中{Public_Key}只能用來合鎖,{Private_Key}只能用來開鎖;首先A用私鑰打開{Special_Lock},并把打開的{Special_Lock}與{Public_Key}通過快遞寄給B; * B收到寄來的{Special_Lock}和{Public_Key}之后,把一把普通的鎖{Lock_B}(對(duì)稱加密)和鑰匙{Key_B1}裝到一個(gè)足夠堅(jiān)固不會(huì)被破壞的盒子里,用寄來的{Special_Lock}鎖上(鎖的時(shí)候需要用到{Public_Key}),并寄還給A,同時(shí)B手上還有這把普通鎖的備用鑰匙{Key_B2},它與{Key_B1}一模一樣;
* A收到B寄來的使用{Special_Lock}鎖著的包裹后,悄悄地拿出藏起來的{Private_Key},把特殊鎖打開,拿到了屬于B的{Lock_B}和能夠鎖上、打開這把鎖的{Key_B1},于是A很開心地寫了封“Hello world!”,找了個(gè)堅(jiān)固的盒子放了進(jìn)去,并且用{Lock_B}和對(duì)應(yīng)的鑰匙{Key_B1}鎖上了盒子,保留了{(lán)Key_B1}并把盒子寄還給了B * B收到快遞后,使用備用鑰匙{Key_B2}打開了鎖{Lock_B},得到了信件;
完成以上動(dòng)作之后:A擁有了B提供的鎖與鑰匙,此后兩人便可以用這個(gè)鎖來進(jìn)行安全的通信({Lock_B}的鑰匙只有兩人擁有),也就是說,兩人通過非對(duì)稱加密的方式協(xié)商了一個(gè){Lock_B}以及對(duì)應(yīng)的鑰匙{Key_B1}、{Key_B2},此后一直通過對(duì)稱加密{Lock_B}進(jìn)行通訊;
現(xiàn)在還有一點(diǎn)疑問,誠(chéng)然,有了第一步的特殊鎖之后,送信人員不可能打開這把鎖了(因?yàn)門A沒有私鑰{Private_Key}),但這還有一個(gè)問題,如果送信人員M悄悄扣留了A的特殊鎖及其公鑰,然后送給B一個(gè)自己的特殊鎖及其公鑰{FAKE_Special_Lock}和{FAKE_Public_Key},在B給A回信送{Lock_B}以及{Key_B1}的時(shí)候,M就可以用{FAKE_Private_Key}打開那個(gè)盒子,取出鎖和鑰匙,復(fù)制一份鑰匙,并用之前扣留的{Special_Lock}和{Public_Key}封裝起來還給A;經(jīng)過這個(gè)操作,M在兩者都不知情的情況下獲得了接下來A、B通信所需要使用的加密密碼{Key_B1};
對(duì)此TLS提出了一個(gè)解決辦法: * 找一個(gè)德高望重的人(CA),用他獨(dú)一無二的簽名給最初的A的那把{Special_Lock}做一個(gè)認(rèn)證:這把鎖是A所有——由“X”CA認(rèn)證;這名德高望重的人X恪守規(guī)矩——絕對(duì)不會(huì)給不是A的鎖作這個(gè)認(rèn)證;因?yàn)檫@位大人的簽名沒人能模仿,因此B收到特殊鎖之后只要看一眼簽名是不是發(fā)給A的就知道鎖有沒有被掉包過了,當(dāng)然前提是,A、B都信任這位德高望重的大人。
可是某一天A需要和一位與B住在同一城市的商業(yè)伙伴C聯(lián)系,A與C想要效仿之前的操作建立一個(gè)安全的聯(lián)系方式,但是C并不信任X這個(gè)人,因此B只好又找了個(gè)德高望重的人Y,A、B、C都信任這個(gè)Y先生;Y先生很忙,沒法直接認(rèn)證A的特殊鎖,因此Y僅僅簽名認(rèn)證了X,并委托X在鎖上加上了“X經(jīng)過Y的‘CA認(rèn)證,可以認(rèn)證鎖的從屬’”的字樣;下次C拿到{Special_Lock}之后,看到這行字,就選擇信任X對(duì)特殊鎖的認(rèn)證,并成功和A建立了加密通信;
A的商業(yè)伙伴越來越多,人們的信任關(guān)系錯(cuò)綜復(fù)雜,即使找來更有威望的Z給Y先生認(rèn)證,也終究不是辦法,最后人們選出了一個(gè)最有威望的人“ROOT”,并且大家約定,只要是“ROOT”認(rèn)證過的人或者是鎖,大家都無條件地信任;這位“ROOT”就是根CA,TA所寫的“ROOT認(rèn)證xxx”的內(nèi)容,稱為根證書。
至此信件的安全問題已經(jīng)被完美解決了,然而在實(shí)際操作中還有一些細(xì)節(jié),比如非對(duì)稱加密很復(fù)雜,消耗的計(jì)算時(shí)間較長(zhǎng),因此不用在正常的通信中,僅作為鏈接發(fā)起時(shí),協(xié)商對(duì)稱加密的密鑰時(shí)使用,正常通信是使用對(duì)稱加密進(jìn)行的。
非對(duì)稱加密
因?yàn)楸救藢?shí)在水平有限,因此這部整段搬運(yùn)了知乎用戶劉叔的文章非對(duì)稱加密算法與TLS中的內(nèi)容,侵刪……
RSA利用的核心思想就是大素?cái)?shù)分解的問題。這個(gè)問題雖然理解起來簡(jiǎn)單,但是破解起來非常難,以至于RSA至今為止仍舊是應(yīng)用最廣泛的非對(duì)稱加密算法。雖然描述起來是兩個(gè)大素?cái)?shù)分解因式,但是實(shí)際的實(shí)現(xiàn)相對(duì)復(fù)雜很多。不是任何的兩個(gè)大素?cái)?shù)都可以用,而必須要滿足一系列的條件。本書不是一本密碼學(xué)的書,不進(jìn)行深入探討。
數(shù)學(xué)上,RSA算法的原理非常簡(jiǎn)單(密文為X,明文為A):
加密:
解密:
也就是說加密和解密的運(yùn)算形式是完全一樣的,公式里面或者叫做離散對(duì)數(shù)。RSA算法的數(shù)學(xué)基礎(chǔ)就建立在已知其他值,D不可解的前提下。這里面E和N共同組成公鑰,D和N共同組成私鑰。所以整個(gè)加密算法剩下的唯一問題就是如何確定E,D,N三個(gè)字母了。
確定的方法是取兩個(gè)大素?cái)?shù)p和q。和相乘就是:N=pq。在計(jì)算和之前要計(jì)算一個(gè)中間值,這個(gè)值叫做:L=lcm(p-1,q-1)。lcm的意思是最小公倍數(shù),也就是說的值等于和的最小公倍數(shù)。下面就可以得到了:gcd(E,L)=1。gcd表示最大公約數(shù),也就是說的值為與互質(zhì)的數(shù)。這個(gè)數(shù)在數(shù)學(xué)上的求法并不是多么的高端,而是簡(jiǎn)單的隨機(jī)生成大數(shù),然后與求最大公約數(shù),看看結(jié)果是不是1。也就是說是一個(gè)暴力嘗試的方法。得到了E和N,我們就得到了公鑰了。D的值是根據(jù)E計(jì)算得到的:
解這個(gè)式子就可以得到D,也就是得到了私鑰。整個(gè)RSA過程就結(jié)束了。RSA的加密與解密非常的簡(jiǎn)介易懂,這也是其迅速普及的原因。廣泛使用的原因。整個(gè)RSA的安全性依賴于分解,N對(duì)外部是已知的,已知N的情況下,如果能分解得到N=pq,那么RSA就沒有安全性可言。所以也可以說整個(gè)RSA的安全性就依賴于大素?cái)?shù)分解因式了,當(dāng)然也可以說依賴于求離散對(duì)數(shù)問題,他們是一個(gè)問題的兩個(gè)方面,主要的破解方式是大素?cái)?shù)分解因式。主要依賴于離散對(duì)數(shù)安全性的非對(duì)稱加密算法是EIGamal算法。
ECC橢圓曲線
另一個(gè)常用的加密算法是ECC算法,采用橢圓曲線來構(gòu)造密鑰:
Server Key Exchange里面的最重要的參數(shù)就是ECDHE算法需要構(gòu)造的密碼學(xué)參數(shù)??梢钥吹揭粋€(gè)是橢圓曲線的名字:secp256r1。這個(gè)橢圓曲線不但在HTTPS中,還在比特幣中有廣泛的應(yīng)用,所有的橢圓曲線實(shí)際上都是方程:
這里面兩個(gè)參數(shù),這個(gè)橢圓曲線是一大類的曲線,對(duì)于secp256r1來說,a=0, b=7。所以對(duì)于secp256r1來說,這條曲線是,參數(shù)的取值并不是隨便取的,必須要滿足一定的條件,并且一條密碼學(xué)曲線都是固定取值的。不同的,會(huì)得到非常不一樣形狀的圖形,不同的圖形有不同的用途,我們這里討論的secp256r1曲線的圖形如下:
這條曲線的形狀如圖。在密碼學(xué)上,所有的橢圓曲線都是使用的有限域版本GF(p),所以p也是一個(gè)橢圓曲線的一個(gè)值。對(duì)于secp256k1來說,他的,橢圓曲線的方程是
橢圓曲線之所以被選擇出來是因?yàn)樗斜姸喾浅S幸馑嫉奶匦?,例如在橢圓曲線上拉一條直線,經(jīng)過三個(gè)點(diǎn),那三個(gè)點(diǎn)的和是0(那就看曲線怎么定義和這個(gè)操作了,這里是數(shù)論里的阿貝爾群)。本質(zhì)上,使用橢圓曲線是使用了橢圓曲線的性質(zhì)來得到一個(gè)數(shù)學(xué)運(yùn)算系統(tǒng),最終在參與密碼學(xué)計(jì)算的是數(shù)論系統(tǒng),與橢圓曲線就沒有太大關(guān)系了,但是仍然可以用曲線來理解,因?yàn)閿?shù)論運(yùn)算是基于橢圓曲線構(gòu)造的。
當(dāng)這個(gè)橢圓曲線算法用于非對(duì)稱加密的密鑰交換的時(shí)候,我們知道兩個(gè)人都能看到對(duì)方的公鑰,并且都知道自己的私鑰。橢圓曲線算法在使用的時(shí)候能夠看到與RSA的一個(gè)最大的不同,就是RSA需要一個(gè)私鑰,橢圓曲線并不需要。對(duì)于橢圓曲線做密鑰交換,每一次通信的私鑰和公鑰都是臨時(shí)生成的,這也是橢圓曲線比RSA安全性高的原因。因?yàn)镽SA一旦私鑰泄漏,歷史的加密數(shù)據(jù)都能破解,而橢圓曲線不能。每一次通信都用完全不同的私鑰公鑰對(duì)進(jìn)行信道協(xié)商。所以對(duì)于橢圓曲線來說,在每一次通信的時(shí)候都會(huì)首先生成這個(gè)私鑰和公鑰,生成私鑰的方法就是在橢圓曲線上取一個(gè)點(diǎn),根據(jù)上面說過的三點(diǎn)和等于0的特性,讓兩個(gè)點(diǎn)重合,重合之后,這條曲線就是橢圓的切線,與橢圓相交于兩個(gè)點(diǎn)。非切點(diǎn)的那個(gè)點(diǎn)就是私鑰,切點(diǎn)取反再多切線得到一個(gè)新的切點(diǎn),如果多次取反做切點(diǎn)就得到了公鑰點(diǎn)。Q=NG,G是私鑰點(diǎn),N是做切線的次數(shù),是公鑰。已知Q,算不出G,就是橢圓曲線生成公鑰私鑰的原理了。這里面對(duì)于橢圓曲線來說,N是一個(gè)公開的常數(shù),雙方都知道并且相同,也就是說,這個(gè)數(shù)學(xué)難題是已知了一個(gè)點(diǎn),求次反向的求切線運(yùn)算得到的那個(gè)點(diǎn)。這個(gè)點(diǎn)是計(jì)算難度上得不出來的。也就是說已知一點(diǎn)曲線上的切點(diǎn),得到切線的難度比已知一個(gè)隨意點(diǎn),對(duì)曲線做切線的計(jì)算度復(fù)雜很多,多到多次計(jì)算就是計(jì)算不可能問題。
當(dāng)橢圓曲線生成的公鑰和私鑰用于交換的時(shí)候,因?yàn)殡p方已經(jīng)互換了公鑰,這個(gè)計(jì)算過程就變成了雙方同時(shí)用自己的私鑰乘以對(duì)方的公鑰。橢圓曲線的神奇特性保證了得到的結(jié)果是一樣的,也就是說是得到了同一個(gè)點(diǎn)。這個(gè)點(diǎn)就是協(xié)商得到的對(duì)稱加密的密鑰。
總結(jié)
已經(jīng)寫昏了……總結(jié)先摸了,哪天想起來了再寫吧……
新聞標(biāo)題:TLS和HTTPS加密,公鑰私鑰體系
本文網(wǎng)址:http://www.5511xx.com/article/cdopgie.html


咨詢
建站咨詢
