爲何要有HTTPS,簡單的回答是「由於HTTP不安全」。算法
一般認爲,若是通訊過程當中具有了四個特性,就能夠認爲是「安全」的,這四個特性是:機密性、完整性、身份認證和不能否認。瀏覽器
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,而是調用專門的安全接口。 session
SSL即安全套接層(Secure Sockets Layer),在OSI模型中處於第5層(會話層),由網景公司於1994年發明,有v2和v3兩個版本,而v1由於有嚴重的缺陷從未公開過。dom
SSL發展到v3時已經證實了它自身是一個很是好的安全通訊協議,因而互聯網工程組IETF在1999年把它更名爲TLS(傳輸層安全,Transport Layer Security),正式標準化,版本號從1.0從新算起,因此TLS1.0實際上就是SSLv3.1。ide
到今天TLS已經發展出了三個版本,分別是2006年的1.一、2008年的1.2和2018年的1.3,每一個新版本都緊跟密碼學的發展和互聯網的現狀,持續強化安全和性能,已經成爲了信息安全領域中的權威標準。函數
目前應用的最普遍的 TLS 是 1.2,而以前的協議(TLS1.1/1.0、SSLv3/v2)都已經被認爲是不安全的,各大瀏覽器即將在 2020 年左右中止支持,因此接下來的講解都針對的是 TLS1.2。工具
TLS由記錄協議、握手協議、警告協議、變動密碼規範協議、擴展協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術。
瀏覽器和服務器在使用TLS創建鏈接時須要選擇一組恰當的加密算法來實現安全通訊,這些算法的組合被稱爲」密碼套件「(cipher suite,也叫加密套件)。TLS的密碼套件命名很是規範,格式很固定。基本的形式是」密鑰交換算法+簽名算法+對稱加密算法+摘要算法「。例如「ECDHE-RSA-AES256-GCM-SHA384」的意思是「握手時使用 ECDHE 算法進行密鑰交換,用 RSA 簽名和身份認證,握手後的通訊使用 AES 對稱算法,密鑰長度 256 位,分組模式是 GCM,摘要算法 SHA384 用於消息認證和產生隨機數。」
說到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裏有很是多的對稱加密算法可供選擇,好比RC四、DES、3DES、AES、ChaCha20等,但前三種算法都被認爲是不安全的,一般都禁止使用,目前經常使用的只有AES和ChaCha20。
AES的意思是」高級加密標準「(Advanced Encryption Standard),密鑰長度能夠是12八、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差上好幾個數量級。若是僅使用非對稱加密,雖然保證了安全,但通訊速度過慢沒有實用性。
混合加密方式就是把對稱加密和非對稱加密結合起來呢,二者互相取長補短,即能高效地加密解密,又能安全地密鑰交換:
在通訊剛開始的時候使用非對稱算法,好比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種,經常使用的有SHA22四、SHA25六、SHA384,分別可以生成28字節、32字節、48字節的摘要。
摘要算法保證了」數字摘要「和原文是徹底等價的。因此,咱們只要在原文後附上它的摘要,就可以保證數據的完整性。
不過摘要算法不具備機密性,若是明文傳輸,那麼黑客能夠修改消息後把摘要也一塊兒改了。因此,真正的完整性必需要創建在機密性之上,在混合加密系統裏用會話密鑰加密消息和摘要,這樣黑客就沒法得知明文了。
這有個術語,叫哈希消息認證碼(HMAC)。
加密算法結合摘要算法,咱們的通訊過程能夠說是比較安全了。但這裏仍是有漏洞,就是通訊的兩個端點(endpoint)。黑客能夠假裝網站來竊取消息,也能夠假裝爲你,向網站發送支付、轉帳等消息。
那麼,在數字世界裏如何證實你的身份呢?因爲非對稱加密裏的」私鑰「只能由本人持有,那麼使用私鑰再加上摘要算法,就可以實現」數字簽名「,同時實現」身份認證「和」不能否認「。
數字簽名的原理其實很簡單,就是把公鑰私鑰的用法反過來,以前是公鑰加密,私鑰解密,如今是私鑰加密、公鑰解密。但又由於非對稱加密效率過低,因此私鑰只加密原文的摘要,這樣運算量就小的多,並且獲得的數字簽名也很小,方便保管和傳輸。
簽名和公鑰同樣徹底公開,任何人均可以獲取。但這個簽名只有用私鑰對應的公鑰才能解開,拿到摘要後,再比對原文驗證完整性,就能夠像簽署文件同樣證實消息確實是你發的。
剛纔的這兩個行爲也有專用術語,叫作」簽名「和」驗籤「。
只要你和網站互相交換公鑰,就能夠用」簽名「和」驗籤「來確認消息的真實性,由於私鑰保密,黑客不能僞造簽名,就可以保證通訊雙方的身份。
綜合使用對稱加密、非對稱加密和摘要算法,咱們已經實現了安全的四大特性。但這裏還有一個」公鑰的信任「問題。由於誰均可以發佈公鑰,咱們還缺乏防止黑客僞造公鑰的手段。
咱們能夠用相似密鑰交換的方法來解決公鑰認證問題,用別的私鑰來給公鑰簽名,顯然,這又會陷入」無窮遞歸「。
此次實在是」沒招「了,要終結這個」死循環「,就必需要引入」外力「,找一個公認的可信第三方,讓它做爲」信任的起點,遞歸的終點「,構建起公鑰的信任鏈。
這個」第三方「就是咱們常說的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)。你必須相信,不然整個證書信任鏈就走不下去了。
有了這個證書體系,操做系統和瀏覽器都內置了各大CA的根證書,上網的時候只要服務器發過來它的證書,就能夠驗證證書裏的簽名,順着證書鏈(Certificate Chain)一層層地驗證,直到找到根證書,就能夠肯定證書是可信的,從而裏面的公鑰能夠可信的。證書體系(PKI,Public Key Infrastructure)雖然是目前整個網絡世界的安全基礎設施,但絕對的安全是不存在的,它也有弱點,仍是關鍵的」信任「二字。
若是CA失誤或者被欺騙,簽發了錯誤的證書,雖然證書是真的,可它表明的網站倒是假的。
還有一種更危險的狀況,CA被黑客攻陷,或者CA有惡意,由於它(即根證書)是信任的源頭,整個信任鏈裏的全部證書也就都不可信了。
因此,須要再給證書體系打上一些補丁。
針對第一種,開發出了CRL(證書吊銷列表,Certificate revocation list)和OCSP(在線證書狀態協議,Online Certificate Status Protocol),及時廢止有問題的證書。
對於第二種,由於涉及的證書太多,就只能操做系統或者瀏覽器從根上」下狠手「了,撤銷對CA的信任,列入」黑名單「,這樣它頒發的全部證書就都會被認爲是不安全的。
Q:你能說出 HTTPS 與 HTTP 有哪些區別嗎?
Q:你知道有哪些方法可以實現機密性、完整性等安全特性呢?
Q:加密算法中「密鑰」的名字很形象,你能試着用現實中的鎖和鑰匙來比喻一下嗎?
Q:在混合加密中用到了公鑰加密,由於只能由私鑰解密。那麼反過來,私鑰加密後任何人均可以用公鑰解密,這有什麼用呢?
Q:爲何公鑰可以創建信任鏈,用對稱加密算法裏的對稱密鑰行不行呢?
Q:假設有一個三級的證書體系(Root CA=> 一級 CA=> 二級 CA),你能詳細解釋一下證書信任鏈的驗證過程嗎?