丨如何保證數(shù)據(jù)傳輸?shù)陌踩耞第1頁(yè)
丨如何保證數(shù)據(jù)傳輸?shù)陌踩耞第2頁(yè)
丨如何保證數(shù)據(jù)傳輸?shù)陌踩耞第3頁(yè)
丨如何保證數(shù)據(jù)傳輸?shù)陌踩耞第4頁(yè)
丨如何保證數(shù)據(jù)傳輸?shù)陌踩耞第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

為了保障音頻數(shù)據(jù)的安全,WebRTC使用了一整套機(jī)制來(lái)進(jìn)行保護(hù),下面我們就來(lái)WebRTC是如何保障數(shù)據(jù)安全的吧我們來(lái)假設(shè)一個(gè)場(chǎng)景AB信,為了保障數(shù)據(jù)的安全,我們只需要在A發(fā)送數(shù)據(jù)前將要發(fā)送的數(shù)據(jù)進(jìn)行加密,B端收到數(shù)據(jù)之后再進(jìn)行就好了,這樣看起來(lái)保證數(shù)據(jù)的安全但這里有一個(gè)問(wèn)題,B端是如何知道A?另外,加密做了介紹,對(duì)于加密來(lái)說(shuō),使用非對(duì)稱(chēng)加密是最安全的,因此選擇非對(duì)稱(chēng)加密是必然的選擇。既然選擇非對(duì)稱(chēng)加密,那么A端與B端就要交換各自的公鑰,這樣當(dāng)A端使用私鑰加密時(shí),B端才能用A的公鑰進(jìn)行。同樣的道理,B端使用自己的私鑰進(jìn)行加密時(shí),A端可以使用B端的公鑰進(jìn)行。按照上面的描述,你會(huì)發(fā)現(xiàn)其邏輯上有個(gè)安全,即A與B交換公鑰時(shí),并沒(méi)有進(jìn)行任何防護(hù)。完全可以用各種在A與B交換公鑰時(shí)獲取到這些公鑰,這樣他們就可以輕而為了解決這個(gè)問(wèn)題,WebRTCDTL(Datagramtrcty,至于S的實(shí)現(xiàn)細(xì)節(jié),你暫時(shí)不用關(guān)心,后面我們會(huì)對(duì)它做詳細(xì)的講解。你現(xiàn)在只要知道通過(guò)DTLS協(xié)議就可以有效地解決A與B就好了。A與B交換公鑰時(shí)被竊取的問(wèn)題解決后,是不是雙方通信就安我們?cè)賮?lái)想像一個(gè)場(chǎng)景,還是A與B通信,但此時(shí)BB與B通信時(shí)冒充的B了A的重要信息。其實(shí)這種情況發(fā)生在會(huì)議系統(tǒng)或在線教育的小班課中,此時(shí)會(huì)議中有多人進(jìn)行互動(dòng),如果進(jìn)入了會(huì)議中,他只需聽(tīng)別人說(shuō)話,自己不發(fā)言,這樣就將關(guān)鍵的信息竊取走了。所以現(xiàn)在的問(wèn)題又來(lái)了,我們?cè)搶?duì)方的是否合法呢?以防止內(nèi)容被竄改。WebRTC也是使用的這種方式,它首先通過(guò)信令服務(wù)器交換SDP,SDP信息中包括了以下幾個(gè)重要信息:代碼a=ice-a=ice-a=fingerprint:sha- SDP完成后,AB獲取到了對(duì)方的ice-ufrag、ice-pwdfingerprint息,有了其中,ice-ufrag和ice-pwd是用戶名和。當(dāng)A與B建立連接時(shí),A要帶著它的用戶名和過(guò)來(lái),此時(shí)B端就可以通過(guò)驗(yàn)證A帶來(lái)的用戶名和與SDP中的用戶名和密碼是否一致的,來(lái)判斷A是否是一個(gè)合法用戶了。除此之外,fingerprint也是驗(yàn)證的關(guān)鍵一步,它是存放公鑰的(或叫信),在通過(guò)ice-ufrag和ice-pwd驗(yàn)證用戶的之余,還要對(duì)它發(fā)送的做驗(yàn)通過(guò)上面的描述你就可以知道WebRTC在數(shù)據(jù)安全方面做了非常多少努力了。下面的序列WebRTC安全序從這中你可以看到,A與B在傳輸數(shù)據(jù)之前,需要經(jīng)歷如下幾個(gè)步驟首先通過(guò)信令服務(wù)器交換SDP信息,也就是進(jìn)行協(xié)商。在SDP中記錄了用戶的用緊接著,A通過(guò)STUN協(xié)議(底層使用UDP協(xié)議)進(jìn)行認(rèn)證。如果STUN消息中的用戶名和與交換的SDP中的用戶名和一致,則說(shuō)明是合法用戶。確認(rèn)用戶為合法用戶后,則需要進(jìn)行DTLS協(xié)商,交換公鑰并協(xié)商相關(guān)的信息。同時(shí)還要通過(guò)fingerprint對(duì)進(jìn)行驗(yàn)證,確認(rèn)其沒(méi)有在傳輸中被竄改。以上就是WebRTC保證數(shù)據(jù)安全的整套機(jī)制。前面我們說(shuō)了WebRTC過(guò)使用DTLS、SRTP幾個(gè)協(xié)議的結(jié)合來(lái)達(dá)到數(shù)據(jù)安全的,DTLS說(shuō)到網(wǎng)絡(luò)上的數(shù)據(jù)安全你可能首先想到的是HTTPS,你也可以簡(jiǎn)單地將HTTPS理解為“HTTP協(xié)議+數(shù)據(jù)加密”,當(dāng)然實(shí)際上它要復(fù)雜得多。HTTPS的底層最初是使用SSL(SecureSocketsLayer,接層)協(xié)議對(duì)數(shù)據(jù)加密。當(dāng)SSL更新到3.0時(shí),IETF對(duì)SSL3.0進(jìn)行了標(biāo)準(zhǔn)化,并增加了一些新的功能,不過(guò)基本與SSL3.0沒(méi)什么區(qū)別,標(biāo)準(zhǔn)化后的SSL名為T(mén)LS1.0(TransportLayerSecurity,安全傳輸層協(xié)議),所以可以說(shuō)TLS1.0就是SSL的3.1版本。TLS協(xié)議由TLS記錄協(xié)議和TLS握手協(xié)議組成TLS記錄協(xié)議,用于數(shù)據(jù)的加密、數(shù)據(jù)完整性檢測(cè)等TLS握手協(xié)議,主要用于密鑰的交換與的確認(rèn)由于TLS底層是基于TCP協(xié)議的,而WebRTC音數(shù)據(jù)的傳輸主要基于UDP協(xié)議,因此WebRTC數(shù)據(jù)的保護(hù)無(wú)法直接TLS議。但TLS議在數(shù)據(jù)安全方面做得確實(shí)非常完善,所以人們就想到是否可以將TLS議移植到UDP議上此DTLS應(yīng)運(yùn)而所以你可以認(rèn)為DTLS就是運(yùn)行在UDP協(xié)議之上的簡(jiǎn)化版本的TLS,它使用的安全機(jī)制TLS幾乎一模一在DTLS協(xié)議中,最關(guān)鍵是的它的握手協(xié)議,正如下圖所展示DTLS握手協(xié)議示在WebRTC中為了更有效地保護(hù)音數(shù)據(jù),所以需要使用DTLS協(xié)議交換公鑰,并確認(rèn)使用的算法,這個(gè)過(guò)程在DTLS協(xié)議中稱(chēng)為握手協(xié)議。DTLS的握手過(guò)程如下首先DTLS議采用C/S進(jìn)行通信,其中發(fā)起請(qǐng)求的一端為客戶端,接收請(qǐng)求的為客戶端向服務(wù)端發(fā)送o消息,服務(wù)端收到請(qǐng)求后,回Server o消息,并將服務(wù)端確認(rèn)加密算法后,發(fā)送Finished消息,至此握手結(jié)束。DTLS握手結(jié)束之后,通信雙方就可以開(kāi)始相互發(fā)送音數(shù)據(jù)了OpenSSL講到數(shù)據(jù)安全就不得不提OpenSSL庫(kù),通過(guò)它的名字你也基本可以知道它是做什么的。OpenSSL一個(gè)開(kāi)源的SSL現(xiàn),正如我們上面說(shuō)到的,SSLTLS期的名字,實(shí)際上OpenSSL實(shí)現(xiàn)了整個(gè)TLS協(xié)議。不僅如此,OpenSSL實(shí)現(xiàn)了DTLS由于其代碼開(kāi)源,實(shí)現(xiàn)得又特別高效,所以現(xiàn)在大部分需要數(shù)據(jù)安全的應(yīng)用程序基本上都是使用OpenSSL來(lái)實(shí)現(xiàn)的。關(guān)于OpenSSL庫(kù),有以下幾個(gè)基本概念你一定要清SSL_CTX:SSL上下文,主要指明你要使用的SSL版本是多少SSL:代表一個(gè)SSL連接,你可以把它看作是一個(gè)句柄,一般還要與一個(gè)具體的進(jìn)行綁定SSL_Write:用于向SSL連接寫(xiě)數(shù)據(jù)SSL_Read:用于從SSL連接讀數(shù)據(jù)那OpenSSL到底該如何使用呢?其實(shí)整體還是蠻簡(jiǎn)單的,下面我們就來(lái)看一下如何使OpenSSL,具體步驟可闡述為如下第一步,初始化SSL。在這一步調(diào)用SSL_library_init()初始化OpenSSL然后加載OpenSSL支持的所有算法,以及相關(guān)的錯(cuò)誤信息。代碼OpenSSL_add_all_algorithms()/*載入Openssl所支持的算法SSL_load_error_strings()/*載入Openssl的相關(guān)錯(cuò)誤信息第二步,創(chuàng)建SSL上下文。在這一步可以指定使用的SSL協(xié)議是哪個(gè)版本的代碼SSL_CTX*ctx=第三步,加載。如下所示,該函數(shù)的第一個(gè)參數(shù)是SSL上下文,第二個(gè)參數(shù)是要加載代碼SSL_CTX_use__file(ctx,.crt,第四步,加載私鑰。在這一步可以先將私鑰加載進(jìn)來(lái),然后再檢測(cè)私鑰是否正代碼SSL_CTX_use_PrivateKey_file(ctx,prikey.pem, /*檢查私鑰是否正確第五步,建立SSL與Socket。在這一步,首先SSL下文創(chuàng)建SSL象;然后,將SSL對(duì)象與已經(jīng)創(chuàng)建好的socket進(jìn)行綁定;最后是建立SSL連接。代碼SSL*ssl=SSL_new(ctx)/*創(chuàng)建SSL用于通信SSL_set_fd(ssl,socket_fd)/*與socket綁定 /*建立SSL連接第六步,使用SSL進(jìn)行數(shù)據(jù)通信。主要通過(guò)SSL_write和SSL_read發(fā)送和接收數(shù)據(jù)代碼SSL_write(ssl,buf,strlen(buf))/*向ssl發(fā)數(shù)據(jù),消息通過(guò)SSL加密SSL_read(ssl,buf, /*從ssl接收消息第七步,釋放資源。當(dāng)SSL用完后,需要將占用的資源全部釋放掉,怎么實(shí)現(xiàn)呢?首先將SSL連接關(guān)掉,然后釋放SSL對(duì)象,最后釋放SSL上下文。代碼SSL_shutdown(ssl)/*關(guān)閉SSL連接SSL_ /*釋放SSLSSL_CTX_(ctx)/*釋放CTX以上這七步就是OpenSSL基本步驟。為了更好地理解和OpenSSL,你熟悉完SRTP/SRTCP在《06|WebRTC的RTPRTCP解》一文中我向你詳細(xì)介紹了RTP/RTCP議,通過(guò)該文你可以了解到,RTP/RTCP并沒(méi)有對(duì)它的負(fù)載數(shù)據(jù)進(jìn)行任何保護(hù)。因此,如果你通過(guò)抓包工具,如Wireshark,將音數(shù)據(jù)抓取到后,通過(guò)該工具就可以直接將音出來(lái),這是非常的事情在WebRTC中,為了防止這類(lèi)事情發(fā)生,沒(méi)有直接使用RTP/RTCP協(xié)議,而是使用SRTP/SRTCP議即安全的RTP/RTCP議WebRTC用了非常有名的libsrtp將原來(lái)的RTP/RTCP議數(shù)據(jù)轉(zhuǎn)換SRTP/SRTCP協(xié)議數(shù)據(jù)。libsrtp的使用非常簡(jiǎn)單,具體步驟可總結(jié)為如下第一步,初始化libsrtp代碼第二步,創(chuàng)建Session。創(chuàng)建Session略微復(fù)雜一些,這過(guò)程中需要指定創(chuàng)建的策略,代碼srtp__t3//Setallfieldstostd::memset(&,0,sizeof(srtp__t));//清空結(jié)構(gòu)6//指定用哪種算法進(jìn)行內(nèi)容的完整性switchcasesrtp_crypto__set_aes_cm_128_hmac_sha1_80(& casesrtp_crypto__set_aes_cm_128_hmac_sha1_32(&srtp_crypto__set_aes_cm_128_hmac_sha1_80(&.rtcp);//NOTE:Mustbe802022.ssrc.value=23 =key;//指定時(shí)的公25//RequiredforsendingRTPretransmissionwithout26.allow_repeat_tx= //使用RTX進(jìn)行RTP包重27 =1024;//窗口緩沖區(qū)大28 =//SettheSRTPsrtp_err_status_terr=srtp_create(&this->session,&第三步,對(duì)RTP包加密。如下面示例代碼所示代碼srtp_err_status_terr=srtp_protect(this-第一個(gè)參數(shù)是Session,第二個(gè)參數(shù)是要加密的數(shù)據(jù),第三個(gè)參數(shù)是被加密數(shù)據(jù)的長(zhǎng)度。需要注意的是,加密后的數(shù)據(jù)也存放在EncryptBuffer,即輸入數(shù)據(jù)與輸出數(shù)據(jù)共用同一塊內(nèi)容。第四步,對(duì)SRTP包。這同上面的第三步類(lèi)似,只不過(guò)操作相反,這里變成了srtp_err_status_terr=srtp_unprotect(this 代第五步,也就是最后一步,是釋放資源代碼以上這五步就是使用libsrtp對(duì)RTP數(shù)據(jù)加密/的基本步驟本文首先向你介紹了WebRTC為了保護(hù)音數(shù)據(jù)的安全性,提供的是怎樣一整套安全機(jī)制,然后又對(duì)這一套安全機(jī)制中的幾個(gè)重點(diǎn)概念做了詳細(xì)講解,如DTLS協(xié)議、OpenSSL庫(kù)的使用以及如何將RTP/RTCP數(shù)據(jù)轉(zhuǎn)成SRTP/SRTCP數(shù)據(jù)。在介紹DTLS議時(shí),我們重點(diǎn)講解了它是如何進(jìn)行握手操作的,這里你只需要了解DTLSOpenSSL庫(kù)實(shí)現(xiàn)的,你只需要調(diào)用它的API即可。然后,我們又詳細(xì)介紹了使用OpenSSL庫(kù)的基本步驟,一共分成七大步。但這里所講的七大步只是使用OpenSSL的一個(gè)基本步驟,對(duì)于OpenSSL的DTLS協(xié)議握手的API我這里并沒(méi)有進(jìn)行講解,但有了這個(gè)基礎(chǔ)我相信你自己一定可能自行學(xué)習(xí)OpenSSL的其他相關(guān)最后,我們還講解了libsrtp庫(kù)的使用,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論