在上網(wǎng)獲取信息的過程中饱岸,我們接觸最多的信息加密傳輸方式也莫過于 HTTPS 了。每當訪問一個站點徽千,瀏覽器的地址欄中出現(xiàn)綠色圖標時苫费,意味著該站點支持 HTTPS 信息傳輸方式。HTTPS 是我們常見的 HTTP 協(xié)議與某個加密協(xié)議的混合體双抽,也就是 HTTP+S百框。這個 S 可以是 TLS(安全傳輸層協(xié)議)、也可以是 SSL(安全套接層)牍汹,不過我更認可另一個抽象概括的說法铐维,HTTP+Security。
首先慎菲,HTTPS并不是這種加密技術(shù)的正式名稱嫁蛇,HTTPS代表的是“在TLS/SSL上實現(xiàn)的HTTP協(xié)議”,因此實現(xiàn)加密的其實是位于HTTP下面的TLS/SSL層露该。
我們看看TLS/SSL所實現(xiàn)的幾個主要機制:
1. 證書:通過第三方權(quán)威證書頒發(fā)機構(gòu)(如VeriSign)驗證和擔保網(wǎng)站的身份睬棚,防止他人偽造網(wǎng)站身份與不知情的用戶建立加密連接。
2. 密鑰交換:通過公鑰(非對稱)加密在網(wǎng)站服務(wù)器和用戶之間協(xié)商生成一個共同的會話密鑰。
3. 會話加密:通過機制(2)協(xié)商的會話密鑰抑党,用對稱加密算法對會話的內(nèi)容進行加密包警。
4. 消息校驗:通過消息校驗算法來防止加密信息在傳輸過程中被篡改。
通過上述機制底靠,用戶與網(wǎng)站之間的傳輸內(nèi)容受到了保護害晦,因此能夠獲得很高的安全性。不過苛骨,任何密碼學手段都不是絕對安全的篱瞎,上面幾個機制中其實都存在可能的風險:
1. 證書:如果有人偽造證書,瀏覽器會發(fā)出警告痒芝,提示用戶該網(wǎng)站的證書可能是偽造的,應(yīng)該停止訪問牵素,但如果你無視瀏覽器的警告严衬,你的會話信息就有可能被偽造者竊取。此外笆呆,如果第三方證書頒發(fā)機構(gòu)遭到攻擊请琳,攻擊者竊取了已頒發(fā)的證書密鑰,就可以偽造相應(yīng)的網(wǎng)站證書赠幕,完全騙過瀏覽器的安全機制俄精,這樣的例子的確曾經(jīng)發(fā)生過。
2. 密鑰交換:RSA榕堰,這是一種最普遍使用的公鑰加密算法竖慧,一般來說安全性很高。
3. 會話加密:AES-256(CBC Mode)逆屡,這是一種非常廣泛使用的加密算法圾旨,采用256位密鑰代表其安全性很高,如果采用128位密鑰(AES-128)則安全性就差一些魏蔗。
4. 消息校驗:SHA1砍的,這是一種散列算法,SHA1的安全性比MD5要好莺治,但如果采用SHA256則安全性會更好一些廓鞠。
上面很抽象是不是,我們用“傳紙條”這個人人小時候都做過的事來形象的說明一下谣旁。
HTTP
假設(shè)你現(xiàn)在正坐在教室里上課床佳,現(xiàn)在你非常想和走道旁的迷人的 TA 說一些話,一般這個時候你會用“傳紙條”的方式來交流蔓挖。而這個方式和 TCP/IP 協(xié)議基本的工作模式十分相像:
通過小動作引起對方注意夕土;
對方以多種可能的方式(注視、肢體語言等)回應(yīng)于你;
你確認對方感知到你后怨绣,將紙條傳給對方角溃;
對方閱讀紙條;
對方給予你閱讀后的反應(yīng)篮撑;
怎么樣减细,這個流程是不是很熟悉?
如果你要傳遞紙條的 TA 距離你很遠怎么辦赢笨?HTTP 協(xié)議就是指你在紙條上寫明你要傳給的 TA 是誰未蝌,或者 TA 的座位在哪,接著只需要途徑的同學拿到紙條后根據(jù)紙條上的指示依次將紙條傳過去就 OK 了茧妒。
這個時候問題來了:途徑的同學完全可以觀看并知道你在紙條上寫了什么萧吠。
這就是 HTTP 傳輸所面臨的問題之一:中間人攻擊,指消息傳遞的過程中桐筏,處在傳遞路徑上的攻擊者可以嗅探或者竊聽傳輸數(shù)據(jù)的內(nèi)容纸型。
HTTPS
HTTPS 針對這個問題,采用了“加密”的方式來解決梅忌。最著名原始的加密方法就是對稱加密算法了狰腌,就是雙方約定一個暗號,用什么字母替換什么字母之類的∧恋現(xiàn)在一般采用一種叫 AES(高級加密算法)的對稱算法琼腔。
對稱加密算法既指加密和解密需要使用的密鑰 key 是一樣的。
AES 在數(shù)學上保證了踱葛,只要你使用的 key 足夠長丹莲,破解幾乎是不可能的(除非光子計算機造出來了)
我們先假設(shè)在沒有密鑰 key 的情況下,密文是無法被破解的剖毯,然后再回到這個教室圾笨。你將用 AES 加密后的內(nèi)容噌噌噌地寫在了紙條上,正要傳出去的時候你突然想到逊谋,TA 沒有 key 怎么解密內(nèi)容呀擂达,或者說,應(yīng)該怎么把 key 給TA胶滋?
如果把 key 也寫在紙條上板鬓,那么中間人照樣可以破解竊聽紙條內(nèi)容。也許在現(xiàn)實環(huán)境中你有其他辦法可以把 key 通過某種安全的渠道送到 TA 的手里究恤,但是互聯(lián)網(wǎng)上的實現(xiàn)難度就比較大了俭令,畢竟不管怎樣,數(shù)據(jù)都要經(jīng)過那些路由部宿。
于是聰明的人類發(fā)明了另一種加密算法——非對稱加密算法抄腔。這種加密算法會生成兩個密鑰(key1 和 key2)瓢湃。凡是 key1 加密的數(shù)據(jù),key1 自身不能解密赫蛇,需要 key2 才能解密绵患;凡事 key2 加密的數(shù)據(jù),key2 自身不能解密悟耘,只有 key1 才能解密落蝙。
目前這種算法有很多中,最常用的是 RSA暂幼。其基于的數(shù)學原理是:
兩個大素數(shù)的乘積很容易算筏勒,但是用這個乘積去算出是哪兩個素數(shù)相乘就很復(fù)雜了。好在以目前的技術(shù)旺嬉,分解大數(shù)的素因確實比較困難管行,尤其是當這個大數(shù)足夠大的時候(通常使用2的10次方個二進制位那么大),就算是超級計算機邪媳,解密也需要非常長的時間病瞳。
現(xiàn)在就把這種非對稱加密的方法應(yīng)用在我們教室傳紙條的場景里。
你在寫紙條內(nèi)容之前先用 RSA 技術(shù)生成了一對密鑰 k1 和 k2悲酷。
你把 k1 用明文傳了出去,路經(jīng)也許有人會截取亲善,但是沒有用设易,k1 加密的數(shù)據(jù)需要 k2 才可以破解,而 k2 在你自己手中蛹头。
k1 傳到了目的人顿肺,目的人會去準備一個接下來準備用于對稱加密(AES)的傳輸密鑰 key,然后用收到的 k1 把 key 加密渣蜗,傳給你屠尊。
你用手上的 k2 解出 key 后,全教室只有你和你的目的人擁有這個對稱加密的 key耕拷,你們倆就可以盡情聊天不怕竊聽啦~
這里也許你會有問題讼昆,為什么不直接用非對稱加密來加密信息,而是加密 AES 的 key 呢骚烧?因為非對稱加密和解密的平均消耗時間比較長浸赫,為了節(jié)省時間提高效率,我們通常只是用它來交換密鑰赃绊,而非直接傳輸數(shù)據(jù)既峡。
然而使用非對稱加密真的可以防范中間人攻擊嗎?雖然看上去很安全碧查,但是實際上卻擋不住可惡的中間人攻擊运敢。
假設(shè)你是 A,你的目的地是 B,現(xiàn)在要途徑一個惡意同學M传惠。中間人的惡意之處在于它會偽裝成你的目標迄沫。
當你要和 B 完成第一次密鑰交換的時候,M 把紙條扣了下來涉枫,假裝自己是B并偽造了一個 key邢滑,然后用你發(fā)來的 k1 加密了 key 發(fā)還給你。
你以為你和 B 完成了密鑰交換愿汰,實際上你是和 M 完成了密鑰交換困后。
同事 M 和 B 完成一次密鑰交換,讓 B 以為和 A 你完成了密鑰交換衬廷。
現(xiàn)在整體的加密流程變成了A(加密鏈接1)->M(明文)->B(加密鏈接2)的情況了摇予,這時候 M 依然可以知道A和B傳輸?shù)娜肯ⅰ?/p>
這個時候就是體現(xiàn) HTTPS 和傳紙條的區(qū)別了。在教室里吗跋,你是和一位與你身份幾乎對等的的對象來通信侧戴;而在訪問網(wǎng)站時,對方往往是一個比較大(或者知名)的服務(wù)者跌宛,他們有充沛的資源酗宋,或許他們可以向你證明他們的合法性。
此時我們需要引入一個非常權(quán)威的第三方疆拘,一個專門用來認證網(wǎng)站合法性的組織蜕猫,可以叫做 CA(Certificate Authority)。各個網(wǎng)站服務(wù)商可以向 CA 申請證書哎迄,使得他們在建立安全連接時可以帶上 CA 的簽名回右。而 CA 得安全性是由操作系統(tǒng)或者瀏覽器來認證的。
你的 Windows漱挚、Mac翔烁、Linux、Chrome旨涝、Safari 等會在安裝的時候帶上一個他們認為安全的 CA 證書列表蹬屹,只有和你建立安全連接的網(wǎng)站帶有這些CA的簽名,操作系統(tǒng)和瀏覽器才會認為這個鏈接是安全的颊糜,否則就有可能遭到中間人攻擊哩治。
一旦某個 CA 頒發(fā)的證書被用于的非法途徑,那么這個 CA 之前頒發(fā)過的所有證書都將被視為不安全的衬鱼,這讓所有 CA 在頒發(fā)證書時都十分小心业筏,所以 CA 證書在通常情況下是值得信任的。
正如聲網(wǎng)agora.io Web SDK考慮數(shù)據(jù)安全問題鸟赫,限制了http訪問getUserMedia接口蒜胖,只能通過https方式訪問消别。所以會出現(xiàn)用http在Chrome瀏覽器(47以上版本)中訪問Agora服務(wù)失敗,我該怎么辦台谢?
Agora Web解決方案基于WebRTC技術(shù)建立瀏覽器間的音視頻通信寻狂,在WebRTC協(xié)議中,瀏覽器通過getUserMedia接口獲取視頻(通過攝像頭)和音頻(通過麥克風)數(shù)據(jù)朋沮,Google Chrome是支持WebRTC的主流瀏覽器之一蛇券,在v47及以上版本,考慮到數(shù)據(jù)安全問題樊拓,限制了http訪問getUserMedia接口纠亚,只能通過https方式訪問。除了chrome瀏覽器外筋夏,Opera瀏覽器在v34版本后也跟進了對http的限制蒂胞,F(xiàn)irefox暫時沒有此更新。但是考慮到https是WebRTC協(xié)議推薦的安全訪問方式条篷,建議客戶統(tǒng)一通過https來訪問Agora Web服務(wù)骗随,也能兼容各瀏覽器平臺。