在上一節(jié)中介紹了兩種加密方法
橫山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,橫山網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為橫山超過千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的橫山做網(wǎng)站的公司定做!
其中對稱加密性能高,但是有泄露密鑰的風險,而非對稱加密相反,加密性能較差,但是密鑰不易泄露,那么能不能把他們進行一下結(jié)合呢?
HTTPS經(jīng)由HTTP進行通信,但利用SSL/TLS來加密數(shù)據(jù)包,而SSL/TLS的加密方式就是采用了對稱加密與非對稱加密的結(jié)合。
SSL/TLS考慮到非對稱加密的性能較低,所以在初始協(xié)商對稱加密密鑰時,使用了非對稱加密,當對稱加密密鑰協(xié)商完成后,則后續(xù)所有的通訊,全部采用對稱加密進行通訊。
但是這種方式無法證明公開密鑰就是真實服務(wù)器的公開密鑰,假設(shè)與B服務(wù)器進行通信,怎么確認公開密鑰是B服務(wù)器的,后續(xù)在公開密鑰傳輸途中已經(jīng)被替換了,但是卻發(fā)現(xiàn)不了。
由于任何人都可以訪問服務(wù)器,所以不可能一一把公鑰告訴他們,那么能不能提供一個公鑰下載的地方讓客戶機訪問服務(wù)器時先下載公鑰,但是下載公鑰的地址也有可能是假的,不可取。
那么有沒有更好的方式,既能安全的獲取公鑰又能確保訪問的服務(wù)器是真實的?答案:由數(shù)字證書認證機構(gòu)頒發(fā)(CA)公開密鑰證書
數(shù)字證書認證機構(gòu)是客戶端和服務(wù)器端都可以信賴的第三方機構(gòu),VeriSign就是一家數(shù)字證書機構(gòu)。流程如下:
這里應(yīng)該有人好奇,證書簽發(fā)機構(gòu)的公鑰是怎么傳到客戶端的?瀏覽器在發(fā)布時,已經(jīng)包含了主流的認證的機構(gòu)的公開密鑰了,所以是不需要傳輸?shù)摹?/p>
上圖大致描述了 SSL/TLS 的握手過程,具體細節(jié)如下:
握手第一步是客戶端向服務(wù)端發(fā)送 Client Hello 消息,這個消息里包含了一個客戶端生成的隨機數(shù) Random1、客戶端支持的加密套件(Support Ciphers)和 SSL Version 等信息。通過 Wireshark 抓包,我們可以看到如下信息:
第二步是服務(wù)端向客戶端發(fā)送 Server Hello 消息,這個消息會從 Client Hello 傳過來的 Support Ciphers 里確定一份加密套件,這個套件決定了后續(xù)加密和生成摘要時具體使用哪些算法,另外還會生成一份隨機數(shù) Random2。注意,至此客戶端和服務(wù)端都擁有了兩個隨機數(shù)(Random1+ Random2),這兩個隨機數(shù)會在后續(xù)生成對稱秘鑰時用到。
這一步是服務(wù)端將自己的證書下發(fā)給客戶端,讓客戶端驗證自己的身份,客戶端驗證通過后取出證書中的公鑰。
Server Hello Done 通知客戶端 Server Hello 過程結(jié)束。
客戶端收到服務(wù)端傳來的證書后,先從 CA 驗證該證書的合法性,驗證通過后取出證書中的服務(wù)端公鑰,再生成一個隨機數(shù) Random3,再用服務(wù)端公鑰非對稱加密 Random3生成 PreMaster Key。
Client Key Exchange 就是將這個 key 傳給服務(wù)端,服務(wù)端再用自己的私鑰解出這個 PreMaster Key 得到客戶端生成的 Random3。至此,客戶端和服務(wù)端都擁有 Random1 + Random2 + Random3,兩邊再根據(jù)同樣的算法就可以生成一份秘鑰,握手結(jié)束后的應(yīng)用層數(shù)據(jù)都是使用這個秘鑰進行對稱加密。為什么要使用三個隨機數(shù)呢?這是因為 SSL/TLS 握手過程的數(shù)據(jù)都是明文傳輸?shù)?,并且多個隨機數(shù)種子來生成秘鑰不容易被暴力破解出來。客戶端將 PreMaster Key 傳給服務(wù)端的過程如下圖所示:
這一步是客戶端通知服務(wù)端后面再發(fā)送的消息都會使用前面協(xié)商出來的秘鑰加密了,是一條事件消息。
這一步對應(yīng)的是 Client Finish 消息,客戶端將前面的握手消息生成摘要再用協(xié)商好的秘鑰加密,這是客戶端發(fā)出的第一條加密消息。服務(wù)端接收后會用秘鑰解密,能解出來說明前面協(xié)商出來的秘鑰是一致的。
這一步是服務(wù)端通知客戶端后面再發(fā)送的消息都會使用加密,也是一條事件消息。
這一步對應(yīng)的是 Server Finish 消息,服務(wù)端也會將握手過程的消息生成摘要再用秘鑰加密,這是服務(wù)端發(fā)出的第一條加密消息??蛻舳私邮蘸髸妹罔€解密,能解出來說明協(xié)商的秘鑰是一致的。
應(yīng)用層協(xié)議通信即發(fā)送HTTP請求。