HTTPS之對稱加密與非對稱加密(一)

tips: 首先要知道 HTTPS相對於HTTP 增長了機密性完整性身份認證不能否認等特性算法

先說說機密性。它是信息安全的基礎

缺少機密性 TLS就會成爲「無水之源」「無根之木」。實現機密性最經常使用的手段是「加密」(encrypt),就是把消息用某種方式轉換成誰也看不懂的亂碼,只有掌握特殊「鑰匙」的人才能再轉換出原始文本。安全

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

全部的加密算法都是公開的,任何人均可以去分析研究,而算法使用的「密鑰」則必須保密。那麼,這個關鍵的「密鑰」又是什麼呢?性能

因爲 HTTPS、TLS 都運行在計算機上,因此「密鑰」就是一長串的數字,但約定俗成的度量單位是「位」(bit),而不是「字節」(byte)。好比,說密鑰長度是 128,就是 16 字節的二進制串,密鑰長度 1024,就是 128 字節的二進制串。優化

按照密鑰的使用方式,加密能夠分爲兩大類:對稱加密非對稱加密網站

對稱加密

「對稱加密」很好理解,就是指加密和解密時使用的密鑰都是同一個,是「對稱」的。只要保證了密鑰的安全,那整個通訊過程就能夠說具備了機密性。加密

舉個例子,你想要登陸某網站,只要事先和它約定好使用一個對稱密鑰,通訊過程當中傳輸的全是用密鑰加密後的密文,只有你和網站才能解密。黑客即便可以竊聽,看到的也只是亂碼,由於沒有密鑰沒法解出明文,因此就實現了機密性。設計

TLS 裏有很是多的對稱加密算法可供選擇,好比 RC四、DES、3DES、AES、ChaCha20 等,但前三種算法都被認爲是不安全的,一般都禁止使用,目前經常使用的只有 AESChaCha203d

AES 的意思是「高級加密標準」(Advanced Encryption Standard),密鑰長度能夠是 12八、192 或 256。它是 DES 算法的替代者,安全強度很高,性能也很好,並且有的硬件還會作特殊優化,因此很是流行,是應用最普遍的對稱加密算法。cdn

ChaCha20 是 Google 設計的另外一種加密算法,密鑰長度固定爲 256 位,純軟件運行性能要超過 AES,曾經在移動客戶端上比較流行,但 ARMv8 以後也加入了 AES 硬件優化,因此如今再也不具備明顯的優點,但仍然算得上是一個不錯的算法。

加密分組模式

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

最先有 ECB、CBC、CFB、OFB 等幾種分組模式,但都陸續被發現有安全漏洞,因此如今基本都不怎麼用了。最新的分組模式被稱爲 AEAD(Authenticated Encryption with Associated Data),在加密的同時增長了認證的功能,經常使用的是 GCM、CCM 和 Poly1305。

把上面這些組合起來,就能夠獲得 TLS 密碼套件中定義的對稱加密算法

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

非對稱加密

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

由於在對稱加密算法中只要持有密鑰就能夠解密。若是你和網站約定的密鑰在傳遞途中被黑客竊取,那他就能夠在以後隨意解密收發的數據,通訊過程也就沒有機密性可言了。

這個問題該怎麼解決呢?

你或許會說:「把密鑰再加密一下發過去就行了」,但傳輸「加密密鑰的密鑰」又成了新問題。這就像是「雞生蛋、蛋生雞」,能夠無限遞歸下去。只用對稱加密算法,是絕對沒法解決密鑰交換的問題的。

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

它有兩個密鑰,一個叫「公鑰」(public key),一個叫「私鑰」(private key)。兩個密鑰是不一樣的,「不對稱」,公鑰能夠公開給任何人使用,而私鑰必須嚴格保密。

公鑰和私鑰有個特別的「單向」性,雖然均可以用來加密解密,但公鑰加密後只能用私鑰解密,反過來,私鑰加密後也只能用公鑰解密。

非對稱加密能夠解決「密鑰交換」的問題。網站祕密保管私鑰,在網上任意分發公鑰,你想要登陸網站只要用公鑰加密就好了,密文只能由私鑰持有者才能解密。而黑客由於沒有私鑰,因此就沒法破解密文。

非對稱加密算法的設計要比對稱算法可貴多,在 TLS 裏只有不多的幾種,好比 DH、DSA、RSA、ECC 等。

RSA 多是其中最著名的一個,幾乎能夠說是非對稱加密的代名詞

比起 RSA,ECC 在安全強度和性能上都有明顯的優點。160 位的 ECC 至關於 1024 位的 RSA,而 224 位的 ECC 則至關於 2048 位的 RSA。由於密鑰短,因此相應的計算量、消耗的內存和帶寬也就少,加密解密的性能就上去了,對於如今的移動互聯網很是有吸引力。

混合加密

看到這裏,你是否是認爲能夠拋棄對稱加密,只用非對稱加密來實現機密性呢?

很遺憾,雖然非對稱加密沒有「密鑰交換」的問題,但由於它們都是基於複雜的數學難題,運算速度很慢,即便是 ECC 也要比 AES 差上好幾個數量級。若是僅用非對稱加密,雖然保證了安全,但通訊速度有如烏龜、蝸牛,實用性就變成了零。

那麼,是否是可以把對稱加密和非對稱加密結合起來呢,二者互相取長補短,即能高效地加密解密,又能安全地密鑰交換。

這就是如今 TLS 裏使用的混合加密方式,其實說穿了也很簡單:

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

而後用隨機數產生對稱算法使用的「會話密鑰」(session key),再用公鑰加密。由於會話密鑰很短,一般只有 16 字節或 32 字節,因此慢一點也無所謂。

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

這樣混合加密就解決了對稱加密算法的密鑰交換問題,並且安全和性能兼顧,完美地實現了機密性。

不過這只是第一步,後面還有完整性、身份認證、不能否認等特性沒有實現,因此如今的通訊還不是絕對安全,咱們下次再說。

相關文章
相關標籤/搜索