下面咱們來一塊兒學習一下 HTTPS ,首先問你一個問題,爲何有了 HTTP 以後,還須要有 HTTPS ?我忽然有個想法,爲何咱們面試的時候須要回答標準答案
呢?爲何咱們不說出咱們本身的想法和看法,卻要記住一些所謂的標準回答呢?技術還有正確與否嗎?html
一個新技術的出現一定是爲了解決某種問題的,那麼 HTTPS 解決了 HTTP 的什麼問題呢?git
一個簡單的回答可能會是 HTTP
它不安全。因爲 HTTP 天生明文傳輸的特性,在 HTTP 的傳輸過程當中,任何人都有可能從中截獲、修改或者僞造請求發送,因此能夠認爲 HTTP 是不安全的;在 HTTP 的傳輸過程當中不會驗證通訊方的身份,所以 HTTP 信息交換的雙方可能會遭到假裝,也就是沒有用戶驗證
;在 HTTP 的傳輸過程當中,接收方和發送方並不會驗證報文的完整性
,綜上,爲告終局上述問題,HTTPS 應用而生。web
你還記得 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 協議提供了三個關鍵的指標瀏覽器
加密(Encryption)
, HTTPS 經過對數據加密來使其免受竊聽者對數據的監聽,這就意味着當用戶在瀏覽網站時,沒有人可以監聽他和網站之間的信息交換,或者跟蹤用戶的活動,訪問記錄等,從而竊取用戶信息。安全
數據一致性(Data integrity)
,數據在傳輸的過程當中不會被竊聽者所修改,用戶發送的數據會完整
的傳輸到服務端,保證用戶發的是什麼,服務器接收的就是什麼。身份認證(Authentication)
,是指確認對方的真實身份,也就是證實你是你
(能夠比做人臉識別),它能夠防止中間人攻擊並創建用戶信任。服務器
有了上面三個關鍵指標的保證,用戶就能夠和服務器進行安全的交換信息了。那麼,既然你說了 HTTPS 的種種好處,那麼我怎麼知道網站是用 HTTPS 的仍是 HTTP 的呢?給你兩幅圖應該就能夠解釋了。網絡
HTTPS 協議其實很是簡單,RFC 文檔很小,只有短短的 7 頁,裏面規定了新的協議名,默認端口號443
,至於其餘的應答模式、報文結構、請求方法、URI、頭字段、鏈接管理等等都徹底沿用 HTTP,沒有任何新的東西。session
也就是說,除了協議名稱和默認端口號外(HTTP 默認端口 80),HTTPS 協議在語法、語義上和 HTTP 同樣,HTTP 有的,HTTPS 也照單全收。那麼,HTTPS 如何作到 HTTP 所不能作到的安全性呢
?關鍵在於這個 S
也就是 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 協議簽名和加密的電子郵件
- 代碼簽名:它指的是使用數字證書對軟件應用程序進行簽名以安全分發和安裝的過程。
經過使用由知名公共證書頒發機構(例如SSL.com)頒發的證書對軟件進行數字簽名,開發人員能夠向最終用戶保證他們但願安裝的軟件是由已知且受信任的開發人員發佈;而且簽名後未被篡改或損害。
還可用於文檔簽名
還可用於客戶端認證
政府簽發的電子身份證(詳見 https://www.ssl.com/article/pki-and-digital-certificates-for-government/)
咱們後面還會討論。
HTTPS 並非一項新的應用層協議,只是 HTTP 通訊接口部分由 SSL 和 TLS 替代而已。一般狀況下,HTTP 會先直接和 TCP 進行通訊。在使用 SSL 的 HTTPS 後,則會先演變爲和 SSL 進行通訊,而後再由 SSL 和 TCP 進行通訊。也就是說,HTTPS 就是身披了一層 SSL 的 HTTP。(我都喜歡把騷粉留在最後。。。)
SSL 是一個獨立的協議,不僅有 HTTP 可使用,其餘應用層協議也可使用,好比 SMTP(電子郵件協議)
、Telnet(遠程登陸協議)
等均可以使用。
我說,你起這麼牛逼的名字幹嗎,還想吹牛批?你 HTTPS 不就抱上了 TLS/SSL 的大腿麼,咋這麼牛批哄哄的,還想探究 HTTPS,瞎胡鬧,趕忙改爲 TLS 是我主,讚美我主。
SSL 即安全套接字層
,它在 OSI 七層網絡模型中處於第五層,SSL 在 1999 年被 IETF(互聯網工程組)
改名爲 TLS ,即傳輸安全層
,直到如今,TLS 一共出現過三個版本,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)
ECDHE-ECDSA-AES256-GCM-SHA384
這是啥意思呢?我剛開始看也有點懵啊,但實際上是有套路的,由於 TLS 的密碼套件比較規範,基本格式就是 密鑰交換算法 - 簽名算法 - 對稱加密算法 - 摘要算法 組成的一個密碼串,有時候還有分組模式
,咱們先來看一下剛剛是什麼意思
使用 ECDHE 進行密鑰交換,使用 ECDSA 進行簽名和認證,而後使用 AES 做爲對稱加密算法,密鑰的長度是 256 位,使用 GCM 做爲分組模式,最後使用 SHA384 做爲摘要算法。
TLS 在根本上使用對稱加密
和 非對稱加密
兩種形式。
在瞭解對稱加密前,咱們先來了解一下密碼學
的東西,在密碼學中,有幾個概念:明文、密文、加密、解密
明文(Plaintext)
,通常認爲明文是有意義的字符或者比特集,或者是經過某種公開編碼就能得到的消息。明文一般用 m 或 p 表示密文(Ciphertext)
,對明文進行某種加密後就變成了密文加密(Encrypt)
,把原始的信息(明文)轉換爲密文的信息變換過程解密(Decrypt)
,把已經加密的信息恢復成明文的過程。對稱加密(Symmetrical Encryption)
顧名思義就是指加密和解密時使用的密鑰都是一樣的密鑰。只要保證了密鑰的安全性,那麼整個通訊過程也就是具備了機密性。
TLS 裏面有比較多的加密算法可供使用,好比 DES、3DES、AES、ChaCha20、TDEA、Blowfish、RC二、RC四、RC五、IDEA、SKIPJACK 等。目前最經常使用的是 AES-128, AES-19二、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)
也被稱爲公鑰加密
,相對於對稱加密來講,非對稱加密是一種新的改良加密方式。密鑰經過網絡傳輸交換,它可以確保及時密鑰被攔截,也不會暴露數據信息。非對稱加密中有兩個密鑰,一個是公鑰,一個是私鑰,公鑰進行加密,私鑰進行解密。公開密鑰可供任何人使用,私鑰只有你本身可以知道。
使用公鑰加密的文本只能使用私鑰解密,同時,使用私鑰加密的文本也可使用公鑰解密。公鑰不須要具備安全性,由於公鑰須要在網絡間進行傳輸,非對稱加密能夠解決密鑰交換
的問題。網站保管私鑰,在網上任意分發公鑰,你想要登陸網站只要用公鑰加密就好了,密文只能由私鑰持有者才能解密。而黑客由於沒有私鑰,因此就沒法破解密文。
非對稱加密算法的設計要比對稱算法可貴多(咱們不會探討具體的加密方式),常見的好比 DH、DSA、RSA、ECC 等。
其中 RSA
加密算法是最重要的、最出名的一個了。例如 DHE_RSA_CAMELLIA128_GCM_SHA256
。它的安全性基於 整數分解
,使用兩個超大素數的乘積做爲生成密鑰的材料,想要從公鑰推算出私鑰是很是困難的。
ECC(Elliptic Curve Cryptography)
也是非對稱加密算法的一種,它基於橢圓曲線離散對數
的數學難題,使用特定的曲線方程和基點生成公鑰和私鑰, ECDHE 用於密鑰交換,ECDSA 用於數字簽名。
TLS 是使用對稱加密
和非對稱加密
的混合加密方式來實現機密性。
RSA 的運算速度很是慢,而 AES 的加密速度比較快,而 TLS 正是使用了這種混合加密
方式。在通訊剛開始的時候使用非對稱算法,好比 RSA、ECDHE ,首先解決密鑰交換
的問題。而後用隨機數產生對稱算法使用的會話密鑰(session key)
,再用公鑰加密
。對方拿到密文後用私鑰解密
,取出會話密鑰。這樣,雙方就實現了對稱密鑰的安全交換。
如今咱們使用混合加密的方式實現了機密性,是否是就可以安全的傳輸數據了呢?還不夠,在機密性的基礎上還要加上完整性
、身份認證
的特性,才能實現真正的安全。而實現完整性的主要手段是 摘要算法(Digest Algorithm)
如何實現完整性呢?在 TLS 中,實現完整性的手段主要是 摘要算法(Digest Algorithm)
。摘要算法你不清楚的話,MD5 你應該清楚,MD5 的全稱是 Message Digest Algorithm 5
,它是屬於密碼哈希算法(cryptographic hash algorithm)
的一種,MD5 可用於從任意長度的字符串建立 128 位字符串值。儘管 MD5 存在不安全因素,可是仍然沿用至今。MD5 最經常使用於驗證文件
的完整性。可是,它還用於其餘安全協議和應用程序中,例如 SSH、SSL 和 IPSec。一些應用程序經過嚮明文加鹽值或屢次應用哈希函數來加強 MD5 算法。
什麼是加鹽?在密碼學中,
鹽
就是一項隨機數據,用做哈希數據,密碼或密碼的單向
函數的附加輸入。鹽用於保護存儲中的密碼。例如
什麼是單向?就是在說這種算法沒有密鑰能夠進行解密,只能進行單向加密,加密後的數據沒法解密,不能逆推出原文。
咱們再回到摘要算法的討論上來,其實你能夠把摘要算法理解成一種特殊的壓縮算法,它可以把任意長度的數據壓縮
成一種固定長度的字符串,這就好像是給數據加了一把鎖。
除了經常使用的 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 系列包含六個哈希函數,其摘要(哈希值)分別爲 22四、25六、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 等。
如今咱們又解決了完整性的問題,那麼就只剩下一個問題了,那就是認證
,認證怎麼作的呢?咱們再向服務器發送數據的過程當中,黑客(攻擊者)有可能假裝成任何一方來竊取信息。它能夠假裝成你,來向服務器發送信息,也能夠假裝稱爲服務器,接受你發送的信息。那麼怎麼解決這個問題呢?
如何肯定你本身的惟一性呢?咱們在上面的敘述過程當中出現過公鑰加密,私鑰解密的這個概念。提到的私鑰只有你一我的全部,可以辨別惟一性,因此咱們能夠把順序調換一下,變成私鑰加密,公鑰解密。使用私鑰再加上摘要算法,就可以實現數字簽名
,從而實現認證。
到如今,綜合使用對稱加密、非對稱加密和摘要算法,咱們已經實現了加密、數據認證、認證,那麼是否是就安全了呢?非也,這裏還存在一個數字簽名的認證問題。由於私鑰是是本身的,公鑰是誰均可以發佈,因此必須發佈通過認證的公鑰,才能解決公鑰的信任問題。
因此引入了 CA
,CA 的全稱是 Certificate Authority
,證書認證機構,你必須讓 CA 頒佈具備認證過的公鑰,才能解決公鑰的信任問題。
全世界具備認證的 CA 就幾家,分別頒佈了 DV、OV、EV 三種,區別在於可信程度。DV 是最低的,只是域名級別的可信,EV 是最高的,通過了法律和審計的嚴格覈查,能夠證實網站擁有者的身份(在瀏覽器地址欄會顯示出公司的名字,例如 Apple、GitHub 的網站)。不一樣的信任等級的機構一塊兒造成了層級關係。
一般狀況下,數字證書的申請人將生成由私鑰和公鑰以及證書簽名請求(CSR)
組成的密鑰對。CSR是一個編碼的文本文件,其中包含公鑰和其餘將包含在證書中的信息(例如域名,組織,電子郵件地址等)。密鑰對和 CSR生成一般在將要安裝證書的服務器上完成,而且 CSR 中包含的信息類型取決於證書的驗證級別。與公鑰不一樣,申請人的私鑰是安全的,永遠不要向 CA(或其餘任何人)展現。
生成 CSR 後,申請人將其發送給 CA,CA 會驗證其包含的信息是否正確,若是正確,則使用頒發的私鑰對證書進行數字簽名,而後將其發送給申請人。
本篇文章咱們主要講述了 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/