目錄
加密方法
HTTPS的握手過程
HTTPS攻擊手段
WebSoket原理
WebSocket建立連接配接
由于HTTP沒有加密機制,其傳輸的内容很容易洩漏,并且HTTP協定沒法确認通信方,也無法保證接收到的封包在傳輸過程中是否被篡改,是以HTTPS是在HTTP協定的基礎上提供了加密、認證和完整性保護的功能。HTTPS并非是應用層的一種新協定,隻是HTTP通信接口部分用SSL和TLS協定代替而已,通常HTTP直接和傳輸層的TCP協定通信,當使用了SSL後,HTTP先和SSL協定通信,SSL再和TCP協定通信。
加密方法
近代的加密方法中加密算法是公開的,而密鑰卻是保密的,加密和解密都需要用到密鑰,沒有密鑰就沒法對加密内容進行解密,通過這種方式得以保持加密方法的安全性。
加密和解密同用一個密鑰的方式稱為共享密鑰加密,也被稱為
對稱密鑰加密
。以共享密鑰方式的加密必須将密鑰也發給對方,在網絡上發送密鑰很容易被攻擊者擷取。并且伺服器如果對所有用戶端都使用同樣的共享密鑰,無異于沒有加密,是以HTTPS采用生成的
随機數
來作為共享加密算法的密鑰。
公開密鑰加密使用一對
非對稱的密鑰
,一把叫做私有密鑰,一把叫做公有密鑰,發送密文的一方使用對方的公開密鑰進行加密處理,對方收到被加密的資訊後,再使用自己的私有密鑰進行解密,這樣就不用擔心密鑰被攻擊者擷取。
HTTPS采用共享密鑰加密和公開密鑰加密兩者并用的混合加密機制,如果僅僅保證密鑰的安全性,使用公開密鑰加密的方式就可以實作了,但是公開密鑰加密方式比共享密鑰加密,其處理速度要慢。是以
HTTPS在交換密鑰環節采用公開密鑰加密方式,之後建立通信交換封包階段采用共享密鑰加密方式
。
公開密鑰加密方式也不能保證公開密鑰本身的真實性,比如,在與某台伺服器建立連接配接時,無法保證接收到的公開密鑰就是需要連接配接的那個伺服器的密鑰,這個時候可以采用數字證書認證機構和其相關機關頒發的公開密鑰證書。
因為,公開秘鑰加密方式也不能保證publicKey的真實性,是以,需要使用數字認證機構和相關頒發公開秘鑰證書的機構進行确認。
HTTPS的握手過程
- 首先,用戶端會發送一個https的請求,把自身支援的一系列密鑰算法元件(Cipher Suite)發送給伺服器。
- 伺服器接收到用戶端所有的Cipher後與自身支援的對比,如果不支援則連接配接斷開,反之則會從中選擇一種加密算法和HASH算法以證書的形式傳回給用戶端,證書中包含了加密公鑰,頒證機構,網站位址,失效日期等等。
用戶端收到伺服器端的響應後會做以下幾件事:
1:驗證證書的合法性,頒發證書的機構是否合法與是否過期,證書中包含的網站位址是否與正在通路的位址一緻等,證書驗證通過後,在浏覽器的位址欄會加上一把小鎖。
2:證書驗證通過後,生成随機密碼,用證書中的公鑰加密。
3:使用約定好的HASH計算握手消息,并使用生産的随機數對消息進行加密,最後将之前生成的所有消息發送給網站。
- 伺服器接收到用戶端傳來的密文,用自己的私鑰來解密取出随機數密碼,然後用随機數密碼解密浏覽器發送過來的握手消息,并驗證HASH是否是與浏覽器發來的一緻,然後使用密碼加密一段握手消息,發送給浏覽器。
- 用戶端用随機數解密并計算出握手消息的HASH,如果與伺服器端發來的HASH一緻,此時握手過程結束。
之後所有的通信資料将由之前浏覽器生成的随機密碼并利用對稱加密算法進行加密。因為這串密碼隻有用戶端和伺服器知道,所有即使中間請求被攔截也是沒法解密資料的,以此保證了通信的安全。
其中非對稱加密算法用于在握手消息過程中加密生成的随機數密碼,對稱加密算法用于對真正傳輸的資料進行加密,而HASH算法用于驗證資料的完整性,TLS握手過程中如果有任何錯誤,都會使加密連接配接斷開,進而阻止了隐私資訊的傳輸,由于HTTPS非常的安全,攻擊者無法從中找到下手的地方,于是更多的是采用了假證書的手法來欺騙用戶端,進而擷取明文的資訊。
HTTPS攻擊手段
浏覽器在對證書進行驗證時,以下幾種情況會導緻驗證失敗:
- SSL證書不是由受信任的CA機構頒發的
- 證書過期
- 通路的網站域名與證書綁定的域名不一緻
對HTTPS最常見的攻擊手段就是SSL證書欺騙或者叫SSL劫持,是一種典型的中間人攻擊,不過SSL劫持并非隻是用于攻擊目的,在一些特殊情況下利用SSL劫持可以更順暢的通路網絡。SSL劫持需要将攻擊者接入到浏覽器與目标網站之間,在傳輸資料的過程中,替換目标網站發給浏覽器的證書,之後解密傳輸的資料,中間人攻擊最好的環境是在區域網路中,因為區域網路中所有的計算機需要通過網關來接入網際網路,是以攻擊者隻需要實施一次中間人攻擊就可以順利的截獲所有計算機與網關之間傳輸的資料。一般SSL劫持,浏覽器會給出證書錯誤的提示,如果繼續通路,所有加密的資料都可以被攻擊者解密。
SSLStrip攻擊也需要将攻擊者設定為中間人,之後将HTTPS通路替換為HTTP傳回給浏覽器,由于HTTP協定傳輸的資料都是未加密的,進而截獲使用者通路的資料。對于登入賬号密碼等關鍵資訊,可以在發送之前用javaScript進行一次加密處理,這種方法對SSLScrip和SSL劫持都是有效的。
HTTPS也存在一些問題,那就是處理速度會變慢,一是由于存在HTTPS握手環節,導緻通信變慢,二是由于存在傳輸資訊加密處理,消耗CPU及記憶體資源,這對于高并發的伺服器而言,更是一種性能瓶頸,是以伺服器隻是對含有敏感資訊的資料進行加密。
WebSoket原理
HTTP協定的通信都是浏覽器發出一個請求,伺服器接收請求後進行處理并傳回結果,浏覽器再将接收到的資訊進行渲染,這種機制對于實時性要求高的應用場景顯得捉襟見肘,傳統請求-響應模式的web開發通常采用輪詢方案,就是浏覽器以一定時間間隔頻繁的向伺服器請求資料,來保持用戶端資料的實時更新,但是伺服器資料可能并沒有更新,會帶來很多無謂的請求,浪費帶寬,效率低下。
webSocket是HTML5下的一種新的協定,基于TCP傳輸協定,本身屬于應用層協定,并且複用了HTTP握手通道。它實作了浏覽器與伺服器的全雙工通信,能更好的節省伺服器資源和帶寬并達到實時通訊的目的,webSocket與HTTP長連接配接的差別:HTTP長連接配接在建立TCP連接配接後,在每個請求中任需要單獨發送請求頭,資料傳輸的效率低,并且伺服器不能主動給浏覽器推送資料。
WebSocket建立連接配接
webSocket借用HTTP的協定來完成握手,首先通過HTTP發起請求封包,封包如下:
GET / HTTP/1,1
Host: localhost:8080
Origin: http://127.0.0.1:3000
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-key:w4v7O6xFTi36lq3RNcgctw==
Sec-WebSocket-Protocol:chat, superchat
Sec-WebSocket-Version:13
在上面的HTTP請求頭中,Connection和Upgrade字段表示請求伺服器更新協定為webSocket,其中Sec-WebSocket-key的值是随機生成的Base64編碼的字元串,Sec-WebSocket-Protocol和Sec-WebSocket-Version字段指定子協定和版本。伺服器響應頭如下:
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=
狀态碼101表示協定切換,到此完成協定更新,後續的資料互動都按照新的協定來。Sec-WebSocket-Accept是根據請求字段Sec-WebSocket-key計算出來的,其計算過程為:
- 将Sec-WebSocket-Key跟258EAFA5-E914-47DA-95CA-C5AB0DC85B11字元串進行拼接,形成新的字元串w4v7O6xFTi36lq3RNcgctw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11;
- 通過sha1算法計算出結果,并轉換成base64字元串。
浏覽器會校驗Sec-WebSocket-Accept的值,如果成功,webSocket 的握手成功将開始接下來的資料傳輸。
webSocket傳輸資料的基本機關是幀,一般webScoket傳輸的一條消息會被切割成多個幀,資料幀有一個标志位FIN,FIN=1表示這是消息的最後一幀,接收端接收到幀資料後,如果該幀的FIN辨別為1,就會将已經接收到的資料幀組裝成一個完整的消息。