1.基本概念
密碼(cipher)
密碼學(xué)中的密碼(cipher)和我們?nèi)粘I钪兴f(shuō)的密碼不太一樣,
計(jì)算機(jī)術(shù)語(yǔ)『密碼 cipher』
是一種用于加密或者解密的算法鸦难,
而我們?nèi)粘K褂玫摹好艽a password』是一種口令根吁,
它是用于認(rèn)證用途的一組文本字符串,這里我們要討論的是前者:cipher合蔽。
明文/密文
明文(plaintext)是加密之前的原始數(shù)據(jù)击敌,
密文(ciphertext)是通過(guò)密碼(cipher)運(yùn)算后得到的結(jié)果成為密文
密鑰(key)
密鑰是一種參數(shù),它是在使用密碼(cipher)算法過(guò)程中輸入的參數(shù)拴事。
同一個(gè)明文在相同的密碼算法和不同的密鑰計(jì)算下會(huì)產(chǎn)生不同的密文沃斤。
很多知名的密碼算法都是公開(kāi)的,密鑰才是決定密文是否安全的重要參數(shù)刃宵,通常密鑰越長(zhǎng)衡瓶,破解的難度越大,比如一個(gè)8位的密鑰最多有256種情況牲证,使用窮舉法哮针,能非常輕易的破解,知名的DES算法使用56位的密鑰坦袍,目前已經(jīng)不是一種安全的加密算法了十厢,主要還是因?yàn)?6位的密鑰太短,在數(shù)小時(shí)內(nèi)就可以被破解捂齐。
密鑰分為對(duì)稱密鑰與非對(duì)稱密鑰蛮放。
對(duì)稱密鑰/共享密鑰加密
對(duì)稱密鑰(Symmetric-key algorithm)又稱為共享密鑰加密,對(duì)稱密鑰在加密和解密的過(guò)程中使用的密鑰是相同的奠宜,
常見(jiàn)的對(duì)稱加密算法有DES包颁、3DES、AES压真、RC5徘六、RC6。
優(yōu)點(diǎn)是榴都,計(jì)算速度快待锈,如果每個(gè)客戶端與服務(wù)端單獨(dú)維護(hù)一個(gè)密鑰,那么服務(wù)端需要管理的密鑰將是成千上萬(wàn)嘴高,這會(huì)給服務(wù)端帶來(lái)噩夢(mèng)竿音。
缺點(diǎn)是,密鑰需要在通訊的兩端共享拴驮,讓彼此知道密鑰是什么對(duì)方才能正確解密春瞬,如果所有客戶端都共享同一個(gè)密鑰,那么這個(gè)密鑰就像萬(wàn)能鑰匙一樣套啤,可以憑借一個(gè)密鑰破解所有人的密文了宽气。
對(duì)稱密碼.png
非對(duì)稱密鑰
非對(duì)稱密鑰(public-key cryptography)随常,又稱為公開(kāi)密鑰加密,
服務(wù)端會(huì)生成一對(duì)密鑰萄涯,一個(gè)私鑰保存在服務(wù)端绪氛,僅自己知道,另一個(gè)是公鑰涝影,公鑰可以自由發(fā)布供任何人使用枣察。
客戶端的明文通過(guò)公鑰加密后的密文需要用私鑰解密。
非對(duì)稱密鑰在加密和解密的過(guò)程的使用的密鑰是不同的密鑰燃逻,加密和解密是不對(duì)稱的序目,所以稱之為非對(duì)稱加密。
與對(duì)稱密鑰加密相比伯襟,非對(duì)稱加密無(wú)需在客戶端和服務(wù)端之間共享密鑰猿涨,只要私鑰不發(fā)給任何用戶,即使公鑰在網(wǎng)上被截獲姆怪,也無(wú)法被解密叛赚,僅有被竊取的公鑰是沒(méi)有任何用處的。
常見(jiàn)的非對(duì)稱加密有RSA片效,非對(duì)稱加解密的過(guò)程:
1.服務(wù)端生成配對(duì)的公鑰和私鑰
2.私鑰保存在服務(wù)端红伦,公鑰發(fā)送給客戶端
3.客戶端使用公鑰加密明文傳輸給服務(wù)端
4.服務(wù)端使用私鑰解密密文得到明文
公鑰密碼.png
數(shù)字簽名(非對(duì)稱加密)
數(shù)據(jù)在瀏覽器和服務(wù)器之間傳輸時(shí)英古,有可能在傳輸過(guò)程中被冒充的盜賊把內(nèi)容替換了淀衣,
那么如何保證數(shù)據(jù)是真實(shí)服務(wù)器發(fā)送的而不被調(diào)包呢,同時(shí)如何保證傳輸?shù)臄?shù)據(jù)沒(méi)有被人篡改呢召调,
要解決這兩個(gè)問(wèn)題就必須用到數(shù)字簽名膨桥,
數(shù)字簽名就如同日常生活的中的簽名一樣,一旦在合同書(shū)上落下了你的大名唠叛,
從法律意義上就確定是你本人簽的字兒只嚣,這是任何人都沒(méi)法仿造的,因?yàn)檫@是你專有的手跡艺沼,任何人是造不出來(lái)的册舞。
那么在計(jì)算機(jī)中的數(shù)字簽名怎么回事呢?
數(shù)字簽名就是用于驗(yàn)證傳輸?shù)膬?nèi)容是不是真實(shí)服務(wù)器發(fā)送的數(shù)據(jù)障般,發(fā)送的數(shù)據(jù)有沒(méi)有被篡改過(guò)调鲸,
它就干這兩件事,是非對(duì)稱加密的一種應(yīng)用場(chǎng)景挽荡。
不過(guò)他是反過(guò)來(lái)用私鑰來(lái)加密藐石,通過(guò)與之配對(duì)的公鑰來(lái)解密。
(1)發(fā)送報(bào)文時(shí)定拟,發(fā)送方用一個(gè)哈希函數(shù)從報(bào)文文本中生成報(bào)文摘要,
然后用自己的私人密鑰對(duì)這個(gè)摘要進(jìn)行加密于微,
這個(gè)加密后的摘要將作為報(bào)文的數(shù)字簽名和報(bào)文一起發(fā)送給接收方,
(2)接收方首先用與發(fā)送方一樣的哈希函數(shù)從接收到的原始報(bào)文中計(jì)算出報(bào)文摘要,
接著再用發(fā)送方的公用密鑰來(lái)對(duì)報(bào)文附加的數(shù)字簽名進(jìn)行解密株依,
如果這兩個(gè)摘要相同驱证、那么接收方就能確認(rèn)該數(shù)字簽名是發(fā)送方的。
生成簽名和驗(yàn)證簽名.png
數(shù)字證書(shū)(Certificate Authority)
數(shù)字證書(shū)簡(jiǎn)稱CA勺三,它由權(quán)威機(jī)構(gòu)給某網(wǎng)站頒發(fā)的一種認(rèn)可憑證雷滚,這個(gè)憑證是被大家(瀏覽器)所認(rèn)可的。
全世界范圍內(nèi)可以發(fā)放安全證書(shū)的第三方機(jī)構(gòu)就2-3個(gè)吗坚,而全世界有那么多的公司或網(wǎng)站需要申請(qǐng)證書(shū)祈远。
#如何知道某個(gè)證書(shū)是否可信任呢?
其實(shí)安全證書(shū)有分根證書(shū)商源、子證書(shū)车份、子子證書(shū),不同等級(jí)的信任范圍牡彻。
通常根證書(shū)是由最上面的第三方機(jī)構(gòu)頒發(fā)給自己的扫沼,
根證書(shū)下面的一級(jí)子證書(shū)通常是頒發(fā)給其下的代理公司的,
而如果你的網(wǎng)站是從代理公司申請(qǐng)的庄吼,那么你證書(shū)將會(huì)是一個(gè)二級(jí)子證書(shū)缎除。
而在認(rèn)證證書(shū)的時(shí)候, 操作系統(tǒng)或者程序會(huì)去檢查該證書(shū)此前是否已經(jīng)被信任過(guò)总寻,
或者該證書(shū)的上級(jí)證書(shū)(父級(jí)器罐、父父級(jí)等等)是否被信任過(guò)。
只要有一個(gè)等級(jí)的證書(shū)被信任過(guò)渐行,則認(rèn)為該證書(shū)是可信任的轰坊。
具體證書(shū)是否可信任是根據(jù)系統(tǒng)或者程序是否已安裝并信任了該證書(shū)。
通常操作系統(tǒng)都會(huì)預(yù)裝頂級(jí)證書(shū)機(jī)構(gòu)的根證書(shū)祟印,
所以只要你訪問(wèn)的網(wǎng)站證書(shū)是從這幾個(gè)頂級(jí)第三方機(jī)構(gòu)或其代理申請(qǐng)的肴沫,
那么就會(huì)被直接信任無(wú)需你去手動(dòng)下載和安裝。
#為什么需要用數(shù)字證書(shū)呢蕴忆,難道有了數(shù)字簽名還不夠安全嗎颤芬?
有這樣一種情況,就是瀏覽器無(wú)法確定所有的真實(shí)服務(wù)器是不是真的是真實(shí)的套鹅,
舉一個(gè)簡(jiǎn)單的例子:
A廠家給你們家安裝鎖站蝠,同時(shí)把鑰匙也交給你,只要鑰匙能打開(kāi)鎖芋哭,你就可以確定鑰匙和鎖是配對(duì)的沉衣,如果有人把鑰匙換了或者把鎖換了,你是打不開(kāi)門的减牺,你就知道肯定被竊取了豌习,
但是如果有人把鎖和鑰匙替換成另一套表面看起來(lái)差不多的存谎,但質(zhì)量差很多的,雖然鑰匙和鎖配套肥隆,但是你卻不能確定這是否真的是A廠家給你的既荚,
那么這時(shí)候,你可以找質(zhì)檢部門來(lái)檢驗(yàn)一下栋艳,這套鎖是不是真的來(lái)自于A廠家恰聘,質(zhì)檢部門是權(quán)威機(jī)構(gòu),他說(shuō)的話是可以被公眾認(rèn)可的吸占。
同樣的晴叨, 因?yàn)槿绻腥耍◤埲┯米约旱墓€把真實(shí)服務(wù)器發(fā)送給瀏覽器的公鑰替換了,
于是張三用自己的私鑰執(zhí)行相同的步驟對(duì)文本Hash矾屯、數(shù)字簽名兼蕊,最后得到的結(jié)果都沒(méi)什么問(wèn)題,
但事實(shí)上瀏覽器看到的東西卻不是真實(shí)服務(wù)器給的件蚕,而是被張三從里到外(公鑰到私鑰)換了一通孙技。
那么如何保證你現(xiàn)在使用的公鑰就是真實(shí)服務(wù)器發(fā)給你的呢?
我們就用數(shù)字證書(shū)來(lái)解決這個(gè)問(wèn)題排作。
數(shù)字證書(shū)一般由數(shù)字證書(shū)認(rèn)證機(jī)構(gòu)(Certificate Authority)頒發(fā)牵啦,
證書(shū)里面包含了真實(shí)服務(wù)器的公鑰和網(wǎng)站的一些其他信息,
數(shù)字證書(shū)機(jī)構(gòu)用自己的私鑰加密后發(fā)給瀏覽器妄痪,
瀏覽器使用數(shù)字證書(shū)機(jī)構(gòu)的公鑰解密后得到真實(shí)服務(wù)器的公鑰哈雏。
這個(gè)過(guò)程是建立在被大家所認(rèn)可的證書(shū)機(jī)構(gòu)之上得到的公鑰,所以這是一種安全的方式拌夏。
消息發(fā)送者利用認(rèn)證機(jī)構(gòu)向消息接收者發(fā)送密文.png
SSL/TLS
SSL(Secure Sockets Layer僧著,安全套接層)是1994年由網(wǎng)景公司(Netscape)設(shè)計(jì)的一種協(xié)議履因,并在該公司的Web瀏覽器上進(jìn)行了實(shí)現(xiàn)障簿。
隨后,很多Web瀏覽器都采用了這一協(xié)議栅迄,使其成為了事實(shí)上的行業(yè)標(biāo)準(zhǔn)站故。
SSL已經(jīng)于1995年發(fā)布了3.0版本,但在2014年毅舆,SSL3.0協(xié)議被發(fā)現(xiàn)存在可能導(dǎo)致POODLE攻擊的安全漏洞西篓,因此SSL3.0已經(jīng)不安全了。
TLS(Transport Layer Security 荐捻,傳輸層安全)是IETF在SSL3.0的基礎(chǔ)上設(shè)計(jì)的協(xié)議否纬。在1999年作為RFC2246發(fā)布的TLS1.0贞远,實(shí)際上相當(dāng)于SSL3.1。
2006年吮成,TLS1.1以以RFC4346的形式發(fā)布橱乱,這個(gè)版本中增加了針對(duì)CBC攻擊的策略并加入了AES對(duì)稱加密算法。TLS1.2中新增了對(duì)GCM粱甫、CCM認(rèn)證加密的支持泳叠,此外還新增了HMAC-SHA256,并刪除了IDEA和DES茶宵,將偽隨機(jī)函數(shù)(PRF)改為基于SHA-256來(lái)實(shí)現(xiàn)危纫。
查看openssl證書(shū)
/etc/pki/CA
newcerts 存放CA簽署(頒發(fā))過(guò)的數(shù)字證書(shū)(證書(shū)備份目錄)
private 用于存放CA的私鑰
crl 吊銷的證書(shū)
/etc/pki/tls
openssl.cnf openssl的CA主配置文件
private 證書(shū)密鑰存放目錄
cert.pem 軟鏈接到certs/ca-bundle.crt
查看TLS版本
centos/redhat:
yum info gnutls
debian
dpkg -l|grep gnutls
查看linux是否支持TLS1.0, TLS1.1及TLS1.2
openssl s_client -connect intl.jdair.net:443 -tls1
openssl s_client -connect intl.jdair.net:443 -tls1_1
openssl s_client -connect intl.jdair.net:443 -tls1_2
SSL/TLS的工作
我們想要實(shí)現(xiàn)通過(guò)本地的Web瀏覽器訪問(wèn)網(wǎng)絡(luò)上的Web服務(wù)器,并進(jìn)行安全通信乌庶。
舉個(gè)例子來(lái)說(shuō)就是种蝶,用戶希望通過(guò)Web瀏覽器向xx銀行發(fā)送信用卡號(hào)。在這里瞒大,我們有幾個(gè)必須要解決的問(wèn)題蛤吓。
(1)用戶的信用卡號(hào)和地址在發(fā)送到xx銀行的過(guò)程中不能被竊聽(tīng)。
(2)用戶的信用卡號(hào)和地址在發(fā)送到xx銀行的過(guò)程中不能被篡改糠赦。
(3)確認(rèn)通信對(duì)方的Web服務(wù)器是真正的xx銀行会傲。
在這里,
(1)是機(jī)密性問(wèn)題拙泽,
(2)是完整性問(wèn)題淌山,
(3)則是認(rèn)證的問(wèn)題。
要確保機(jī)密性顾瞻,可以使用對(duì)稱密碼泼疑。
由于對(duì)稱密碼的密鑰不能被攻擊者預(yù)測(cè),因此我們使用偽隨機(jī)數(shù)生成器來(lái)生成密鑰荷荤。
若要將對(duì)稱密碼的密鑰發(fā)送給通信對(duì)象退渗,可以使用公鑰密碼或者Diffie-Hellman密鑰交換。
要識(shí)別篡改蕴纳,對(duì)數(shù)據(jù)進(jìn)行認(rèn)證会油,可以使用消息認(rèn)證碼。消息認(rèn)證碼是使用單向散列函數(shù)來(lái)實(shí)現(xiàn)的古毛。
要對(duì)通信對(duì)象進(jìn)行認(rèn)證翻翩,可以使用對(duì)公鑰加上數(shù)字簽名所生成的證書(shū)。
SSL/TLS就是將對(duì)稱密碼稻薇、公鑰密碼嫂冻、單向散列函數(shù)、
消息認(rèn)證碼塞椎、偽隨機(jī)數(shù)生成器桨仿、數(shù)字簽名等技術(shù)相結(jié)合來(lái)實(shí)現(xiàn)安全通信的。
TLS加密套件
https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml
TLS定義了幾百個(gè)加密套件案狠,可是在HTTP2面前基本都被否定了服傍,列入了加密套件黑名單暇昂。
剩余的加密套件中,有20來(lái)個(gè)是被推薦的伴嗡,還有二十來(lái)個(gè)沒(méi)有被推薦
實(shí)現(xiàn)TLS1.2的話急波,下述加密套件中的一個(gè)是必要的:
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384瘪校,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
另外澄暮,還要為了兼容性實(shí)現(xiàn)一下HTTP2黑名單中的部分套件:
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA阱扬,
TLS_RSA_WITH_AES_128_CBC_SHA泣懊,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA
不安全協(xié)議類型
FTP
Telnet
SSL1.0
SSL2.0
SSL3.0
TLS1.0
2.https(HyperText Transfer Protocol over Secure Socket Layer)
概念
是一種網(wǎng)絡(luò)安全傳輸協(xié)議, HTTPS麻惶,也稱作HTTP over TLS馍刮。
TLS的前身是SSL,
TLS 1.0通常被標(biāo)示為SSL 3.1窃蹋,
TLS 1.1為SSL 3.2卡啰,
TLS 1.2為SSL 3.3。
HTTPS是位于安全層之上的HTTP警没,這個(gè)安全層位于TCP之上
http & https.png
HTTP的幾個(gè)缺點(diǎn)
HTTP協(xié)議的實(shí)現(xiàn)本身非常簡(jiǎn)單匈辱,不論是誰(shuí)發(fā)過(guò)來(lái)的請(qǐng)求都會(huì)返回響應(yīng),因此不確認(rèn)通信方杀迹,會(huì)存在以下隱患:
>> 無(wú)法確認(rèn)請(qǐng)求發(fā)送至目標(biāo)的Web服務(wù)器是否是按真實(shí)意圖返回響應(yīng)的那臺(tái)服務(wù)器亡脸。有可能是偽裝的Web服務(wù)器。
>> 無(wú)法確認(rèn)響應(yīng)返回到的客戶端是否是按真實(shí)意圖接收響應(yīng)的那個(gè)客戶端树酪,有可能是偽裝的客戶端浅碾。
>> 無(wú)法確定正在通信的對(duì)方是否具備訪問(wèn)權(quán)限,因?yàn)槟承¦eb服務(wù)器上保存著重要的信息续语,只想發(fā)給特定用戶通信的權(quán)限垂谢。
>> 無(wú)法判斷請(qǐng)求是來(lái)自何方,出自何手绵载。
>> 有人在通信的過(guò)程中抓取到了數(shù)據(jù)包, 可能導(dǎo)致數(shù)據(jù)被竊取埂陆。
即使是無(wú)意義的請(qǐng)求也會(huì)照單全收苛白。無(wú)法阻止海量請(qǐng)求下的DoS攻擊娃豹。
http傳輸中信息可能被篡改.png
https相關(guān)加密算法
HTTPS一般使用的加密與HASH算法如下:
>> 非對(duì)稱加密算法:RSA,DSA/DSS
>> 對(duì)稱加密算法:AES购裙,RC4懂版,3DES
>> HASH 算法:MD5,SHA1躏率,SHA256
其中
>> 非對(duì)稱加密算法用于在握手過(guò)程中加密生成的密碼(即對(duì)稱加密中的秘鑰)躯畴,
>> 對(duì)稱加密算法用于對(duì)真正傳輸?shù)臄?shù)據(jù)進(jìn)行加密民鼓,
>> HASH 算法用于驗(yàn)證數(shù)據(jù)的完整性。
由于瀏覽器生成的密碼是整個(gè)數(shù)據(jù)加密的關(guān)鍵蓬抄,因此在傳輸?shù)臅r(shí)候使用了非對(duì)稱加密算法對(duì)其加密丰嘉。
非對(duì)稱加密算法會(huì)生成公鑰和私鑰,公鑰只能用于加密數(shù)據(jù)嚷缭,因此可以隨意傳輸饮亏。
而網(wǎng)站的私鑰用于對(duì)數(shù)據(jù)進(jìn)行解密,所以網(wǎng)站都會(huì)非常小心的保管自己的私鑰阅爽,防止泄漏路幸。
TLS握手過(guò)程中如果有任何錯(cuò)誤,都會(huì)使加密連接斷開(kāi)付翁,從而阻止了隱私信息的傳輸
https中非對(duì)稱加密
https握手過(guò)程
圖片.png
SSL 的握手協(xié)議非常有效的讓客戶和服務(wù)器之間完成相互之間的身份認(rèn)證简肴,其主要過(guò)程如下:
1.客戶端向服務(wù)器請(qǐng)求HTTPS連接:
客戶端向服務(wù)器傳送客戶端 SSL 協(xié)議的版本號(hào),加密算法的種類百侧,
產(chǎn)生的隨機(jī)數(shù)砰识,以及其他服務(wù)器和客戶端之間通訊所需要的各種信息。
2.服務(wù)器確認(rèn)并返回證書(shū)佣渴。
服務(wù)器向客戶端傳送 SSL 協(xié)議的版本號(hào)仍翰,加密算法的種類,
隨機(jī)數(shù)以及其他相關(guān)信息观话,同時(shí)服務(wù)器還將向客戶端傳送自己的證書(shū)予借。
3.客戶端驗(yàn)證服務(wù)器發(fā)來(lái)的證書(shū)。
客戶端利用服務(wù)器傳過(guò)來(lái)的信息驗(yàn)證服務(wù)器的合法性频蛔,服務(wù)器的合法性包括:
證書(shū)是否過(guò)期灵迫,
發(fā)行服務(wù)器證書(shū)的 CA 是否可靠(CA 認(rèn)證機(jī)構(gòu)頒發(fā)證書(shū)),
發(fā)行者證書(shū)的公鑰能否正確解開(kāi)服務(wù)器證書(shū)的“發(fā)行者的數(shù)字簽名”晦溪,
服務(wù)器證書(shū)上的域名是否和服務(wù)器的實(shí)際域名相匹配瀑粥。
如果合法性驗(yàn)證沒(méi)有通過(guò),通訊將斷開(kāi);
如果合法性驗(yàn)證通過(guò)三圆,將繼續(xù)進(jìn)行第4步狞换。
// 關(guān)于驗(yàn)證 CA 證書(shū) 及可能的中間人攻擊:
[
http://www.reibang.com/p/76540830537f
]
4.信息驗(yàn)證通過(guò),客戶端生成隨機(jī)密鑰A舟肉,用公鑰加密后發(fā)給服務(wù)器修噪。
從第3步驗(yàn)證過(guò)的證書(shū)里面可以拿到服務(wù)器的公鑰,客戶端生成的隨機(jī)密鑰就使用這個(gè)公鑰來(lái)加密.
加密之后路媚,只有擁有該服務(wù)器(持有私鑰)才能解密出來(lái)黄琼,保證安全。
5.服務(wù)器用私鑰解密出隨機(jī)密鑰A整慎,以后通信就用這個(gè)隨機(jī)密鑰A來(lái)對(duì)通信進(jìn)行加密脏款。
至此, 客戶端和服務(wù)端的握手完成, 即可以開(kāi)始進(jìn)行加密傳輸了围苫。
#須知:
這個(gè)握手過(guò)程并沒(méi)有將驗(yàn)證客戶端身份的邏輯加進(jìn)去。
因?yàn)樵诖蠖鄶?shù)的情況下撤师,HTTPS只是驗(yàn)證服務(wù)器的身份而已剂府。
如果要驗(yàn)證客戶端的身份,需要客戶端擁有證書(shū)剃盾,在握手時(shí)發(fā)送證書(shū)周循,而這個(gè)證書(shū)是需要成本的。
https中對(duì)稱加密--用于傳輸內(nèi)容的加密
https中對(duì)稱加密--用于傳輸內(nèi)容的加密.png
https交互過(guò)程.png
參考資源
http://www.reibang.com/p/daa17f50fd93
https://www.itcodemonkey.com/article/5789.html
https://blog.csdn.net/xiaopang_yan/article/details/78709574
搜索關(guān)鍵詞: https訪問(wèn)流程