簡(jiǎn)述:
以下內(nèi)容忽略非常多細(xì)節(jié),僅個(gè)人抽象理解,請(qǐng)理性閱讀。
https是一種安全的協(xié)議。怎么才算安全?
- 通信內(nèi)容加密
- 確認(rèn)通信雙方的身份
原理介紹:
? https采用對(duì)稱加密來加密通信的內(nèi)容,比如密鑰A,通信雙方都持有A就能用來加密解密。
? 提出問題:密鑰A如何傳輸?
? 密鑰肯定不能明文傳輸,這里就要用到RSA非對(duì)稱加密。RSA有一對(duì)鑰匙,一個(gè)是私鑰,一個(gè)是公鑰,私鑰自己保密,公鑰是可以公開的。用私鑰加密的數(shù)據(jù),只有對(duì)應(yīng)的公鑰才能解密,用公鑰加密的數(shù)據(jù), 只有對(duì)應(yīng)的私鑰才能解密。
? RSA的問題是效率慢,沒有對(duì)稱加密高效。解決的辦法是分兩步,(1) 我生成一個(gè)對(duì)稱加密算法的密鑰, 用RSA的方式安全發(fā)給你, (2) 我們隨后就不用RSA了, 只用這個(gè)密鑰,利用對(duì)稱加密算法來通信。
? RSA+對(duì)稱加密解決了通信內(nèi)容加密的問題,但是無法解決另一個(gè)問題,確認(rèn)通信雙方的身份。舉個(gè)例子,如果有個(gè)中間人,分別截取通信雙方的公鑰,再分別把自己的公鑰給雙方,那就gg了,因?yàn)槟闶盏降墓€,你怎么能確定這個(gè)公鑰就是對(duì)方的?
? 解決方案就是數(shù)字證書。
- ? 當(dāng)客戶端首次發(fā)送https請(qǐng)求時(shí),服務(wù)器會(huì)生成數(shù)字證書返回給客戶端。為了防止數(shù)字證書被篡改,會(huì)有特殊的證書生成步驟:
- 把服務(wù)器信息和非對(duì)稱的公鑰一起通過hash生成消息摘要,因?yàn)橹灰獌?nèi)容被篡改一點(diǎn)點(diǎn),消息摘要就會(huì)產(chǎn)生巨大變化
- 服務(wù)器用CA的私鑰對(duì)hash進(jìn)行加密,生成數(shù)字簽名。CA可以理解成第三方公信中心
- 把數(shù)字簽名和(服務(wù)器信息和非對(duì)稱的公鑰)組合在一起形成數(shù)字證書,發(fā)給客戶端
- 客戶端使用同樣的hash算法對(duì)(服務(wù)器信息和非對(duì)稱的公鑰)生成消息摘要
- 客戶端使用內(nèi)置的CA公鑰(例如瀏覽器內(nèi)置的)對(duì)數(shù)字簽名進(jìn)行解密出消息摘要
- 客戶端對(duì)比兩個(gè)消息摘要是否相同,相同,則說明非對(duì)稱公鑰是正確的
- 至此,客戶端獲得了正確的RSA公鑰,就可以把正確的對(duì)稱加密密鑰發(fā)給服務(wù)器。雙方就可以愉快加密通信了