景知識簡介
虛擬機的VNC是非常重要的功能,能夠不依賴于虛擬機操作系統(tǒng)的網(wǎng)絡進行遠程訪問與控制。當虛擬機操作系統(tǒng)出現(xiàn)故障或者網(wǎng)絡不通等情況時,往往需要通過VNC進行遠程連接修復。
noVNC是一個支持HTML5的VNC客戶端,主要作用就是與遠端的vnc server進行互通,從而實現(xiàn)對于遠端主機的控制。我們可以通過VNC客戶端或者支持HTML5的瀏覽器訪問遠端安裝了vnc server的服務器桌面從而進行控制。
而在使用vnc這種便捷的遠程訪問技術的過程中,敏感數(shù)據(jù)的安全保障一直是開發(fā)人員繞不開的一個話題。而使用密碼對用戶進行身份認證是保護數(shù)據(jù)安全的常用手段之一。同時,為了進一步提升安全性能,防止密碼被非授權(quán)用戶輕易獲取利用,我們通常會采取對明文密碼進行加密的方式,這樣既達到了數(shù)據(jù)安全性的要求,同時也可以避免明文密碼保存在服務器上,極大地提高了系統(tǒng)的安全性。讓用戶在使用時可以更加放心。
問題場景
在業(yè)務的開發(fā)測試過程中,很多同事使用noVNC后不會退出終端,總是用完了就直接關閉窗口。而使用nmap命令可以獲取節(jié)點的端口信息,這樣的話,如果非授權(quán)人員知道了宿主機的IP和端口,是完全可以登錄這臺虛擬機進行篡改、泄露信息等非法操作的。這對于存放有重要信息的虛擬機來說顯然是存在安全隱患的。
VNC密碼加解密流程分析
對VNC登錄密碼加解密流程參考如下:
1、用戶創(chuàng)建虛擬機時,需要配置vnc密碼;
2、用戶自定義密碼明文P;
3、使用公鑰對明文密碼P進行加密,輸出密文并存儲起來;
4、當用戶執(zhí)行vnc登錄等操作,需要身份驗證時,系統(tǒng)獲取密文;
5、使用私鑰對密文進行解密操作,得到明文;
6、對用戶輸入的密碼與解密得到的明文進行比較,如果一樣,則用戶通過身份驗證,可以進入vnc操作虛擬機。
WebSocket 是一個持久化的協(xié)議,通過第一次 HTTP Request 建立連接之后,再把通信協(xié)議升級成 websocket,保持連接狀態(tài),后續(xù)的數(shù)據(jù)交換不需要再重復請求。websocket 可以看成一種類似 TCP/IP 的 socke t技術,在 web 應用中實現(xiàn)、并獲得同 TCP/IP 通信一樣的雙向通信功能,因此客戶端既和服務器可以發(fā)送消息也可以接收消息,同時還支持多路復用的功能,由于它借用了 HTTP 協(xié)議的一些概念,所以被稱為 WebSocket。
webSocket API定義了web應用和服務器進行通信的公共接口,具體的構(gòu)造函數(shù)創(chuàng)建對象、對象的屬性、方法、事件及它的意義,在上一篇《HTML5(十一)——WebSocket 基礎教程》文章中已詳細介紹。
WebSocket 協(xié)議可分為兩部分:握手階段和數(shù)據(jù)通信階段。
WebSocket 為應用層協(xié)議,定義在 TCP/IP 協(xié)議棧之上,連接服務器的 url 是以 ws 或 wss 開頭的。ws 開頭的默認TCP端口為80,wss 開頭的默認端口為443。
ws(websocket)是不安全的,容易被竊聽,只要別人知道你的ip和端口號,任何人都可以去連接通訊。
wss(web socket secure)是websocket的加密版本。
2.1、建立連接
客戶端去與服務器建立 TCP 連接,客戶端生成 websocket 對象,然后使用 API 建立連接,代碼如下:
let ws=new WebSocket('ws://localhost:8888')
ws.onopen=function(){
console.log("連接")
}
2.2、握手階段
客戶端與服務器建立連接之后,客戶端發(fā)送握手請求,隨后服務器發(fā)送握手響應即完成握手階段。
客戶端握手請求如下:
'GET / HTTP/1.1',
'Host: localhost:8888',
'Connection: Upgrade',
'Pragma: no-cache',
'Cache-Control: no-cache',
'Upgrade: websocket',
'Origin: file://',
'Sec-WebSocket-Version: 13',
'Accept-Encoding: gzip, deflate, br',
'Accept-Language: zh-CN,zh;q=0.9',
'Sec-WebSocket-Key: In1aAp/ya9Lkv+tsUtXLXQ==',
'Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits',
服務器握手響應如下:
Status Code: 101 Switching Protocols
Connection: Upgrade
sec-websocket-Accept: HBMDBbZMiS59r3aAITpGtJ64Mfc=Upgrade: websocket
2.3、數(shù)據(jù)通訊
WebSocket 握手連接成功之后。可以使用 send 進行發(fā)送數(shù)據(jù),onmessage 接收數(shù)據(jù),如下發(fā)送“你好”:
let ws=new WebSocket('ws://localhost:8888')
ws.onopen=function(){
console.log("連接成功")
ws.send("你好")
}
ws.onmessage=function(res){
console.log('接收到的消息',res)
}
服務器打印接收到的數(shù)據(jù),如:<Buffer 81 86 af 87 53 b4 4b 3a f3 51 0a 3a>。
websocket 在發(fā)送數(shù)據(jù)時,被組織為一串數(shù)據(jù)幀,然后進行發(fā)送。傳送的幀包含兩部分:數(shù)據(jù)幀和控制幀。數(shù)據(jù)幀可以攜帶文本數(shù)據(jù)或者二進制數(shù)據(jù),控制幀包含關閉幀和 Ping/Pong 幀。
把接收到的buffer十六進制數(shù)據(jù)轉(zhuǎn)成二進制數(shù)據(jù),控制幀與上述各個類型幀進行對比解析其意義。
2.4、關閉連接
任何一端可以關閉連接。客戶端關閉連接如下:
ws.close()
然后發(fā)送關閉幀給對方,通常會帶有關閉連接的狀態(tài)碼,常見的狀態(tài)碼如下:
3.1、客戶端創(chuàng)建websocket對象,并建立連接之后發(fā)送數(shù)據(jù)。其中 ws 地址根據(jù)后臺服務端口對應。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
let ws=new WebSocket('ws://localhost:8888')
ws.onopen=function(){
console.log("連接")
ws.send("你好")
}
ws.onmessage=function(res){
console.log('res',res)
}
</script>
</body>
</html>
3.2、使用 node.js 創(chuàng)建一個 websocket 服務,如創(chuàng)建一個serve.js文件,代碼如下:
const http=require("http")
const net=require("net") //原生的websocket
const crypto=require('crypto') // 安全性校驗
let serve=net.createServer(sock=>{
//只握手一次
sock.once('data',(data)=>{
console.log("hand shake start") // 開始握手
let str=data.toString();
let lines=str.split('\r\n')
//舍棄第一行和最后兩行
lines=lines.slice(1,lines.length-2)
let headers={}
lines.forEach(line=>{
let [key,val]=line.split(': ')
headers[key.toLowerCase()]=val
})
if( headers['upgrade']!='websocket' ){
console.log("其他協(xié)議")
sock.end()
}else if(headers['sec-websocket-version']!=13){
console.log("版本不對")
sock.end()
}else{
let key=headers['sec-websocket-key']
let mask='258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
//sha1(key+mask) -> base64=>client
let hash=crypto.createHash('sha1')
hash.update(key+mask)
let key2=hash.digest('base64')
sock.write(`HTTP/1.1 101 Switching Protocols\r\nUpgrade:websocket\r\nConnection:Upgrade\r\nsec-websocket-Accept:${key2}\r\n\r\n` )
console.log("hand shake end") // 握手結(jié)束
//真正的數(shù)據(jù)
sock.on('data',res=>{
console.log("真正接收數(shù)據(jù)",res)
//數(shù)據(jù)解析
let FIN=res[0]&0x001;
let opcode=data[0]&0x0F0;
let msak=data[1]&0x001;
let payload=data[1]&0x0FE;
})
}
})
//斷開
sock.on('end',()=>{
console.log("連接已斷開")
})
})
serve.listen("8888")
使用命令 node serve.js 或node serve 啟動服務,服務啟動成功之后可以使用localhost:8888訪問服務。
啟動服務之后,訪問前邊創(chuàng)建的html文件訪問websocket服務。
互聯(lián)網(wǎng)歷史長河里,能夠留下大名的技術并不多,而Adobe Flash注定是其中一個。在被官方宣布在2020年壽終正寢之后,F(xiàn)lash這款曾經(jīng)最為普及的軟件也只能無奈離去。這款軟件叱咤互聯(lián)網(wǎng)超過20年,也曾經(jīng)被蘋果掌門人喬布斯痛罵,那么他的崛起和衰落是怎樣的經(jīng)歷呢?
如果把Flash的發(fā)展履歷做一個總結(jié)的,大致可分為四個階段,
第一階段,萌芽期,1995年到1999年,這段時間是Flash從一個插件發(fā)展到擁有大量粉絲的工具;
第二階段,發(fā)展期,1999年到2008年,這段時間Flash借助動畫的發(fā)展一舉蛻變成為互聯(lián)網(wǎng)中不可或缺的一部分;
第三階段,繁盛期,2008年到2011年,這段時間Flash涉足各個領域,達到了制高點;
第四階段,衰落期,2011年到2020年,在這段時間中,由于移動互聯(lián)網(wǎng)的興起和網(wǎng)絡世界的發(fā)展,F(xiàn)lash失去了存在的必然性,也逐步開始被遺棄,慶幸的在于,F(xiàn)lash的東家Adobe給出了他的最終死亡時間。
一代宗師的崛起
1995年,一款由簡單工具和時間線組成的軟件工具Future Splash Animator出現(xiàn),它作為交互制作軟件Director和Authorware的一個小型插件得到了應用,而當時正處于現(xiàn)代互聯(lián)網(wǎng)的萌芽時期,Windows系統(tǒng)剛剛從DOS系統(tǒng)手中奪權(quán)成功,而相應的,Windows系統(tǒng)配套軟件開發(fā)完善度不足,這就給了flash興起一個機會。
Macromedia Flash是Flash的乳名
1996年11月,美國Macromedia公司收購了Future Wave,并將這款軟件改名為Flash。這款軟件也真的像閃電一樣迅速得到了各方的認可。由于當時互聯(lián)網(wǎng)的限制性,HTML的功能限制性很大,而且很難達到人們預期的設計,因此,各種腳本語言開始發(fā)掘,網(wǎng)頁的設計多樣化需求增強,而程序設計需要flash這樣一種簡單、直觀、功能強大的動畫設計工具。
Macromedia Flash在推出后,先后在工具中加入了庫、影片剪輯,Javascript插件,透明度,獨立播放器,文本輸入框流媒體,MP3,智能剪輯和HTML文本格式等功能,讓flash player幾乎成為網(wǎng)絡的標準。尤其在1999年flash 4中嵌入的ActionScript函數(shù)調(diào)用功能,讓flash在交互應用中的便捷得到了網(wǎng)絡認可,從而發(fā)展為全球性方便易用的矢量工具、動畫工具、結(jié)合矢量位圖動畫的編程工具。
Flash的崛起與21世紀初的網(wǎng)絡狀況有密切關聯(lián),在當時,網(wǎng)絡速度遠沒有現(xiàn)如今光纖和高速寬帶的便捷,用戶網(wǎng)絡速度普遍在64K/128K/512K/1024K的情況下,稱霸互聯(lián)網(wǎng)的還是各種各樣的GIF圖片,而想要通過瀏覽器看視頻還需要下載各種各樣的播放器插件,這些插件普適性較差,這也給了flash機會。
Flash插件的大小僅有數(shù)百KB到幾MB大小,卻可以提供基于矢量的放大畫質(zhì)保真效果,支持流式播放,支持截取播放等各種播放方式。而且,flash是當時網(wǎng)絡上僅有的可以網(wǎng)絡在線流暢播放視頻的插件,因此其成為了當時時代最火爆的網(wǎng)絡插件。
二、網(wǎng)頁游戲助飛升空
2005年12月3日,Macromedia Flash 正式被被Adobe公司收購,Adobe Flash的名號打響的同時,也將這款軟件推向了最高峰。
2015年Flash改換門庭
Adobe Flash采用的是遮罩、補間動畫、逐幀動畫和以影片剪輯為主的原件混合后而形成的畫質(zhì),這種動畫中由于不同元素的搭配,形成了多種多樣的變化效果。同時,F(xiàn)lash以流式控制技術和矢量技術為基礎,制造的動畫小而逼真,精度較高,從而在網(wǎng)頁動畫行業(yè)領域中成為了頂梁柱。
而網(wǎng)頁動畫技術的成熟引發(fā)了另一個行業(yè)的震動,那就是游戲行業(yè)。游戲行業(yè)從來與動畫行業(yè)都是密不可分的,在flash崛起之前,因為畫質(zhì)和寬帶等問題的限制,網(wǎng)頁游戲一直都是以文字和簡單圖片為主體的。
Flash Player可以將工作成果輸出為exe格式文件,從而即便是在沒有安裝Flash播放器的電腦上也可以流暢的瀏覽Flash動畫。而且,在巔峰時期,Adobe宣稱全世界97%的網(wǎng)絡瀏覽器都內(nèi)置Flash播放器。有了動畫的支持,各類頁游開始大肆成長。
QQ農(nóng)場是典型的flash游戲
在Flash為基礎的頁游中,騰訊的qq農(nóng)場可謂個中翹楚。在當時,偷菜成為了網(wǎng)絡中最為流行的游戲之一,其火爆程度和話題性甚至能與現(xiàn)如今騰訊的另一款游戲《王者榮耀》相提并論。偷菜的成功便是得益于Flash技術的成熟,F(xiàn)lash擁有完善的IDE工具和活躍的社區(qū),兼容性強,編程語言簡單,綜合性能強大,直接成為引爆網(wǎng)頁游戲的關鍵。
三、成也蕭何敗也蕭何
軟件技術的發(fā)展普遍是存在上限的,F(xiàn)lash也不例外。Flash因動畫、游戲等崛起,也因其而衰落,由于Flash自身的限制性因素的存在,這款軟件逐步進入了消退的時期。
Flash以小而精著稱,這一點對于最初的發(fā)展年代十分重要。而隨著網(wǎng)絡情況的不斷改良,F(xiàn)lash技術也隨之進行的變革,例如增強了性能水準,強化語言能力,并且在企業(yè)開發(fā)和交互站點中進行了更多層次上的嘗試和推廣。
Flash Player 7提出了FLV格式視頻
Flash已經(jīng)發(fā)展的足夠迅速,而問題在于,環(huán)境也是變化的。從Flash player 7開始,視頻被單獨作為一種文件格式開始提取出來,這就是FLV格式的視頻。FLV這種視頻格式迅速引燃互聯(lián)網(wǎng),各種播放器和視頻網(wǎng)站如雨后春筍般迅速冒出;更重要的是,支持FLV格式的兩套代碼是開源的,各大網(wǎng)站間都在后臺運行視頻格式的轉(zhuǎn)化工具,而在前臺以Flash Player播放。這一技術在當時成為了主流,但是在網(wǎng)速不斷提升的時代,也事實上架空了Flash。
而另外一個戰(zhàn)場網(wǎng)頁游戲中,F(xiàn)lash的限制性也開始出現(xiàn)。一些Flash用戶發(fā)現(xiàn),在游戲的運行過程中,F(xiàn)lash游戲越玩越卡,這一點是因為Flash棄用了DirectX和OpenGL等底層圖形加速,在運算時編譯和解釋的速度都很難跟上,圖形處理速度成為了其最大瓶頸。
Flash動畫開始落后
Flash基于二維平面的開發(fā)環(huán)境而設計,三維效果雖然能達到但是會增加設計的復雜程度和實時計算量從而導致更為卡頓。Flash不能隨意訪問本地硬盤數(shù)據(jù),讀寫數(shù)據(jù)量都十分有限,采用的本地共享對象雖然能夠提供一些存儲能力,但是其無法大量存儲游戲進度與玩家信息,從而使得游戲體驗感差強人意。
這些原因的存在,決定了Flash只能打造簡單的小型游戲,大型頁游顯然不是他的菜。而就在Flash的原有疆域被壓縮時,一個更麻煩的情況來了,F(xiàn)lash的根基PC的網(wǎng)絡地位遭到了強有力的挑戰(zhàn),這就是移動互聯(lián)網(wǎng)的崛起。
四,決戰(zhàn)移動端的慘敗
Flash最火爆的時代里,手機的功能還只是簡單的收發(fā)短信、接打電話,即便上網(wǎng)也不過就是瀏覽一些圖片、音樂或者新聞。誰能想到,智能手機的異軍突起幾乎顛覆了整個互聯(lián)網(wǎng)的基礎,F(xiàn)lash所依賴的根基也被動搖。
Adobe Flash Platform進軍移動端的策略是由PC向移動設備滲透,通過Flash Player授權(quán)進行收費,然后在每臺移動設備中嵌入Flash Player,預收一美金,包括了諾基亞、安卓和蘋果都是這個規(guī)矩。問題在于,F(xiàn)lash本身就是一個完全封閉的系統(tǒng),以PC的滲透率來參考移動端顯然是個完全失敗的想法,而問題在于,當時的智能手機領頭羊諾基亞接受了這一條款,這讓Adobe堅定了這一策略。可是馬上喬布斯老爺子就不干了。
喬布斯:Flash你走吧我不想罵你
談及Flash的倒下,2010年喬布斯的炮轟可謂是一個轉(zhuǎn)折點。喬布斯的公開信中明確將iPhone、IPad、iPod Touch與Flash劃清了界限。盡管蘋果在PC領域與Flash的合作不少,可是喬布斯在移動端毅然封殺了Flash。因為蘋果也iPhone和iOS系統(tǒng)形成的也是封閉生態(tài),兩種完全封閉的生態(tài)碰撞很難相容。
蘋果的拒絕讓人們認清了Flash在移動端絕非不可替代,F(xiàn)lash本身就是為了PC時代而生的產(chǎn)物,一旦用于移動端將變得格格不入。Flash的問題是全方面的, 除了封閉問題外,移動端的生態(tài)體系完全與pc端不同,PC端盛行的Flash游戲和視頻在移動端既沒有需求也沒有必要,移動端新興的手機游戲完全可以擺脫Flash進行。
一山不容二封閉
Flash作為一種陳舊的技術,對性能消耗用于移動端時并不合適。而且從網(wǎng)絡安全重視度開始后,F(xiàn)lash的精簡變的漏洞百出,安全記錄常年倒數(shù)。而且在智能手機的觸摸屏中,F(xiàn)lash為鼠標而設計的很多功能并不適用,這給相關應用的開發(fā)造成了困難。
綜合來看,移動時代適用于低功耗、觸摸屏和開放網(wǎng)絡的技術,F(xiàn)lash已經(jīng)落后。而真正給予了Flash致命一擊的,還當屬HTML5技術的成熟。
HTML5:Flash的掘墓人
2012年,Adobe正式宣布放棄移動端僅有的支撐安卓系統(tǒng),而轉(zhuǎn)為支持HTML5,這意味著Flash在移動端戰(zhàn)場的潰敗,也意味著HTML5在一個戰(zhàn)場中徹底的擊潰了Flash。
HTML5之所以成功取代Flash,是因為其提供了新的框架和平臺,包括免插件音視頻、圖像動畫、本體存儲以及其他功能,這些功能使得應用標準化和開放化,貼切用戶的使用習慣,優(yōu)化用戶體驗。換言之,HTML5是一種新的技術,而Flash受到框架限制多年來缺乏變革和新意。
HTML5需要成為下一代傳奇
HTML5的兼容性極強。Flash需要插件支持,而且不支持跨平臺,應用環(huán)境窄。而HTML5搭建的站點和應用能夠兼容PC端與移動端、Windows與Linux、安卓與IOS。HTML5可以移植到不同的開放平臺及應用平臺中,與目前主流的編程語言HTML、CSS、DOM、JS等無縫結(jié)合,也得到了開發(fā)者的認可。
在性能方面,HTML5注重各種引擎的優(yōu)化,加載速度要比需要插件的Flash快許多。同時,因為各大瀏覽器注重javascript引擎的優(yōu)化,在代碼運行效率上足夠高,因而應用范圍寬廣,運行效果優(yōu)質(zhì)。
安全方面,F(xiàn)lash與HTML5無法相提并論。Adobe Flash的漏洞之多基本已經(jīng)是公認的,其中很大一部分可能導致嚴重后果,可致用戶遭遇木馬病毒的攻擊。HTML5可以將代碼全部加密,應用時只需解密就可以,提高了安全性能。從開發(fā)者培養(yǎng)角度來看,學習Flash成本要大些,而HTML5與原本熟悉的HTML語法相似度很高,無需花費太多時間研習。
基于這些問題的存在,HTML5在移動端徹底趕跑了Flash以后,在PC領域也基本完成了取代。在Adobe宣布了Flash的大限之后,這款超過20歲的軟件終于要迎來他生命的終點。從興起到衰落,F(xiàn)lash經(jīng)歷了PC時代的狂歡,也經(jīng)歷了移動時代的蛻變,這款軟件的離去是一代經(jīng)典的終結(jié),但也是開啟下一代經(jīng)典的鑰匙。
Flash,王熙鳳,終為聰明累
在最后,用《紅樓夢》中王熙鳳的曲子形容如今的Flash可謂十分貼切,
“枉費了、意懸懸半世心,
好一似、蕩悠悠三更夢。
忽喇喇似大廈傾,
昏慘慘似燈將盡。
呀!一場歡喜忽悲辛。
嘆人世,終難定!”
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。