ws隧道加密
A. WebSocket SSL 加密淺析
WebSocket 是基於Http 協議的改進,Http 為無狀態協議,基於短連接,需要頻繁的發起請求,第二 Http 只能客戶端發起請求,服務端無法主動請求。
都是基於TCP的應用層協議。
都使用Request/Response模型進行連接的建立。
在連接的建立過程中對錯誤的處理方式相同,在這個階段WS可能返回和HTTP相同的返回碼。
都可以在網路中傳輸數據。
WS使用HTTP來建立連接,但是定義了一系列新的header域,這些域在HTTP中並不會使用。
WS的連接不能通過中間人來轉發,它必須是一個直接連接。
WS連接建立之後,通信雙方都可以在任何時刻向另一方發送數據。
WS連接建立之後,數據的傳輸使用幀來傳遞,不再需要Request消息。
WS的數據幀有序。
WebSocket 分為握手和數據傳輸
WebSocket 的握手基於http GET方法進行,
通過Http握手之後,如果是http 協議的話,tcp 連接會斷開,這里在http 頭部指明了升級為 websocket, 所以tcp 連接不斷開。 WebSocket在握手後發送數據並象下層TCP協議那樣由用戶自定義,還是需要遵循對應的應用協議規范。 WebSocket 數據傳輸以數據幀的形式傳輸。
數據幀的結構如下圖:
AndroidAsync 是一個基於nio的非同步socket ,http(客戶端伺服器端),websocket,socket.io庫,AndroidAsync 是一個底層的網路協議庫。AndroidAsync 適合用於一個未被封裝的Android的raw Socket, HTTP client/server, WebSocket, and Socket.IO。
特性
wss 建立在HTTPS 的基礎上,在握手的時候使用HTTS 建立連接。HTTPS是HTTP over SSL/TLS,HTTP是應用層協議,TCP是傳輸層協議,在應用層和傳輸層之間,增加了一個安全套接層SSL/TLS。
HTTPS 連接過程如下圖:
AndroidSync API
AndroidSync 對ssl 的支持如下:
ssl 連接需要證書,通常證書是CA機構發布,保證權威性。但是也可以使用自簽名證書。如12306.根據我們車機的特點,可以採用自簽名證書。
HTTPS ,是一種網路安全傳輸協議,利用 SSL/TLS 來對數據包進行加密,以提供對網路伺服器的身份認證,保護交換數據的隱私與完整性。 中間人攻擊, Man-in-the-middle attack ,縮寫: MITM ,是指攻擊者與通訊的兩端分別創建獨立的聯系,並交換其所收到的數據,使通訊的兩端認為他們正在通過一個私密的連接與對方直接對話,但事實上整個會話都被攻擊者完全控制。
https 在理論上是可以抵禦 MITM ,但是由於開發過程中的編碼不規范,導致 https 可能存在 MITM 攻擊風險,攻擊者可以解密、篡改 https 數據。 0X02 https 漏洞 Android https 的開發過程中常見的安全缺陷:
Android安全開發之安全使用HTTPS
竊聽風暴:Android平台https嗅探劫持漏洞
淺析HTTPS中間人攻擊與證書校驗
B. 華為WS550路由器怎麼更改加密方式
無線網路WiFi加密方式的設置方法:
1.打開電腦的wifi,搜索路由器默認wifi名(路由器背面銘牌有寫),連接wifi網路。
C. 華為WS318路由器怎麼設置埠轉發。
你好! 華為WS318路由器安裝設置的步驟如下:
1、首先,接好無線路由器之後需要檢查是否通電,無線路由器是否正常亮燈運行。
2、檢查無誤後,查看路由器底部標牌說明,打開瀏覽器輸入路由器IP,然後按ENTER進入,這個時候彈出一個對話框,需要輸入帳戶名和密碼,在路由器的後面會有的,一般情況下都是:帳戶名:admin 密碼:admin。
3、按照路由器背後的賬戶密碼輸入登錄後,就可以登陸到路由器的設置頁面了。
4、點擊頁面的設置向導,按照它的要求一步步進行。
5、點擊下一步,進入到賬號密碼設置,這個賬號密碼是當前網路上網的賬號密碼,如果不知道,可以咨詢網路運營商。
6、設置好上網的賬號密碼之後就是無線上網的功能設置了,設置WIFI名稱和WIFI密碼,建議密碼不要設置過於簡單,容易被人破解,並且加密方式採用系統推薦就可以。
7、點擊完成,重啟路由器,設置已經成功了。
D. 華為路由器ws318加密設置怎樣完成
1、打開瀏覽器,在地址欄輸入路由器網關IP地址,用戶名和密碼一般如果你沒改就是admin(
小寫)
2、登錄成功後就顯示運行狀態了,點擊「無線設置」
3、再點擊「無線安全設置」,無線網路名稱(SSID),就是一個名字,你可以隨便填,一般是字母+數字。
接下來就可以設置密碼了,一般選擇WPA-PSK/WPA2-PSK加密方法(密碼
要8-16個的,可以字母數字
組合)
4、設置密碼後,點擊保存,提示重啟
5、最後點擊「系統工具」里的「重啟路由器」即可重啟路由。
E. 如何使用WebSocket
引擎支持最新的WebSocket Version 13。
在C++中使用
詳細代碼可參考引擎目錄下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。
頭文件中的准備工作
首先需要include WebSocket的頭文件。
#include "network/WebSocket.h"
cocos2d::network::WebSocket::Delegate定義了使用WebScocket需要監聽的回調通知介面。使用WebSocket的類,需要public繼承這個Delegate。
class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate
並Override下面的4個介面:
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
後面我們再詳細介紹每個回調介面的含義。
新建WebSocket並初始化
WebSocket.org 提供了一個專門用來測試WebSocket的伺服器"ws://echo.websocket.org"。 測試代碼以鏈接這個伺服器為例,展示如何在Cocos2d-x中使用WebSocket。
新建一個WebSocket:
cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();
init第一個參數是delegate,設置為this,第二個參數是伺服器地址。 URL中的"ws://"標識是WebSocket協議,加密的WebSocket為"wss://".
_wsiSendText->init(*this, "ws://echo.websocket.org")
WebSocket消息監聽
在調用send發送消息之前,先來看下4個消息回調。
onOpen
init會觸發WebSocket鏈接伺服器,如果成功,WebSocket就會調用onOpen,告訴調用者,客戶端到伺服器的通訊鏈路已經成功建立,可以收發消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::WebSocket::Data對象存儲客戶端接收到的數據, isBinary屬性用來判斷數據是二進制還是文本,len說明數據長度,bytes指向數據。
void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data)
{
if (!data.isBinary)
{
_sendTextTimes++;
char times[100] = {0};
sprintf(times, "%d", _sendTextTimes);
std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;
log("%s", textStr.c_str());
_sendTextStatus->setString(textStr.c_str());
}
}
onClose
不管是伺服器主動還是被動關閉了WebSocket,客戶端將收到這個請求後,需要釋放WebSocket內存,並養成良好的習慣:置空指針。
void WebSocketTestLayer::onClose(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_wsiSendText = NULL;
}
CC_SAFE_DELETE(ws);
}
onError
客戶端發送的請求,如果發生錯誤,就會收到onError消息,游戲針對不同的錯誤碼,做出相應的處理。
void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error)
{
log("Error was fired, error code: %d", error);
if (ws == _wsiSendText)
{
char buf[100] = {0};
sprintf(buf, "an error was fired, code: %d", error);
_sendTextStatus->setString(buf);
}
}
send消息到伺服器
在init之後,我們就可以調用send介面,往伺服器發送數據請求。send有文本和二進制兩中模式。
發送文本
_wsiSendText->send("Hello WebSocket, I'm a text message.");
發送二進制數據(多了一個len參數)
_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));
主動關閉WebSocket
這是讓整個流程變得完整的關鍵步驟, 當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接。close會觸發onClose消息,而後onClose裡面,我們釋放內存。
_wsiSendText->close();
在Lua中使用
詳細代碼可參考引擎目錄下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。
創建WebSocket對象
腳本介面相對C++要簡單很多,沒有頭文件,創建WebSocket對象使用下面的一行代碼搞定。 參數是伺服器地址。
wsSendText = WebSocket:create("ws://echo.websocket.org")
定義並注冊消息回調函數
回調函數是普通的Lua function,4個消息回調和c++的用途一致,參考上面的說明。
local function wsSendTextOpen(strData)
sendTextStatus:setString("Send Text WS was opened.")
end
local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end
local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end
local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注冊不同於C++的繼承 & Override,有單獨的介面registerScriptHandler。 registerScriptHandler第一個參數是回調函數名,第二個參數是回調類型。 每一個WebSocket實例都需要綁定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
Lua中發送不區分文本或二進制模式,均使用下面的介面。
wsSendText:sendString("Hello WebSocket中文, I'm a text message.")
主動關閉WebSocket
當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接,以釋放伺服器和客戶端的資源。close會觸發cc.WEBSOCKET_CLOSE消息。
wsSendText:close()
在JSB中使用
詳細代碼可參考引擎目錄下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。
創建WebSocket對象
腳本介面相對C++要簡單很多,沒有頭文件,創建WebSocket對象使用下面的一行代碼搞定。 參數是伺服器地址。
this._wsiSendText = new WebSocket("ws://echo.websocket.org");
設置消息回調函數
JSB中的回調函數是WebSocket實例的屬性,使用匿名函數直接賦值給對應屬性。可以看出JS語言的特性,讓綁定回調函數更加優美。四個回調的含義,參考上面c++的描述。
this._wsiSendText.onopen = function(evt) {
self._sendTextStatus.setString("Send Text WS was opened.");
};
this._wsiSendText.onmessage = function(evt) {
self._sendTextTimes++;
var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes;
cc.log(textStr);
self._sendTextStatus.setString(textStr);
};
this._wsiSendText.onerror = function(evt) {
cc.log("sendText Error was fired");
};
this._wsiSendText.onclose = function(evt) {
cc.log("_wsiSendText websocket instance closed.");
self._wsiSendText = null;
};
send消息
發送文本,無需轉換,代碼如下:
this._wsiSendText.send("Hello WebSocket中文, I'm a text message.");
發送二進制,測試代碼中,使用_stringConvertToArray函數來轉換string為二進制數據,模擬二進制的發送。 new Uint16Array創建一個16位無符號整數值的類型化數組,內容將初始化為0。然後,循環讀取字元串的每一個字元的Unicode編碼,並存入Uint16Array,最終得到一個二進制對象。
_stringConvertToArray:function (strData) {
if (!strData)
returnnull;
var arrData = new Uint16Array(strData.length);
for (var i = 0; i < strData.length; i++) {
arrData[i] = strData.charCodeAt(i);
}
return arrData;
},
send二進制介面和send文本沒有區別,區別在於傳入的對象,JS內部自己知道對象是文本還是二進制數據,然後做不同的處理。
var buf = "Hello WebSocket中文,\0 I'm\0 a\0 binary\0 message\0.";
var binary = this._stringConvertToArray(buf);
this._wsiSendBinary.send(binary.buffer);
主動關閉WebSocket
當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接,以釋放伺服器和客戶端的資源。close會觸發onclose消息。
onExit: function() {
if (this._wsiSendText)
this._wsiSendText.close();
}