前言:
對于HTTPS其實很早之前就有過學(xué)習(xí)笤闯,但對其一直是一知半解,知道的并不深入全面棍厂,因此用了些時間颗味,好好地閱讀了極客時間關(guān)于HTTPS的一些專欄,并總結(jié)一下嘗試著用自己的話來描述一下牺弹。
一浦马、沒有安全的 HTTP 和它的巡禮之年
HTTP最初的目的:傳輸超文本文件,因此一直是明文傳輸文件张漂,而且不安全晶默。由于是明文傳輸,所以就很容易被中間人所截取航攒,一切通信的內(nèi)容也被這個中間人所掌握磺陡。這也就是常說的中間人攻擊。
1.1 什么是安全
那如何定義通信過程是安全的呢:機密性漠畜,完整性币他,身份驗證以及不可否認(rèn):
機密性:簡單來說就是數(shù)據(jù)是加密過的,除了參與通信之外的人都是都是看不了的憔狞。
完整性:數(shù)據(jù)在通信的過程中是完整的蝴悉,沒加經(jīng)過篡改的。
身份認(rèn)證:通信雙方可以驗證對方的真實身份
不可否認(rèn):不能否認(rèn)已經(jīng)發(fā)生過的行為
因為是明文傳輸瘾敢,所以在一些對安全要求高的場景就不能很好的滿足需求拍冠,因此在原有的基礎(chǔ)上引入了加密方案尿这,在TCP和HTTP之間加入了一個安全層SSL/TLS
HTTP -> TCP
HTTP -> 安全層(SSL/TLS) -> TCP
1.2 什么是SSL/TLS?
SSL全名叫Secure Sockets Layer中文名叫 安全套接層庆杜,在 OSI 模型中儲運第五層會話層的位置射众。這玩意兒是由網(wǎng)景公司所發(fā)明,并在其發(fā)展到 V3 的時候被 IETF 改名為 TLC(Transport Layer Security)欣福,并對其進(jìn)行標(biāo)準(zhǔn)化责球。而 TLS 發(fā)展到現(xiàn)在也經(jīng)歷了三個版本,最新的版本是2018年所制定的拓劝,牢牢的將密碼學(xué)的發(fā)展與當(dāng)今互聯(lián)網(wǎng)的現(xiàn)狀相結(jié)合雏逾,持續(xù)提高安全與性能,因此也成為信息安全領(lǐng)域的權(quán)威標(biāo)準(zhǔn)郑临。
而它的職責(zé)也很簡單:
- 對發(fā)起 HTTP 請求的數(shù)據(jù)進(jìn)行加密操作
- 對接收到 HTTP 的內(nèi)容進(jìn)行解密操作
當(dāng)瀏覽器客戶端和服務(wù)端在使用 TLS 進(jìn)行通信時光羞,需要選擇一組合理的加密算法來實現(xiàn)安全通信孝宗,而這些算法的組合通常被稱為:加密套件腰埂。它的命名是很規(guī)范的西饵,基本形式就是:密鑰交換算法 + 簽名算法 + 對稱加密算法 + 摘要算法。其中躺翻,簽名算法可以進(jìn)行身份驗證丧叽,摘要算法可以保證數(shù)據(jù)的完整性,而對稱加密算法則可以保證數(shù)據(jù)的機密性公你。(值得注意的是踊淳,在2019年不安全的 TLS 1.0 和 1.1 默認(rèn)被禁用(Safari TP 91、Google Chrome 72+陕靠、Firefox Nightly)
二迂尝、安全的 HTTPS 和它的故事
2.1 對稱加密
前面我們提到,HTTP協(xié)議在進(jìn)行傳輸?shù)臅r候是通過明文進(jìn)行傳輸?shù)募艚妫虼瞬话踩⒖D敲慈绻枰WC傳輸信息的機密性,最簡單的方法不外于將其進(jìn)行加密税肪,這樣第三方的人在拿到這些信息的時候溉躲,也就不能獲取信息里面的內(nèi)容了。因此這就引入了加密的第一個概念:對稱加密益兄。
對稱加密其實很簡單:加密和解密都使用的是相同的密鑰签财,是對稱的,這里的密鑰就是用于解開加密信息的鑰匙偏塞。
簡單來說就是客戶端會給服務(wù)端發(fā)送它支持的加密的方法的列表,以及一個隨機數(shù)邦鲫,然后服務(wù)器端在接受到這些東西后灸叼,會從客戶端所支持的加密方法列表中選取一種神汹,然后同時生成一個隨機數(shù)給客戶端,這樣兩端就都確定了加密方法和隨機數(shù)古今,也就可以通過這些信息來生成對應(yīng)的密鑰了屁魏。這樣做的話即使黑客在獲取到瀏覽器與服務(wù)器所傳輸?shù)男畔ⅲ玫降囊仓皇且淮畞y碼捉腥,而他也沒有相應(yīng)的密鑰氓拼,也就保證了信息傳輸?shù)臋C密性。
TLS中所提供的對稱加密算法有很多抵碟,其中最常用的當(dāng)屬 AES(Advanced Encryption Standard)既高級加密標(biāo)準(zhǔn)桃漾,密鑰的長度可以是128,192拟逮,256撬统,是當(dāng)今用的最為廣泛的對稱加密算法。當(dāng)然除了上面這個AES之外敦迄,我們國家也存在這自己的一套對稱加密算法:SM1 和 SM4恋追。其中SM1算法不公開,屬于國家機密罚屋,而 SM4 則是公開的苦囱,可以自行使用,這兩個算法的最大的優(yōu)勢就在于:國家支持脾猛!
對稱加密還有一個分組的概念撕彤,他可以讓算法用固定的長度的密鑰加密任意長度的明文,從而將密鑰轉(zhuǎn)化為密文尖滚。最新的分組模式叫做AEAD喉刘,在加密的同時還增加了認(rèn)證的功能。
對稱加密就是通過上面的這些東西漆弄,來完成一個簡單卻安全的加密方式的睦裳。
2.2 非對稱加密
對稱加密看起來的確是解決了我們所說的安全要素中的機密性的要求,但它仍然存在一個致命的漏洞就是:密鑰交互的方式仍然是明文的撼唾。也正是為了解決密鑰安全的問題,我們就需要使用非堆成加密的方法蛛蒙,那什么是非堆成加密呢抖格?非對稱加密簡單來說就是有兩把私鑰掌呜,一把是公鑰,可以公開給任何人使用模暗,一把是私鑰,需要嚴(yán)格保密。這就形成了一個非對稱性。具體舉個栗子來講就是:有 A、B 兩把密鑰,如果你用 A 密鑰來加密,那么只能使用 B 密鑰來解密;反過來,如果你要 B 密鑰來加密,那么只能用 A 密鑰來解密睁本。
非對稱加密除了可以對信息進(jìn)行加密外凡泣,很多非對稱加密算法還有簽名的功能惹资,這樣就可以提供身份認(rèn)證,保證通信雙方可以確定對面的身份褪测。
而從實現(xiàn)上來講猴誊,所有的非對稱加密算法,都是基于各種數(shù)學(xué)難題來設(shè)計實現(xiàn)的侮措,這些難題的特點在于:正向計算很簡單懈叹,反向推倒是無解的。其中比較經(jīng)典的非對稱加密算法包括:RSA分扎,ECC以及SM2澄成。
RSA
RSA 是所使用的數(shù)學(xué)難題是:兩個大的質(zhì)數(shù)相乘的結(jié)果很容易計算,但根據(jù)這個結(jié)果去做質(zhì)因分解得到原先的兩個質(zhì)數(shù)畏吓,則需要很大的計算量墨状。就比如這個:
https://lists.gforge.inria.fr/pipermail/cado-nfs-discuss/2019-December/001139.html。
前段時間美國一群大佬宣布菲饼,240哥十進(jìn)制的整數(shù)分解成功肾砂,找到了它的兩個大質(zhì)數(shù)因子,不過這個成本也是很大的巴粪。
ECC && SM2
ECC和 SM2 都是是基于橢圓曲線的數(shù)學(xué)難題設(shè)計的通今。普遍的觀點認(rèn)為,橢圓曲線的難度高于大質(zhì)數(shù)難題肛根,160 位密鑰的 ECC 加密強度辫塌,相當(dāng)于 1088 位密鑰的 RSA。因為密鑰短派哲,所以相應(yīng)的計算量臼氨、消耗的內(nèi)存和帶寬也就少,加密解密的性能就上去了芭届,因此對于互聯(lián)網(wǎng)行業(yè)來講吸引力也是相當(dāng)大的储矩。而SM2除了加密強度和國際標(biāo)準(zhǔn)和ECC差不多以外感耙,還屬于國家所支持的非對稱加密算法。
需要注意的是持隧,非對稱加密的安全性上雖然可以滿足我們的需求即硼,但它卻存在這一個比較大的問題就是L:性能。由于非對稱加密在所需要的算法運算非常復(fù)雜屡拨,因此在性能上得不到很好的保證只酥。也正是由于這個原因,現(xiàn)在的TLS主要采用的是一種叫混合加密的方式來進(jìn)行加密呀狼。
混合加密
混合加密其實很簡單裂允,就是使用非對稱加密的方式,解決密鑰交換的問題哥艇,然后用隨機數(shù)產(chǎn)生對稱算法使用的會話密鑰绝编,在對其使用公鑰加密,并傳送給通信對象貌踏。通信對象拿到密文后用私鑰解開并取出會話密鑰十饥。這樣就是實現(xiàn)了堆成密鑰的安全交換了,后續(xù)就可以使用這個對稱密鑰來進(jìn)行對稱加密哩俭。
2.3 摘要算法(Digest Algorithm)
在前面我們有提到過安全的幾大要素绷跑,其中機密性我們可以通過上面的對稱加密 + 非對稱加密來解決。而在完整性方面凡资,我們則需要使用摘要算法來解決砸捏。
簡單理解,我們可以將摘要算法理解為一種特殊的壓縮算法隙赁,他可以將任意長度的數(shù)據(jù)壓縮成固定長度且獨一無二的摘要字符串垦藏,且這個加密的過程也是單向的,加密后的數(shù)據(jù)無法解密伞访,不能從摘要中反向推出原文掂骏。