在上網(wǎng)獲取信息的過(guò)程中,我們接觸最多的信息加密傳輸方式也莫過(guò)于HTTPS了。每當(dāng)訪問(wèn)一個(gè)站點(diǎn),瀏覽器的地址欄中出現(xiàn)綠色圖標(biāo)時(shí),意味著該站點(diǎn)支持HTTPS信息傳輸方式。HTTPS是我們常見(jiàn)的HTTP協(xié)議與某個(gè)加密協(xié)議的混合體,也就是HTTP+S。這個(gè)S可以是TLS(安全傳輸層協(xié)議)、也可以是SSL(安全套接層),不過(guò)我更認(rèn)可另一個(gè)抽象概括的說(shuō)法,HTTP+Security。
首先,HTTPS并不是這種加密技術(shù)的正式名稱,HTTPS代表的是“在TLS/SSL上實(shí)現(xiàn)的HTTP協(xié)議”,因此實(shí)現(xiàn)加密的其實(shí)是位于HTTP下面的TLS/SSL層。
我們看看TLS/SSL所實(shí)現(xiàn)的幾個(gè)主要機(jī)制:
1.證書:通過(guò)第三方權(quán)威證書頒發(fā)機(jī)構(gòu)(如VeriSign)驗(yàn)證和擔(dān)保網(wǎng)站的身份,防止他人偽造網(wǎng)站身份與不知情的用戶建立加密連接。
2.密鑰交換:通過(guò)公鑰(非對(duì)稱)加密在網(wǎng)站服務(wù)器和用戶之間協(xié)商生成一個(gè)共同的會(huì)話密鑰。
3.會(huì)話加密:通過(guò)機(jī)制(2)協(xié)商的會(huì)話密鑰,用對(duì)稱加密算法對(duì)會(huì)話的內(nèi)容進(jìn)行加密。
4.消息校驗(yàn):通過(guò)消息校驗(yàn)算法來(lái)防止加密信息在傳輸過(guò)程中被篡改。
通過(guò)上述機(jī)制,用戶與網(wǎng)站之間的傳輸內(nèi)容受到了保護(hù),因此能夠獲得很高的安全性。不過(guò),任何密碼學(xué)手段都不是絕對(duì)安全的,上面幾個(gè)機(jī)制中其實(shí)都存在可能的風(fēng)險(xiǎn):
1.證書:如果有人偽造證書,瀏覽器會(huì)發(fā)出警告,提示用戶該網(wǎng)站的證書可能是偽造的,應(yīng)該停止訪問(wèn),但如果你無(wú)視瀏覽器的警告,你的會(huì)話信息就有可能被偽造者竊取。此外,如果第三方證書頒發(fā)機(jī)構(gòu)遭到攻擊,攻擊者竊取了已頒發(fā)的證書密鑰,就可以偽造相應(yīng)的網(wǎng)站證書,完全騙過(guò)瀏覽器的安全機(jī)制,這樣的例子的確曾經(jīng)發(fā)生過(guò)。
2.密鑰交換:RSA,這是一種最普遍使用的公鑰加密算法,一般來(lái)說(shuō)安全性很高。
3.會(huì)話加密:AES-256(CBCMode),這是一種非常廣泛使用的加密算法,采用256位密鑰代表其安全性很高,如果采用128位密鑰(AES-128)則安全性就差一些。
4.消息校驗(yàn):SHA1,這是一種散列算法,SHA1的安全性比MD5要好,但如果采用SHA256則安全性會(huì)更好一些。
上面很抽象是不是,我們用“傳紙條”這個(gè)人人小時(shí)候都做過(guò)的事來(lái)形象的說(shuō)明一下。

HTTP
假設(shè)你現(xiàn)在正坐在教室里上課,現(xiàn)在你非常想和走道旁的迷人的TA說(shuō)一些話,一般這個(gè)時(shí)候你會(huì)用“傳紙條”的方式來(lái)交流。而這個(gè)方式和TCP/IP協(xié)議基本的工作模式十分相像:
- 通過(guò)小動(dòng)作引起對(duì)方注意;
- 對(duì)方以多種可能的方式(注視、肢體語(yǔ)言等)回應(yīng)于你;
- 你確認(rèn)對(duì)方感知到你后,將紙條傳給對(duì)方;
- 對(duì)方閱讀紙條;
- 對(duì)方給予你閱讀后的反應(yīng);
怎么樣,這個(gè)流程是不是很熟悉?
如果你要傳遞紙條的TA距離你很遠(yuǎn)怎么辦?HTTP協(xié)議就是指你在紙條上寫明你要傳給的TA是誰(shuí),或者TA的座位在哪,接著只需要途徑的同學(xué)拿到紙條后根據(jù)紙條上的指示依次將紙條傳過(guò)去就OK了。
這個(gè)時(shí)候問(wèn)題來(lái)了:途徑的同學(xué)完全可以觀看并知道你在紙條上寫了什么。
這就是HTTP傳輸所面臨的問(wèn)題之一:中間人攻擊,指消息傳遞的過(guò)程中,處在傳遞路徑上的攻擊者可以嗅探或者竊聽(tīng)傳輸數(shù)據(jù)的內(nèi)容。
HTTPS
HTTPS針對(duì)這個(gè)問(wèn)題,采用了“加密”的方式來(lái)解決。最著名原始的加密方法就是對(duì)稱加密算法了,就是雙方約定一個(gè)暗號(hào),用什么字母替換什么字母之類的,F(xiàn)在一般采用一種叫AES(高級(jí)加密算法)的對(duì)稱算法。
對(duì)稱加密算法既指加密和解密需要使用的密鑰key是一樣的。
AES在數(shù)學(xué)上保證了,只要你使用的key足夠長(zhǎng),破解幾乎是不可能的(除非光子計(jì)算機(jī)造出來(lái)了)
我們先假設(shè)在沒(méi)有密鑰key的情況下,密文是無(wú)法被破解的,然后再回到這個(gè)教室。你將用AES加密后的內(nèi)容噌噌噌地寫在了紙條上,正要傳出去的時(shí)候你突然想到,TA沒(méi)有key怎么解密內(nèi)容呀,或者說(shuō),應(yīng)該怎么把key給TA?
如果把key也寫在紙條上,那么中間人照樣可以破解竊聽(tīng)紙條內(nèi)容。也許在現(xiàn)實(shí)環(huán)境中你有其他辦法可以把key通過(guò)某種安全的渠道送到TA的手里,但是互聯(lián)網(wǎng)上的實(shí)現(xiàn)難度就比較大了,畢竟不管怎樣,數(shù)據(jù)都要經(jīng)過(guò)那些路由。
于是聰明的人類發(fā)明了另一種加密算法——非對(duì)稱加密算法。這種加密算法會(huì)生成兩個(gè)密鑰(key1和key2)。凡是key1加密的數(shù)據(jù),key1自身不能解密,需要key2才能解密;凡事key2加密的數(shù)據(jù),key2自身不能解密,只有key1才能解密。
目前這種算法有很多中,最常用的是RSA。其基于的數(shù)學(xué)原理是:
兩個(gè)大素?cái)?shù)的乘積很容易算,但是用這個(gè)乘積去算出是哪兩個(gè)素?cái)?shù)相乘就很復(fù)雜了。好在以目前的技術(shù),分解大數(shù)的素因確實(shí)比較困難,尤其是當(dāng)這個(gè)大數(shù)足夠大的時(shí)候(通常使用2的10次方個(gè)二進(jìn)制位那么大),就算是超級(jí)計(jì)算機(jī),解密也需要非常長(zhǎng)的時(shí)間。
現(xiàn)在就把這種非對(duì)稱加密的方法應(yīng)用在我們教室傳紙條的場(chǎng)景里。
你在寫紙條內(nèi)容之前先用RSA技術(shù)生成了一對(duì)密鑰k1和k2.
你把k1用明文傳了出去,路經(jīng)也許有人會(huì)截取,但是沒(méi)有用,k1加密的數(shù)據(jù)需要k2才可以破解,而k2在你自己手中。
k1傳到了目的人,目的人會(huì)去準(zhǔn)備一個(gè)接下來(lái)準(zhǔn)備用于對(duì)稱加密(AES)的傳輸密鑰key,然后用收到的k1把key加密,傳給你。
你用手上的k2解出key后,全教室只有你和你的目的人擁有這個(gè)對(duì)稱加密的key,你們倆就可以盡情聊天不怕竊聽(tīng)啦~
這里也許你會(huì)有問(wèn)題,為什么不直接用非對(duì)稱加密來(lái)加密信息,而是加密AES的key呢?因?yàn)榉菍?duì)稱加密和解密的平均消耗時(shí)間比較長(zhǎng),為了節(jié)省時(shí)間提高效率,我們通常只是用它來(lái)交換密鑰,而非直接傳輸數(shù)據(jù)。
然而使用非對(duì)稱加密真的可以防范中間人攻擊嗎?雖然看上去很安全,但是實(shí)際上卻擋不住可惡的中間人攻擊。
假設(shè)你是A,你的目的地是B,現(xiàn)在要途徑一個(gè)惡意同學(xué)M。中間人的惡意之處在于它會(huì)偽裝成你的目標(biāo)。
當(dāng)你要和B完成第一次密鑰交換的時(shí)候,M把紙條扣了下來(lái),假裝自己是B并偽造了一個(gè)key,然后用你發(fā)來(lái)的k1加密了key發(fā)還給你。
你以為你和B完成了密鑰交換,實(shí)際上你是和M完成了密鑰交換。
同事M和B完成一次密鑰交換,讓B以為和A你完成了密鑰交換。
現(xiàn)在整體的加密流程變成了A(加密鏈接1)->M(明文)->B(加密鏈接2)的情況了,這時(shí)候M依然可以知道A和B傳輸?shù)娜肯ⅰ?/div>
這個(gè)時(shí)候就是體現(xiàn)HTTPS和傳紙條的區(qū)別了。在教室里,你是和一位與你身份幾乎對(duì)等的的對(duì)象來(lái)通信;而在訪問(wèn)網(wǎng)站時(shí),對(duì)方往往是一個(gè)比較大(或者知名)的服務(wù)者,他們有充沛的資源,或許他們可以向你證明他們的合法性。
此時(shí)我們需要引入一個(gè)非常權(quán)威的第三方,一個(gè)專門用來(lái)認(rèn)證網(wǎng)站合法性的組織,可以叫做CA(Certificate Authority)。各個(gè)網(wǎng)站服務(wù)商可以向CA申請(qǐng)證書,使得他們?cè)诮踩B接時(shí)可以帶上CA的簽名。而CA得安全性是由操作系統(tǒng)或者瀏覽器來(lái)認(rèn)證的。
你的Windows、Mac、Linux、Chrome、Safari等會(huì)在安裝的時(shí)候帶上一個(gè)他們認(rèn)為安全的CA證書列表,只有和你建立安全連接的網(wǎng)站帶有這些CA的簽名,操作系統(tǒng)和瀏覽器才會(huì)認(rèn)為這個(gè)鏈接是安全的,否則就有可能遭到中間人攻擊。
一旦某個(gè)CA頒發(fā)的證書被用于的非法途徑,那么這個(gè)CA之前頒發(fā)過(guò)的所有證書都將被視為不安全的,這讓所有CA在頒發(fā)證書時(shí)都十分小心,所以CA證書在通常情況下是值得信任的。
正如聲網(wǎng)Agora.ioWebSDK考慮數(shù)據(jù)安全問(wèn)題,限制了http訪問(wèn)get User Media接口,只能通過(guò)https方式訪問(wèn)。所以會(huì)出現(xiàn)用http在Chrome瀏覽器(47以上版本)中訪問(wèn)Agora服務(wù)失敗,我該怎么辦?
AgoraWeb解決方案基于WebRTC技術(shù)建立瀏覽器間的音視頻通信,在WebRTC協(xié)議中,瀏覽器通過(guò)getUserMedia接口獲取視頻(通過(guò)攝像頭)和音頻(通過(guò)麥克風(fēng))數(shù)據(jù),GoogleChrome是支持WebRTC的主流瀏覽器之一,在v47及以上版本,考慮到數(shù)據(jù)安全問(wèn)題,限制了http訪問(wèn)get User Media接口,只能通過(guò)https方式訪問(wèn)。除了chrome瀏覽器外,Opera瀏覽器在v34版本后也跟進(jìn)了對(duì)http的限制,F(xiàn)irefox暫時(shí)沒(méi)有此更新。但是考慮到https是WebRTC協(xié)議推薦的安全訪問(wèn)方式,建議客戶統(tǒng)一通過(guò)https來(lái)訪問(wèn)AgoraWeb服務(wù),也能兼容各瀏覽器平臺(tái)。
相關(guān)閱讀:
- ·從聲網(wǎng)Agora.io的實(shí)時(shí)云生意看中國(guó)SaaS2的未來(lái)2016-04-18 14:18:26
- ·技術(shù)創(chuàng)業(yè)者趙斌:幫助全球化App實(shí)現(xiàn)全球溝通2016-04-13 09:47:59
- ·聲網(wǎng)Agora:解決全球“移動(dòng)端到端”實(shí)時(shí)通信的挑戰(zhàn)2016-01-15 14:06:44
- ·在企業(yè)VoIP部署中的HTTPS傳真連接2014-03-24 09:57:11