傳統(tǒng)的瀏覽器只允許HTTP接收或者發(fā)送消息,大量消耗了服務(wù)器帶寬和資源,且無法滿足實時性強的Web應(yīng)用?;诖?,HTML5中WebSocket協(xié)議通過建立一個持續(xù)的、全雙工的信道,來傳輸不帶元數(shù)據(jù)的信息,可以滿足某些Web應(yīng)用的實時要求。但WebSocket技術(shù)的發(fā)展的前提是必須有力的保障其安全性。
服務(wù)器推送的實現(xiàn)方式主要基于Ajax輪詢方式、基于Ajax的長輪詢方式、基于iframe的流方式。然而這些方式都存在浪費資源、占用帶寬等問題。Websocket協(xié)議是HTML5實現(xiàn)的瀏覽器與服務(wù)器雙向通信的新協(xié)議之一,能更好地節(jié)省服務(wù)器資源和帶寬,并達到實時通信。瀏覽器和服務(wù)器只需一個“握手”動作就能建立一條快速通道,進行數(shù)據(jù)的相互傳送。
握手動作的請求端主要代碼:

握手動作接收端主要代碼:

當(dāng)WebSocket連接建立之后,客戶端和服務(wù)器端通過“幀”來相互發(fā)送消息。下圖表示數(shù)據(jù)傳輸?shù)腤ebSocket幀格式:

其中參數(shù)具體意義如下表:

位名稱 所占位數(shù) 具體意義FIN 1 表示此幀是不是消息的最后幀RSV1,RSV2,RSV3 1 自定義協(xié)議位,必須是0 Opcode 4 定義載荷數(shù)據(jù)類型MASK 1 是否有掩碼位,值為1 Payload length如果值為0-125,則是有效載荷長度;如果值為126,接下來2字節(jié)的16位無符號整數(shù)為有效載荷長度;如果值為127,接下來8字節(jié)的64位無符號整數(shù)為有效載荷長度Masking-key 0或4 掩碼位7或者7+16或者7+64
WebSocket可能會遇到很多攻擊,比如說不法分子試圖復(fù)制、刪除和修改用戶數(shù)據(jù),在Web通信過程中,惡意竊取或攔截信息等。而WebSocket的安全特性可以緩解某些特性的攻擊。
在客戶端發(fā)起的WebSocket握手中,一般會有Origin字段,它主要用來標(biāo)識這個請求最初發(fā)起在哪里。如果瀏覽器不能確定源的位置,那么初始握手中Origin字段的值為空。Origin字段允許接收方拒絕不想處理或惡意的連接,并發(fā)送一個適當(dāng)?shù)腍TTP錯誤碼。用于保護WebSocket服務(wù)器不被未授權(quán)的腳本跨源使用WebSocket API,比如說源可以有效的緩解拒絕服務(wù)(DoS)攻擊。
在服務(wù)器發(fā)起的握手連接初始化期間,WebSocket服務(wù)器用Sec-WebSocket-Key,Sec-WebSocket-Accept兩個頭字段生成應(yīng)答信息,消除跨協(xié)議攻擊的可能性。WebSocket協(xié)議中包含了一個用于識別協(xié)議的全局唯一標(biāo)識符(Globally Unique Identifier,GUID),是258EAFA5-E914-47DA-95CA-C5AB0DC85B11。服務(wù)器首先讀取Sec-WebSocket-Key首標(biāo)值,基于以下的算法生成正確的應(yīng)答信息:
(1)服務(wù)器添加GUID值拼接字符串;
(2)服務(wù)器用SHA1散列轉(zhuǎn)換結(jié)果;
(3)服務(wù)器用Base64編碼轉(zhuǎn)換結(jié)果;
(4)服務(wù)器將結(jié)果做為Sec-WebSocket-Accept首標(biāo)的值返回。
基于以上算法,服務(wù)器端將生成的安全密鑰作為應(yīng)答信息發(fā)回給客戶端,由此建立雙方的WebSocket連接通道,進行數(shù)據(jù)傳輸。
除了客戶端和服務(wù)器端是WebSocket的攻擊對象之外,Web基礎(chǔ)設(shè)施的其他部分也可能是攻擊的對象,比如說代理服務(wù)器。代理服務(wù)器是介于客戶端和Web服務(wù)器之間的服務(wù)器?!肮粽摺比绻⒁粋€到WebSocket服務(wù)器的連接,模擬客戶端發(fā)送HTTP的UPGRADE請求,然后再發(fā)送數(shù)據(jù),服務(wù)器端返回一個響應(yīng)信息,若有代理服務(wù)器,響應(yīng)信息會首先存放在緩存中,以致緩存中毒?;诖祟惞?,WebSocket協(xié)議添加屏蔽及掩碼位,客戶端發(fā)送的每一幀都有新的掩碼,以保護數(shù)據(jù)在傳輸中的安全性。
WebSocket幀的第二個字節(jié)的第一位表示該幀是否進行了屏蔽,WebSocket協(xié)議默認(rèn)所有幀都要進行屏蔽再發(fā)送。如上節(jié)所示,掩碼位在擴展載荷數(shù)據(jù)的后四位字節(jié)。WebSocket服務(wù)器在處理接收到的載荷數(shù)據(jù)之前都要先用掩碼對屏蔽進行解除??捎靡韵潞瘮?shù)解除屏蔽:

var unmask function(mask_bytes.buffer){var payload = new Buffer(buffer.length);for(var i=0;i 解除屏蔽之后,服務(wù)器可以得到原始的幀數(shù)據(jù):二進制消息可以直接交付;文本消息將進行UTF-8解碼,并通過服務(wù)器API輸出字符串。 通信安全的中心內(nèi)容就是保證信息在信道內(nèi)的保密性、消息完整性和可認(rèn)證性。SSL/TLS用于在客戶端和服務(wù)器端之間建立安全通道,以保護在不安全的公眾網(wǎng)絡(luò)上交換的數(shù)據(jù)。與WebSo-cket從一個HTTP握手開始升級到WebSocket協(xié)議一樣,WebSo-cket安全握手從HTTPS握手開始。HTTPS和WSS協(xié)議非常類似,都是通過TCP連接的TLS基礎(chǔ)上運行的。與HTTP相同,WebSock et也通過使用證書來配置TLS加密。對于HTTPS,客戶端和服務(wù)器端在使用HTTP協(xié)議之前要先建立一個安全連接。類似的,對于WSS,客戶端和服務(wù)器端首先建立一個安全連接,然后進行HT TP握手,最后升級WebSocket協(xié)議。 實時通信技術(shù)是Web通信的重要應(yīng)用領(lǐng)域,正是WebSocket等相關(guān)技術(shù)的發(fā)展與應(yīng)用,使得Web瀏覽器的實時通信水平有了長足的發(fā)展進步。同時,安全性對于WebSocket能夠廣泛推廣有舉足輕重的地位。本文介紹了WebSocket協(xié)議的新規(guī)范,并詳細闡述了通信中可能遇到的安全威脅及其相關(guān)的安全特征。2.4 連接的保密性和完整性
3 結(jié)語