HTTPS,你不知道的事兒
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等等 </ul> </li>
-
Hash算法加密
- 單向加密
- 通過Hash算法對數據加密生成唯一Hash值,此值無法計算出原來的數據
- 頻繁應用于數據完整性檢驗
- 常用算法有:SHA、MD2、MD4、MD5等等 </ul> </li> </ul>
- 加密或解密都需要一個密鑰,正如開門或鎖門都需要一把鑰匙
- Java中密鑰由KeyGenerator或KeyPairGenerator生成的
-
對稱密鑰(KeyGenerator生成的)
- 使用同一個密鑰加密或加密
-
非對稱密鑰(KeyPairGenerator生成的)
- 公鑰(pulickey)廣泛用做傳播,主要用做加密,私鑰(privatekey)用做解密(公鑰加密后的數據只有私鑰才能解密) </ul> </li> </ul>
- 證書是一個許可證,用來證明這個證書的可信賴的
- 證書中可能內置密鑰
- android系統內置了很多證書,證書之間存在一定信任關系,信任是嵌套的,為了確保密鑰的更高安全性
- 將數據加密
- 將加密后的數據和密鑰同時傳給服務器
- 服務器利用傳來的密鑰解密數據
-
服務器將公鑰發給客戶端
-
客戶端將數據采用公鑰加密然后發送給服務器
-
服務器收到客戶端加密數據,用私鑰解密數據
-
服務器生成一對非對稱加密密鑰:公鑰(publickey)、私鑰(privatekey)
-
服務器將公鑰(publickey)發送給客戶端
-
客戶端生成對稱加密密鑰(clientkey),利用clientkey給數據加密
-
客戶端使用服務器傳來的公鑰(publickey)給clientkey進行加密、此時clientkey是安全的,因為只有服務器才有私鑰(private)能解密它
-
客戶端發送用clientkey加密過的數據和用公鑰(publickey)加密過的clientkey給服務器
-
服務器使用私鑰(privatekey)解密用公鑰(publickey)加密過的clientkey,得到真的clientkey
-
使用clientkey解密數據,這樣數據就安全地從客戶端傳給服務器了。
證書
了解上面兩個概念后,我們接著來講HTTPS如何通信?前面在定義HTTPS時講到HTTPS是一種加密的HTTP,為了更高的安全性,沒錯,密鑰和證書正是特定設計來實現HTTPS安全通信的。
說到安全通信,我們可能先想到對稱加密算法,思路如下:
以上這種方案存在很大漏洞,假如加密后的數據和密鑰被黑客給截獲,黑客拿著密鑰直接把加密后的數據給解密了,這樣數據就泄漏出去了。
1132780-f58fe3a5c5a7c281.jpg
既然對稱算法不行,那就來試試非對稱算法,思路如下:
以上這個方案貌似不錯,看過前面加密算法說明的童鞋應該清楚非對稱算法有缺陷,就是加密、解密過程較慢、耗時多,影響用戶體驗。
1132780-4e0c4064e76528b6.jpg
那有木有更好的方案呢?必須有啦,HTTPS最終采用的安全通信方案,大家看清楚啦
1132780-2d7d1306d1b86b65.jpg
思路如下:
總結
由于對稱加密算法比非對稱加密算法效率高、性能好,https決定采用對稱加密算法來加密解密數據,使用非對稱加密算法加密解密對稱算法密鑰,以確保通信安全。
1132780-253900d649118aa0.jpg
來自:http://www.jianshu.com/p/756e100c1c2e
how to work
在弄清HTTPS如何工作前,我需要了解兩個概念:
密鑰