what is https?
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
看到上面定義,我們大致也明白了HTTPS其實就是一個經過加密後的HTTP,具有更高的安全性。因此我們就需要了解一下經過加密的HTTPS是如何工作的?
加密演算法
筆者目前所瞭解到的演算法歸為三類:
對稱加密
- 對稱密碼編碼技術
- 編碼和解碼採用相同描述字元(加密、解密採用相同金鑰)
- 對稱加密使用簡單
- 金鑰較短
- 加密、解密過程較快、耗時短
- 常見演算法有:DES、3DES、IDEA、AES、RC4等等
非對稱加密
- 加密需要兩個金鑰:公鑰(publickey)、私鑰(privatekey)
- 公鑰加密,私鑰才能解密
- 保密性好
- 加密、解密過程較慢、耗時多
- 適合對少量資料加密
- 常見演算法有:RSA、ECC、DSA等等
Hash演算法加密
- 單向加密
- 通過Hash演算法對資料加密生成唯一Hash值,此值無法計算出原來的資料
- 頻繁應用於資料完整性檢驗
- 常用演算法有:SHA、MD2、MD4、MD5等等
how to work
在弄清HTTPS如何工作前,我需要了解兩個概念:
金鑰
- 加密或解密都需要一個金鑰,正如開門或鎖門都需要一把鑰匙
- Java中金鑰由KeyGenerator或KeyPairGenerator生成的
對稱金鑰(KeyGenerator生成的)
- 使用同一個金鑰加密或加密
非對稱金鑰(KeyPairGenerator生成的)
- 公鑰(pulickey)廣泛用做傳播,主要用做加密,私鑰(privatekey)用做解密(公鑰加密後的資料只有私鑰才能解密)
證照
- 證照是一個許可證,用來證明這個證照的可信賴的
- 證照中可能內建金鑰
- android系統內建了很多證照,證照之間存在一定信任關係,信任是巢狀的,為了確保金鑰的更高安全性
瞭解上面兩個概念後,接下來我們來了解下HTTPS如何安全通訊?前面在定義HTTPS時講到HTTPS是一種加密的HTTP,為了更高的安全性,沒錯,金鑰和證照正是特定設計來實現HTTPS安全通訊的。
說到安全通訊,我們可能先想到對稱加密演算法,思路如下:
- 將資料加密
- 將加密後的資料和金鑰同時傳給伺服器
- 伺服器利用傳來的金鑰解密資料
以上這種方案存在很大漏洞,假如加密後的資料和金鑰被黑客給截獲,黑客拿著金鑰直接把加密後的資料給解密了,這樣資料就洩漏出去了。
既然對稱演算法不行,那就來試試非對稱演算法,思路如下:
- 伺服器將公鑰發給客戶端
- 客戶端將資料採用公鑰加密然後傳送給伺服器
- 伺服器收到客戶端加密資料,用私鑰解密資料
以上這個方案貌似不錯,看過前面加密演算法說明的童鞋應該清楚非對稱演算法有缺陷,就是加密、解密過程較慢、耗時多,影響使用者體驗。
那有木有更好的方案呢?必須有啦~HTTPS最終採用的安全通訊方案,大家看清楚啦
思路如下:
- 伺服器生成一對非對稱加密金鑰:公鑰(publickey)、私鑰(privatekey)
- 伺服器將公鑰(publickey)傳送給客戶端
- 客戶端生成對稱加密金鑰(clientkey),利用clientkey給資料加密
- 客戶端使用伺服器傳來的公鑰(publickey)給clientkey進行加密、此時clientkey是安全的,因為只有伺服器才有私鑰(private)能解密它
- 客戶端傳送用clientkey加密過的資料和用公鑰(publickey)加密過的clientkey給伺服器
- 伺服器使用私鑰(privatekey)解密用公鑰(publickey)加密過的clientkey,得到真的clientkey
- 使用clientkey解密資料,這樣資料就安全地從客戶端傳給伺服器了。
總結
由於對稱加密演算法比非對稱加密演算法效率高、效能好,https決定採用對稱加密演算法來加密解密資料,使用非對稱加密演算法加密解密對稱演算法金鑰,以確保通訊安全。
關於作者
- QQ:872721111
- Email:leibing1989@126.com
- Github:leibing@github
- 簡書:leibing@jianshu
- 掘金:leibing@juejin