1. 程式人生 > >看完這篇 HTTPS,和麵試官扯皮就沒問題了

看完這篇 HTTPS,和麵試官扯皮就沒問題了

下面我們來一起學習一下 HTTPS ,首先問你一個問題,為什麼有了 HTTP 之後,還需要有 HTTPS ?我突然有個想法,為什麼我們面試的時候需要回答`標準答案`呢?為什麼我們不說出我們自己的想法和見解,卻要記住一些所謂的標準回答呢?**技術還有正確與否嗎**? ## HTTPS 為什麼會出現 一個新技術的出現必定是為了解決某種問題的,那麼 HTTPS 解決了 HTTP 的什麼問題呢? ### HTTPS 解決了什麼問題 一個簡單的回答可能會是 `HTTP` 它不安全。由於 HTTP 天生明文傳輸的特性,在 HTTP 的傳輸過程中,任何人都有可能從中截獲、修改或者偽造請求傳送,所以可以認為 HTTP 是不安全的;在 HTTP 的傳輸過程中不會驗證通訊方的身份,因此 HTTP 資訊交換的雙方可能會遭到偽裝,也就是`沒有使用者驗證`;在 HTTP 的傳輸過程中,接收方和傳送方並`不會驗證報文的完整性`,綜上,為了結局上述問題,HTTPS 應用而生。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103112991-906229564.png) ### 什麼是 HTTPS 你還記得 HTTP 是怎麼定義的嗎?HTTP 是一種 `超文字傳輸協議(Hypertext Transfer Protocol)` 協議,**它 是一個在計算機世界裡專門在兩點之間傳輸文字、圖片、音訊、視訊等超文字資料的約定和規範**,那麼我們看一下 HTTPS 是如何定義的 `HTTPS` 的全稱是 `Hypertext Transfer Protocol Secure`,它用來在計算機網路上的兩個端系統之間進行`安全的交換資訊(secure communication)`,它相當於在 HTTP 的基礎上加了一個 `Secure 安全`的詞眼,那麼我們可以給出一個 HTTPS 的定義:**HTTPS 是一個在計算機世界裡專門在兩點之間安全的傳輸文字、圖片、音訊、視訊等超文字資料的約定和規範**。 HTTPS 是 HTTP 協議的一種擴充套件,它本身並不保傳輸的證安全性,那麼誰來保證安全性呢?在 HTTPS 中,使用`傳輸層安全性(TLS)`或`安全套接字層(SSL)`對通訊協議進行加密。也就是 HTTP + SSL(TLS) = HTTPS。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103125519-296986331.png) ### HTTPS 做了什麼 HTTPS 協議提供了三個關鍵的指標 * `加密(Encryption)`, HTTPS 通過對資料加密來使其免受竊聽者對資料的監聽,這就意味著當用戶在瀏覽網站時,沒有人能夠監聽他和網站之間的資訊交換,或者跟蹤使用者的活動,訪問記錄等,從而竊取使用者資訊。 * `資料一致性(Data integrity)`,資料在傳輸的過程中不會被竊聽者所修改,使用者傳送的資料會`完整`的傳輸到服務端,保證使用者發的是什麼,伺服器接收的就是什麼。 * `身份認證(Authentication)`,是指確認對方的真實身份,也就是`證明你是你`(可以比作人臉識別),它可以防止中間人攻擊並建立使用者信任。 有了上面三個關鍵指標的保證,使用者就可以和伺服器進行安全的交換資訊了。那麼,既然你說了 HTTPS 的種種好處,那麼我怎麼知道網站是用 HTTPS 的還是 HTTP 的呢?給你兩幅圖應該就可以解釋了。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103133188-2056144686.png) HTTPS 協議其實非常簡單,RFC 文件很小,只有短短的 7 頁,裡面規定了新的協議名,預設`埠號443`,至於其他的**應答模式、報文結構、請求方法、URI、頭欄位、連線管理**等等都完全沿用 HTTP,沒有任何新的東西。 也就是說,除了協議名稱和預設埠號外(HTTP 預設埠 80),HTTPS 協議在語法、語義上和 HTTP 一樣,HTTP 有的,HTTPS 也照單全收。那麼,HTTPS 如何做到 HTTP 所不能做到的`安全性呢`?關鍵在於這個 `S` 也就是 `SSL/TLS` 。 ## 什麼是 SSL/TLS ### 認識 SSL/TLS `TLS(Transport Layer Security)` 是 `SSL(Secure Socket Layer)` 的後續版本,它們是用於在網際網路兩臺計算機之間用於`身份驗證`和`加密`的一種協議。 >注意:在網際網路中,很多名稱都可以進行互換。 我們都知道一些線上業務(比如線上支付)最重要的一個步驟是建立一個值得信賴的交易環境,能夠讓客戶安心的進行交易,SSL/TLS 就保證了這一點,SSL/TLS 通過將稱為 `X.509` 證書的數字文件將網站和公司的實體資訊繫結到`加密金鑰`來進行工作。每一個`金鑰對(key pairs)` 都有一個 `私有金鑰(private key)` 和 `公有金鑰(public key)`,私有金鑰是獨有的,一般位於伺服器上,用於解密由公共金鑰加密過的資訊;公有金鑰是公有的,與伺服器進行互動的每個人都可以持有公有金鑰,用公鑰加密的資訊只能由私有金鑰來解密。 >什麼是 `X.509`:X.509 是`公開金鑰`證書的標準格式,這個文件將加密金鑰與(個人或組織)進行安全的關聯。 > >X.509 主要應用如下 > >* SSL/TLS 和 HTTPS 用於經過身份驗證和加密的 Web 瀏覽 >* 通過 [S/MIME](https://www.ssl.com/article/sending-secure-email-with-s-mime/) 協議簽名和加密的電子郵件 >* 程式碼簽名:它指的是使用數字證書對軟體應用程式進行簽名以安全分發和安裝的過程。 > >![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103147829-1863266588.png) > >通過使用由知名公共證書頒發機構(例如SSL.com)頒發的證書對軟體進行數字簽名,開發人員可以向終端使用者保證他們希望安裝的軟體是由已知且受信任的開發人員釋出;並且簽名後未被篡改或損害。 > >* 還可用於文件簽名 > >* 還可用於客戶端認證 > >* 政府簽發的電子身份證(詳見 https://www.ssl.com/article/pki-and-digital-certificates-for-government/) > > 我們後面還會討論。 ### HTTPS 的核心是 HTTP HTTPS 並不是一項新的應用層協議,只是 HTTP 通訊介面部分由 SSL 和 TLS 替代而已。通常情況下,HTTP 會先直接和 TCP 進行通訊。在使用 SSL 的 HTTPS 後,則會先演變為和 SSL 進行通訊,然後再由 SSL 和 TCP 進行通訊。也就是說,**HTTPS 就是身披了一層 SSL 的 HTTP**。(我都喜歡把騷粉留在最後。。。) ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103214176-1642515041.png) SSL 是一個獨立的協議,不只有 HTTP 可以使用,其他應用層協議也可以使用,比如 `SMTP(電子郵件協議)`、`Telnet(遠端登入協議)` 等都可以使用。 ## 探究 HTTPS 我說,你起這麼牛逼的名字幹嘛,還想吹牛批?你 HTTPS 不就抱上了 TLS/SSL 的大腿麼,咋這麼牛批哄哄的,還想探究 HTTPS,瞎胡鬧,趕緊改成 TLS 是我主,讚美我主。 SSL 即`安全套接字層`,它在 OSI 七層網路模型中處於第五層,SSL 在 1999 年被 `IETF(網際網路工程組)`更名為 TLS ,即`傳輸安全層`,直到現在,TLS 一共出現過三個版本,1.1、1.2 和 1.3 ,目前最廣泛使用的是 1.2,所以接下來的探討都是基於 TLS 1.2 的版本上的。 TLS 用於兩個通訊應用程式之間提供保密性和資料完整性。TLS 由**記錄協議、握手協議、警告協議、變更密碼規範協議、擴充套件協議**等幾個子協議組成,綜合使用了**對稱加密、非對稱加密、身份認證**等許多密碼學前沿技術(如果你覺得一項技術很簡單,那你只是沒有學到位,任何技術都是有美感的,牛逼的人只是欣賞,並不是貶低)。 說了這麼半天,我們還沒有看到 TLS 的命名規範呢,下面舉一個 TLS 例子來看一下 TLS 的結構(可以參考 https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml) ```http ECDHE-ECDSA-AES256-GCM-SHA384 ``` 這是啥意思呢?我剛開始看也有點懵啊,但其實是有套路的,因為 TLS 的密碼套件比較規範,基本格式就是 **金鑰交換演算法 - 簽名演算法 - 對稱加密演算法 - 摘要演算法** 組成的一個密碼串,有時候還有`分組模式`,我們先來看一下剛剛是什麼意思 使用 ECDHE 進行金鑰交換,使用 ECDSA 進行簽名和認證,然後使用 AES 作為對稱加密演算法,金鑰的長度是 256 位,使用 GCM 作為分組模式,最後使用 SHA384 作為摘要演算法。 TLS 在根本上使用`對稱加密`和 `非對稱加密` 兩種形式。 ### 對稱加密 在瞭解對稱加密前,我們先來了解一下`密碼學`的東西,在密碼學中,有幾個概念:**明文、密文、加密、解密** * `明文(Plaintext)`,一般認為明文是有意義的字元或者位元集,或者是通過某種公開編碼就能獲得的訊息。明文通常用 m 或 p 表示 * `密文(Ciphertext)`,對明文進行某種加密後就變成了密文 * `加密(Encrypt)`,把原始的資訊(明文)轉換為密文的資訊變換過程 * `解密(Decrypt)`,把已經加密的資訊恢復成明文的過程。 `對稱加密(Symmetrical Encryption)`顧名思義就是指**加密和解密時使用的金鑰都是同樣的金鑰**。只要保證了金鑰的安全性,那麼整個通訊過程也就是具有了機密性。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103224183-1197326850.png) TLS 裡面有比較多的加密演算法可供使用,比如 DES、3DES、AES、ChaCha20、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。目前最常用的是 AES-128, AES-192、AES-256 和 ChaCha20。 `DES` 的全稱是 `Data Encryption Standard(資料加密標準)` ,它是用於數字資料加密的對稱金鑰演算法。儘管其 56 位的短金鑰長度使它對於現代應用程式來說太不安全了,但它在加密技術的發展中具有很大的影響力。 `3DES` 是從原始資料加密標準(DES)衍生過來的加密演算法,它在 90 年代後變得很重要,但是後面由於更加高階的演算法出現,3DES 變得不再重要。 AES-128, AES-192 和 AES-256 都是屬於 AES ,AES 的全稱是`Advanced Encryption Standard(高階加密標準)`,它是 DES 演算法的替代者,安全強度很高,效能也很好,是應用最廣泛的對稱加密演算法。 `ChaCha20` 是 Google 設計的另一種加密演算法,金鑰長度固定為 256 位,純軟體執行效能要超過 AES,曾經在移動客戶端上比較流行,但 ARMv8 之後也加入了 AES 硬體優化,所以現在不再具有明顯的優勢,但仍然算得上是一個不錯演算法。 (其他可自行搜尋) #### 加密分組 對稱加密演算法還有一個`分組模式` 的概念,對於 GCM 分組模式,只有和 AES,CAMELLIA 和 ARIA 搭配使用,而 AES 顯然是最受歡迎和部署最廣泛的選擇,它可以讓演算法用固定長度的金鑰加密任意長度的明文。 最早有 ECB、CBC、CFB、OFB 等幾種分組模式,但都陸續被發現有安全漏洞,所以現在基本都不怎麼用了。最新的分組模式被稱為 `AEAD(Authenticated Encryption with Associated Data)`,在加密的同時增加了認證的功能,常用的是 GCM、CCM 和 Poly1305。 比如 `ECDHE_ECDSA_AES128_GCM_SHA256` ,表示的是具有 128 位金鑰, AES256 將表示 256 位金鑰。GCM 表示具有 128 位塊的分組密碼的現代認證的關聯資料加密(AEAD)操作模式。 我們上面談到了對稱加密,對稱加密的加密方和解密方都使用同一個`金鑰`,也就是說,加密方必須對原始資料進行加密,然後再把金鑰交給解密方進行解密,然後才能解密資料,這就會造成什麼問題?這就好比《小兵張嘎》去送信(信已經被加密過),但是嘎子還拿著解密的密碼,那嘎子要是在途中被鬼子發現了,那這信可就是被完全的暴露了。所以,對稱加密存在風險。 ### 非對稱加密 `非對稱加密(Asymmetrical Encryption)` 也被稱為`公鑰加密`,相對於對稱加密來說,非對稱加密是一種新的改良加密方式。金鑰通過網路傳輸交換,它能夠確保及時金鑰被攔截,也不會暴露資料資訊。非對稱加密中有兩個金鑰,一個是公鑰,一個是私鑰,公鑰進行加密,私鑰進行解密。公開金鑰可供任何人使用,私鑰只有你自己能夠知道。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103234231-1641743561.png) 使用公鑰加密的文字只能使用私鑰解密,同時,使用私鑰加密的文字也可以使用公鑰解密。公鑰不需要具有安全性,因為公鑰需要在網路間進行傳輸,非對稱加密可以解決`金鑰交換`的問題。網站保管私鑰,在網上任意分發公鑰,你想要登入網站只要用公鑰加密就行了,密文只能由私鑰持有者才能解密。而黑客因為沒有私鑰,所以就無法破解密文。 非對稱加密演算法的設計要比對稱演算法難得多(我們不會探討具體的加密方式),常見的比如 DH、DSA、RSA、ECC 等。 其中 `RSA` 加密演算法是最重要的、最出名的一個了。例如 `DHE_RSA_CAMELLIA128_GCM_SHA256`。它的安全性基於 `整數分解`,使用兩個超大素數的乘積作為生成金鑰的材料,想要從公鑰推算出私鑰是非常困難的。 `ECC(Elliptic Curve Cryptography)`也是非對稱加密演算法的一種,它基於`橢圓曲線離散對數`的數學難題,使用特定的曲線方程和基點生成公鑰和私鑰, ECDHE 用於金鑰交換,ECDSA 用於數字簽名。 TLS 是使用`對稱加密`和`非對稱加密` 的混合加密方式來實現機密性。 ### 混合加密 RSA 的運算速度非常慢,而 AES 的加密速度比較快,而 TLS 正是使用了這種`混合加密`方式。在通訊剛開始的時候使用非對稱演算法,比如 RSA、ECDHE ,首先解決`金鑰交換`的問題。然後用隨機數產生對稱演算法使用的`會話金鑰(session key)`,再用`公鑰加密`。對方拿到密文後用`私鑰解密`,取出會話金鑰。這樣,雙方就實現了對稱金鑰的安全交換。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103243596-1560928278.png) 現在我們使用混合加密的方式實現了機密性,是不是就能夠安全的傳輸資料了呢?還不夠,在機密性的基礎上還要加上`完整性`、`身份認證`的特性,才能實現真正的安全。而實現完整性的主要手段是 `摘要演算法(Digest Algorithm)` ### 摘要演算法 如何實現完整性呢?在 TLS 中,實現完整性的手段主要是 `摘要演算法(Digest Algorithm)`。摘要演算法你不清楚的話,MD5 你應該清楚,MD5 的全稱是 `Message Digest Algorithm 5`,它是屬於`密碼雜湊演算法(cryptographic hash algorithm)`的一種,MD5 可用於從任意長度的字串建立 128 位字串值。儘管 MD5 存在不安全因素,但是仍然沿用至今。MD5 最常用於`驗證檔案`的完整性。但是,它還用於其他安全協議和應用程式中,例如 SSH、SSL 和 IPSec。一些應用程式通過嚮明文加鹽值或多次應用雜湊函式來增強 MD5 演算法。 >什麼是加鹽?在密碼學中,`鹽`就是一項隨機資料,用作雜湊資料,密碼或密碼的`單向`函式的附加輸入。鹽用於保護儲存中的密碼。例如 > >![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103259737-2039259071.png) > >什麼是單向?就是在說這種演算法沒有金鑰可以進行解密,只能進行單向加密,加密後的資料無法解密,不能逆推出原文。 我們再回到摘要演算法的討論上來,其實你可以把摘要演算法理解成一種特殊的壓縮演算法,它能夠把任意長度的資料`壓縮`成一種固定長度的字串,這就好像是給資料加了一把鎖。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103319423-1341911060.png) 除了常用的 MD5 是加密演算法外,`SHA-1(Secure Hash Algorithm 1)` 也是一種常用的加密演算法,不過 SHA-1 也是不安全的加密演算法,在 TLS 裡面被禁止使用。目前 TLS 推薦使用的是 SHA-1 的後繼者:`SHA-2`。 SHA-2 的全稱是`Secure Hash Algorithm 2` ,它在 2001 年被推出,它在 SHA-1 的基礎上做了重大的修改,SHA-2 系列包含六個雜湊函式,其摘要(雜湊值)分別為 224、256、384 或 512 位:**SHA-224, SHA-256, SHA-384, SHA-512**。分別能夠生成 28 位元組、32 位元組、48 位元組、64 位元組的摘要。 有了 SHA-2 的保護,就能夠實現資料的完整性,哪怕你在檔案中改變一個標點符號,增加一個空格,生成的檔案摘要也會完全不同,不過 SHA-2 是基於明文的加密方式,還是不夠安全,那應該用什麼呢? 安全性更高的加密方式是使用 `HMAC`,在理解什麼是 HMAC 前,你需要先知道一下什麼是 MAC。 MAC 的全稱是`message authentication code`,它通過 MAC 演算法從訊息和金鑰生成,MAC 值允許驗證者(也擁有祕密金鑰)檢測到訊息內容的任何更改,從而保護了訊息的資料完整性。 HMAC 是 MAC 更進一步的拓展,它是使用 MAC 值 + Hash 值的組合方式,HMAC 的計算中可以使用任何加密雜湊函式,例如 SHA-256 等。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103329536-1028852062.png) 現在我們又解決了完整性的問題,那麼就只剩下一個問題了,那就是`認證`,認證怎麼做的呢?我們再向伺服器傳送資料的過程中,黑客(攻擊者)有可能偽裝成任何一方來竊取資訊。它可以偽裝成你,來向伺服器傳送資訊,也可以偽裝稱為伺服器,接受你傳送的資訊。那麼怎麼解決這個問題呢? ### 認證 如何確定你自己的唯一性呢?我們在上面的敘述過程中出現過公鑰加密,私鑰解密的這個概念。提到的私鑰只有你一個人所有,能夠辨別唯一性,所以我們可以把順序調換一下,變成私鑰加密,公鑰解密。使用私鑰再加上摘要演算法,就能夠實現`數字簽名`,從而實現認證。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103337266-971088165.png) 到現在,綜合使用對稱加密、非對稱加密和摘要演算法,我們已經實現了**加密、資料認證、認證**,那麼是不是就安全了呢?非也,這裡還存在一個**數字簽名的認證問題**。因為私鑰是是自己的,公鑰是誰都可以釋出,所以必須釋出經過認證的公鑰,才能解決公鑰的信任問題。 所以引入了 `CA`,CA 的全稱是 `Certificate Authority`,證書認證機構,你必須讓 CA 頒佈具有認證過的公鑰,才能解決公鑰的信任問題。 全世界具有認證的 CA 就幾家,分別頒佈了 DV、OV、EV 三種,區別在於可信程度。DV 是最低的,只是域名級別的可信,EV 是最高的,經過了法律和審計的嚴格核查,可以證明網站擁有者的身份(在瀏覽器位址列會顯示出公司的名字,例如 Apple、GitHub 的網站)。不同的信任等級的機構一起形成了層級關係。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103348932-1268001810.png) 通常情況下,數字證書的申請人將生成由私鑰和公鑰以及證書`簽名請求(CSR)`組成的金鑰對。CSR是一個編碼的文字檔案,其中包含公鑰和其他將包含在證書中的資訊(例如域名,組織,電子郵件地址等)。金鑰對和 CSR生成通常在將要安裝證書的伺服器上完成,並且 CSR 中包含的資訊型別取決於證書的驗證級別。與公鑰不同,申請人的私鑰是安全的,永遠不要向 CA(或其他任何人)展示。 生成 CSR 後,申請人將其傳送給 CA,CA 會驗證其包含的資訊是否正確,如果正確,則使用頒發的私鑰對證書進行數字簽名,然後將其傳送給申請人。 ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103356543-322299194.png) ## 總結 本篇文章我們主要講述了 HTTPS 為什麼會出現 ,HTTPS 解決了 HTTP 的什麼問題,HTTPS 和 HTTP 的關係是什麼,TLS 和 SSL 是什麼,TLS 和 SSL 解決了什麼問題?如何實現一個真正安全的資料傳輸? 文章參考: https://www.ssl.com/faqs/what-is-a-certificate-authority/ https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.1.0/com.ibm.mq.doc/sy10670_.htm https://en.wikipedia.org/wiki/Message_authentication_code https://en.wikipedia.org/wiki/HMAC https://www.quora.com/What-does-it-mean-to-add-a-salt-to-a-password-hash https://hpbn.co/transport-layer-security-tls/ https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences https://crypto.stackexchange.com/questions/26410/whats-the-gcm-sha-256-of-a-tls-protocol https://en.wikipedia.org/wiki/Advanced_Encryption_Standard https://www.comparitech.com/blog/information-security/3des-encryption/ 《極客時間-透析 HTTP 協議》 https://www.tutorialsteacher.com/https/how-ssl-works https://baike.baidu.com/item/密碼系統/5823651 https://baike.baidu.com/item/對稱加密/2152944?fr=aladdin https://www.ssl.com/faqs/faq-what-is-ssl/ https://en.wikipedia.org/wiki/HTTPS https://support.google.com/webmasters/answer/6073543?hl=en https://www.cloudflare.com/learning/ssl/why-is-http-not-secure/ https://www.cisco.com/c/en/us/products/security/what-is-network-security.html https://www.freecodecamp.org/news/web-security-an-introduction-to-http-5fa07140f9b3/ ![](https://img2020.cnblogs.com/blog/1515111/202003/1515111-20200314103419989-2035089633.png)