what is https?
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)瓶埋,是以安全為目標(biāo)的HTTP通道篮愉,簡(jiǎn)單講是HTTP的安全版。即HTTP下加入SSL層集侯,HTTPS的安全基礎(chǔ)是SSL被啼,因此加密的詳細(xì)內(nèi)容就需要SSL。
看到上面定義棠枉,我們大致也明白了HTTPS其實(shí)就是一個(gè)經(jīng)過加密后的HTTP浓体,具有更高的安全性。因此我們就需要了解一下經(jīng)過加密的HTTPS是如何工作的辈讶?
加密算法
筆者目前所了解到的算法歸為三類:
對(duì)稱加密
對(duì)稱密碼編碼技術(shù)
編碼和解碼采用相同描述字符(加密命浴、解密采用相同密鑰)
對(duì)稱加密使用簡(jiǎn)單
密鑰較短
加密、解密過程較快贱除、耗時(shí)短
常見算法有:DES生闲、3DES、IDEA月幌、AES跪腹、RC4等等
非對(duì)稱加密
加密需要兩個(gè)密鑰:公鑰(publickey)、私鑰(privatekey)
公鑰加密飞醉,私鑰才能解密
保密性好
加密冲茸、解密過程較慢、耗時(shí)多
適合對(duì)少量數(shù)據(jù)加密
常見算法有:RSA缅帘、ECC轴术、DSA等等
Hash算法加密
單向加密
通過Hash算法對(duì)數(shù)據(jù)加密生成唯一Hash值,此值無法計(jì)算出原來的數(shù)據(jù)
頻繁應(yīng)用于數(shù)據(jù)完整性檢驗(yàn)
常用算法有:SHA钦无、MD2逗栽、MD4、MD5等等
how to work
在弄清HTTPS如何工作前失暂,我需要了解兩個(gè)概念:
密鑰
加密或解密都需要一個(gè)密鑰彼宠,正如開門或鎖門都需要一把鑰匙
Java中密鑰由KeyGenerator或KeyPairGenerator生成的
對(duì)稱密鑰(KeyGenerator生成的)
使用同一個(gè)密鑰加密或加密
非對(duì)稱密鑰(KeyPairGenerator生成的)
公鑰(pulickey)廣泛用做傳播,主要用做加密弟塞,私鑰(privatekey)用做解密(公鑰加密后的數(shù)據(jù)只有私鑰才能解密)
證書
- 證書是一個(gè)許可證凭峡,用來證明這個(gè)證書的可信賴的
- 證書中可能內(nèi)置密鑰
- android系統(tǒng)內(nèi)置了很多證書,證書之間存在一定信任關(guān)系决记,信任是嵌套的摧冀,為了確保密鑰的更高安全性
了解上面兩個(gè)概念后,接下來我們來了解下HTTPS如何安全通信?前面在定義HTTPS時(shí)講到HTTPS是一種加密的HTTP索昂,為了更高的安全性建车,沒錯(cuò),密鑰和證書正是特定設(shè)計(jì)來實(shí)現(xiàn)HTTPS安全通信的椒惨。
說到安全通信缤至,我們可能先想到對(duì)稱加密算法,思路如下:
- 將數(shù)據(jù)加密
- 將加密后的數(shù)據(jù)和密鑰同時(shí)傳給服務(wù)器
- 服務(wù)器利用傳來的密鑰解密數(shù)據(jù)
以上這種方案存在很大漏洞康谆,假如加密后的數(shù)據(jù)和密鑰被黑客給截獲领斥,黑客拿著密鑰直接把加密后的數(shù)據(jù)給解密了,這樣數(shù)據(jù)就泄漏出去了秉宿。
既然對(duì)稱算法不行,那就來試試非對(duì)稱算法屯碴,思路如下:
- 服務(wù)器將公鑰發(fā)給客戶端
- 客戶端將數(shù)據(jù)采用公鑰加密然后發(fā)送給服務(wù)器
- 服務(wù)器收到客戶端加密數(shù)據(jù)描睦,用私鑰解密數(shù)據(jù)
以上這個(gè)方案貌似不錯(cuò),看過前面加密算法說明的童鞋應(yīng)該清楚非對(duì)稱算法有缺陷导而,就是加密忱叭、解密過程較慢、耗時(shí)多今艺,影響用戶體驗(yàn)韵丑。
那有木有更好的方案呢?必須有啦~~HTTPS最終采用的安全通信方案虚缎,大家看清楚啦~
思路如下:
- 服務(wù)器生成一對(duì)非對(duì)稱加密密鑰:公鑰(publickey)撵彻、私鑰(privatekey)
- 服務(wù)器將公鑰(publickey)發(fā)送給客戶端
- 客戶端生成對(duì)稱加密密鑰(clientkey),利用clientkey給數(shù)據(jù)加密
- 客戶端使用服務(wù)器傳來的公鑰(publickey)給clientkey進(jìn)行加密、此時(shí)clientkey是安全的实牡,因?yàn)橹挥蟹?wù)器才有私鑰(private)能解密它
- 客戶端發(fā)送用clientkey加密過的數(shù)據(jù)和用公鑰(publickey)加密過的clientkey給服務(wù)器
- 服務(wù)器使用私鑰(privatekey)解密用公鑰(publickey)加密過的clientkey陌僵,得到真的clientkey
- 使用clientkey解密數(shù)據(jù),這樣數(shù)據(jù)就安全地從客戶端傳給服務(wù)器了创坞。
總結(jié)
由于對(duì)稱加密算法比非對(duì)稱加密算法效率高碗短、性能好,https決定采用對(duì)稱加密算法來加密解密數(shù)據(jù)题涨,使用非對(duì)稱加密算法加密解密對(duì)稱算法密鑰偎谁,以確保通信安全。
關(guān)于作者
- QQ:872721111
- Email:leibing1989@126.com
- Github:leibing@github
- 簡(jiǎn)書:leibing@jianshu
- 掘金:leibing@juejin