天天看點

透視HTTP協定-HTTPS、對稱加密與非對稱加密&數字簽名與證書

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

HTTPS

為什麼要有HTTPS,簡單的回答是“因為HTTP不安全”。

什麼是安全?

通常認為,如果通信過程中具備了四個特性,就可以認為是“安全”的,這四個特性是:機密性、完整性、身份認證和不可否認。

  • 機密性(Secrecy/Confidentiality)是指對資料的”保密“,隻能由可信的人通路,對其他人是不可見的”秘密“,簡單來說就是不能讓不相關的人看到不該看的東西。
  • 完整性(Integrity,也叫一緻性)是指資料在傳輸過程中沒有被篡改,不多也不少,”完完整整“地保持着原狀。
  • 身份認證(Authentication)是指确認對方的真實身份,也就是”證明你真的是你“,保證消息隻能發送給可信的人。
  • 不可否認(Non-repudiation/Undeniable),也叫不可抵賴,意思是不能否認已經發生過的行為,不能”說話不算數“”耍賴皮“。

什麼是HTTPS?

HTTPS為HTTP增加了剛才所說的四大安全特性。

HTTPS其實是一個”非常簡單“的協定,RFC文檔很小,隻有短短的7頁,裡面規定了新的協定名”https“,預設端口号443,至于其他的什麼請求-應答模式、封包結構、請求方法、URI、頭字段、連接配接管理等等都完全沿用HTTP,沒有任何新的東西。

那HTTPS怎麼做到機密性、完整性這些安全特性的呢?

秘密就在于HTTPS名字裡的”S“,它把HTTP下層的傳輸協定由TCP/IP換成了SSL/TLS,由”HTTP over TCP/IP“變成了”HTTP over SSL/TLS“,讓HTTP運作在了安全的SSL/TLS協定上,收發封包不再使用Socket API,而是調用專門的安全接口。

透視HTTP協定-HTTPS、對稱加密與非對稱加密&數字簽名與證書

SSL/TLS

SSL即安全套接層(Secure Sockets Layer),在OSI模型中處于第5層(會話層),由網景公司于1994年發明,有v2和v3兩個版本,而v1因為有嚴重的缺陷從未公開過。

SSL發展到v3時已經證明了它自身是一個非常好的安全通信協定,于是網際網路工程組IETF在1999年把它改名為TLS(傳輸層安全,Transport Layer Security),正式标準化,版本号從1.0重新算起,是以TLS1.0實際上就是SSLv3.1。

到今天TLS已經發展出了三個版本,分别是2006年的1.1、2008年的1.2和2018年的1.3,每個新版本都緊跟密碼學的發展和網際網路的現狀,持續強化安全和性能,已經成為了資訊安全領域中的權威标準。

目前應用的最廣泛的 TLS 是 1.2,而之前的協定(TLS1.1/1.0、SSLv3/v2)都已經被認為是不安全的,各大浏覽器即将在 2020 年左右停止支援,是以接下來的講解都針對的是 TLS1.2。

TLS由記錄協定、握手協定、警告協定、變更密碼規範協定、擴充協定等幾個子協定組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術。

透視HTTP協定-HTTPS、對稱加密與非對稱加密&數字簽名與證書

浏覽器和伺服器在使用TLS建立連接配接時需要選擇一組恰當的加密算法來實作安全通信,這些算法的組合被稱為”密碼套件“(cipher suite,也叫加密套件)。TLS的密碼套件命名非正常範,格式很固定。基本的形式是”密鑰交換算法+簽名算法+對稱加密算法+摘要算法“。例如“ECDHE-RSA-AES256-GCM-SHA384”的意思是“握手時使用 ECDHE 算法進行密鑰交換,用 RSA 簽名和身份認證,握手後的通信使用 AES 對稱算法,密鑰長度 256 位,分組模式是 GCM,摘要算法 SHA384 用于消息認證和産生随機數。”

OpenSSL

說到TLS,就不能不談到OpenSSL,它是一個著名的開源密碼學程式庫和工具包,幾乎支援所有公開的加密算法和協定,已經成為事實上的标準,許多應用軟體都會使用它作為底層庫來實作TLS功能,包括常用的Web伺服器Apache、Nginx等。OpenSSL是著名的開源密碼學工具包,是SSL/TLS的具體實作。

對稱加密和非對稱加密

實作機密性最常用的手段是”加密“(encrypt),就是把消息用某種方式轉換成誰也看不懂的亂碼,隻有掌握特殊”鑰匙”的人才能再轉換出原始文本。

這裡的“鑰匙”就叫做“密鑰”(key),加密前的消息叫“明文”(plain text/clear text),加密後的亂碼叫“密文”(cipher text),使用密鑰還原明文的過程叫“解密”(decrypt),是加密的反操作,加密解密的操作過程就是“加密算法”。

所有的加密算法都是公開的,任何人都可以去分析研究,而算法使用的“密鑰”則必須保密。由于HTTPS、TLS都運作在計算機上,是以“密鑰”就是一長串的數字,但約定俗成的度量單是”位“(bit),而不是”位元組“(byte)。比如,說密鑰長度是128,就是16位元組的二進制串,密鑰長度1024,就是128位元組的二進制串。

對稱加密

對稱加密就是指加密和解密時使用的密鑰是同一個,是”對稱“的。隻要保證了密鑰的安全,那整個通信過程就可以說具有了機密性。

TLS裡有非常多的對稱加密算法可供選擇,比如RC4、DES、3DES、AES、ChaCha20等,但前三種算法都被認為是不安全的,通常都禁止使用,目前常用的隻有AES和ChaCha20。

AES的意思是”進階加密标準“(Advanced Encryption Standard),密鑰長度可以是128、192或256。它是DES算法的替代者,安全強度很高,性能也很好,而且有的硬體還會做特殊優化,是以非常流行,是應用最廣泛的對稱加密算法。

ChaCha20是Google設計的另一種加密算法,密鑰長度固定為256位,純軟體運作性能要超過AES,曾經在移動用戶端上比較流行,但ARMv8之後也加入了AES硬體優化,是以現在不再具有明顯的優勢,但仍然算得上是一個不錯的算法。

加密分組模式

對稱算法還有一個”分組模式“的概念,它可以讓算法用固定長度的密鑰加密任意長度的明文,把小秘密(密鑰)轉化為大秘密(即密文)。

最新的分組模式被稱為AEAD(Authenticated Encryption ),在加密的同時增加了認證的功能,常用的是GCM、CCM和Poly1305。

把上面這些組合起來,就可以得到TLS密碼套件中定義的對稱加密算法。

比如,AES128-GCM,意思是密鑰長度為128位的AES算法,使用的分組模式是GCM;ChaCha20-Poly1305的意思是ChaCha20算法,使用的分組模式是Poly1305。

非對稱加密

對稱加密看上去好像完美地實作了機密性,但其中有一個很大的問題:如何把密鑰安全地傳遞給對方,術語叫”密鑰交換“。

是以,就出現了非對稱加密(也叫公鑰加密算法)。

它有兩個密鑰,一個叫”公鑰“(public key),一個叫”私鑰“(private key)。兩個密鑰是不同的,”不對稱“,公鑰可以公開給任何人使用,而私鑰必須嚴格保密。

公鑰和私鑰有個特别的”單向“性,雖然都可以用來加密解密,但公鑰加密後隻能用私鑰解密,反過來,私鑰加密後也隻能用公鑰解密。

非對稱加密可以解決”密鑰交換“的問題。網站秘密保管私鑰,在網上任意分發公鑰,你想要登入網站隻要用公鑰加密就行了,密文隻能由私鑰持有者才能解密。

非對稱加密算法的設計要比對稱算法難的多,在TLS裡隻有很少的幾種,比如DH、DSA、RSA、ECC等。

RSA可能是其中最著名的一個,幾乎可以說是非對稱加密的代名詞,它的安全性基于”整數分解“的數學難題,使用兩個超大素數的乘積作為生成密鑰的材料,想要從公鑰推算出私鑰是非常困難的。

ECC(Elliptic Curve Cryptography)是非對稱加密裡的“後起之秀”,它基于“橢圓曲線離散對數”的數學難題,使用特定的曲線方程和基點生成公鑰和私鑰,子算法 ECDHE 用于密鑰交換,ECDSA 用于數字簽名。

比起 RSA,ECC 在安全強度和性能上都有明顯的優勢。160 位的 ECC 相當于 1024 位的 RSA,而 224 位的 ECC 則相當于 2048 位的 RSA。因為密鑰短,是以相應的計算量、消耗的記憶體和帶寬也就少,加密解密的性能就上去了,對于現在的移動網際網路非常有吸引力。

混合加密

非對稱加密雖然沒有”密鑰交換“的問題,但因為它們都是基于複雜的數學難題,運算速度很慢,即使是ECC也要比AES差上好幾個數量級。如果僅使用非對稱加密,雖然保證了安全,但通信速度過慢沒有實用性。

混合加密方式就是把對稱加密和非對稱加密結合起來呢,兩者互相取長補短,即能高效地加密解密,又能安全地密鑰交換:

透視HTTP協定-HTTPS、對稱加密與非對稱加密&數字簽名與證書

在通信剛開始的時候使用非對稱算法,比如RSA、ECDHE,首先解決密鑰交換的問題。

然後用随機數産生對稱算法使用的”會話密鑰“(session key),再用公鑰加密。因為會話密鑰很短,通常隻有16位元組或32位元組,是以慢一點也無所謂。

對方拿到密文後用私鑰解密,取出會話密鑰。這樣,雙方就實作了對稱密鑰的安全交換,後續就不再使用非對稱加密,全都使用對稱加密。

數字簽名和證書

加密實作了機密性,但仍無法保證完整性和身份認證等特性

摘要算法

實作完整性的手段主要是摘要算法(Digest Algorithm),也就是常說的散列函數、哈希函數(Hash Function)。

你可以把摘要算法近似地了解成一種特殊的壓縮算法,它能夠把任意長度的資料”壓縮“成固定長度、而且獨一無二的”摘要“字元串,就好像是給這段資料生成了一個數字”指紋“。也可以把摘要算法了解成特殊的”單向“加密算法,它隻有算法,沒有密鑰,加密後的資料無法解密,不能從摘要逆推出原文。

因為摘要算法對輸入具有”單向性“和”雪崩效應“,輸入的微小不同會導緻輸出的劇烈裱花,是以也被TLS用來生成僞随機數(PRF,pseudo random function)。

MD5(Message-Digest 5)、SHA-1(Secure Hash Algorithm 1)就是最常用的兩個摘要算法,能夠生成16位元組和20位元組長度的數字摘要。但這兩個算法的安全強度比較低,不夠安全,在TLS裡已經被禁止使用了。

目前TLS推薦使用的是SHA-1的後繼者:SHA-2。SHA-2實際上是一系列摘要算法的統稱,總共有6種,常用的有SHA224、SHA256、SHA384,分别能夠生成28位元組、32位元組、48位元組的摘要。

完整性

摘要算法保證了”數字摘要“和原文是完全等價的。是以,我們隻要在原文後附上它的摘要,就能夠保證資料的完整性。

不過摘要算法不具有機密性,如果明文傳輸,那麼黑客可以修改消息後把摘要也一起改了。是以,真正的完整性必須要建立在機密性之上,在混合加密系統裡用會話密鑰加密消息和摘要,這樣黑客就無法得知明文了。

透視HTTP協定-HTTPS、對稱加密與非對稱加密&數字簽名與證書

這有個術語,叫哈希消息認證碼(HMAC)。

數字簽名

加密算法結合摘要算法,我們的通信過程可以說是比較安全了。但這裡還是有漏洞,就是通信的兩個端點(endpoint)。黑客可以僞裝網站來竊取消息,也可以僞裝為你,向網站發送支付、轉賬等消息。

那麼,在數字世界裡如何證明你的身份呢?由于非對稱加密裡的”私鑰“隻能由本人持有,那麼使用私鑰再加上摘要算法,就能夠實作”數字簽名“,同時實作”身份認證“和”不可否認“。

數字簽名的原理其實很簡單,就是把公鑰私鑰的用法反過來,之前是公鑰加密,私鑰解密,現在是私鑰解密、公鑰加密。但又因為非對稱加密效率太低,是以私鑰隻加密原文的摘要,這樣運算量就小的多,而且得到的數字簽名也很小,友善保管和傳輸。

簽名和公鑰一樣完全公開,任何人都可以擷取。但這個簽名隻有用私鑰對應的公鑰才能解開,拿到摘要後,再比對原文驗證完整性,就可以像簽署檔案一樣證明消息确實是你發的。

透視HTTP協定-HTTPS、對稱加密與非對稱加密&數字簽名與證書

剛才的這兩個行為也有專用術語,叫做”簽名“和”驗簽“。

隻要你和網站互相交換公鑰,就可以用”簽名“和”驗簽“來确認消息的真實性,因為私鑰保密,黑客不能僞造簽名,就能夠保證通信雙方的身份。

數字證書和CA

綜合使用對稱加密、非對稱加密和摘要算法,我們已經實作了安全的四大特性。但這裡還有一個”公鑰的信任“問題。因為誰都可以釋出公鑰,我們還缺少防止黑客僞造公鑰的手段。

我們可以用類似密鑰交換的方法來解決公鑰認證問題,用别的私鑰來給公鑰簽名,顯然,這又會陷入”無窮遞歸“。

這次實在是”沒招“了,要終結這個”死循環“,就必須要引入”外力“,找一個公認的可信第三方,讓它作為”信任的起點,遞歸的終點“,建構起公鑰的信任鍊。

這個”第三方“就是我們常說的CA(Certificate Authority,證書認證機構)。它就像網絡世界裡的警察局、教育局、公證中心,具有極高的可信度,由它來給各個公鑰簽名,用自身的信譽來保證公鑰無法僞造,是可信的。

CA對公鑰的簽名認證也是有格式的,不是簡單地把公鑰綁定在持有者身份上就完事了,還要包含序列号、用途、頒發者、有效時間等等,把這些打成一個包再簽名,完整地證明公鑰關聯的各種資訊,形成”數字證書“(Certificate)

知名的CA全世界就那麼幾家,比如DigiCert、VeriSign、Entrust、Let's Encrypt等,它們簽發的證書分DV、OV、EV三種,差別在于可信程度。

DV是最低的,隻是域名級别的可信,背後是誰不知道。EV是最高的,經過了法律和審計的嚴格核查,可以證明網站擁有者的身份(在浏覽器位址欄會顯示出公司的名字,例如Apple、Github的網站)。

不過,CA怎麼證明自己呢?

這還是信任鍊的問題。小一點的CA可以讓大CA簽名認證,但鍊條的最後,也就是Root CA,就隻能自己證明自己了,這個就叫”自簽名證書“(Self-Signed Certificate)或者”根證書“(Root Certificate)。你必須相信,否則整個證書信任鍊就走不下去了。

透視HTTP協定-HTTPS、對稱加密與非對稱加密&數字簽名與證書

有了這個證書體系,作業系統和浏覽器都内置了各大CA的根證書,上網的時候隻要伺服器發過來它的證書,就可以驗證證書裡的簽名,順着證書鍊(Certificate Chain)一層層地驗證,直到找到根證書,就可以确定證書是可信的,進而裡面的公鑰可以可信的。

證書體系的弱點

證書體系(PKI,Public Key Infrastructure)雖然是目前整個網絡世界的安全基礎設施,但絕對的安全是不存在的,它也有弱點,還是關鍵的”信任“二字。

如果CA失誤或者被欺騙,簽發了錯誤的證書,雖然證書是真的,可它代表的網站卻是假的。

還有一種更危險的情況,CA被黑客攻陷,或者CA有惡意,因為它(即根證書)是信任的源頭,整個信任鍊裡的所有證書也就都不可信了。

是以,需要再給證書體系打上一些更新檔。

針對第一種,開發出了CRL(證書吊銷清單,Certificate revocation list)和OCSP(線上證書狀态協定,Online Certificate Status Protocol),及時廢止有問題的證書。

對于第二種,因為涉及的證書太多,就隻能作業系統或者浏覽器從根上”下狠手“了,撤銷對CA的信任,列入”黑名單“,這樣它頒發的所有證書就都會被認為是不安全的。

Q&A

Q:你能說出 HTTPS 與 HTTP 有哪些差別嗎?

Q:你知道有哪些方法能夠實作機密性、完整性等安全特性呢?

Q:加密算法中“密鑰”的名字很形象,你能試着用現實中的鎖和鑰匙來比喻一下嗎?

Q:在混合加密中用到了公鑰加密,因為隻能由私鑰解密。那麼反過來,私鑰加密後任何人都可以用公鑰解密,這有什麼用呢?

Q:為什麼公鑰能夠建立信任鍊,用對稱加密算法裡的對稱密鑰行不行呢?

Q:假設有一個三級的證書體系(Root CA=> 一級 CA=> 二級 CA),你能詳細解釋一下證書信任鍊的驗證過程嗎?

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-06-12

本文作者:laity0828

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”

繼續閱讀