轉(zhuǎn)自:“HTTPS”安全在哪里炸渡? - 技術(shù)分享 - Bugly - Powered by Bugly!
背景
最近基于興趣學(xué)學(xué)習(xí)了下 HTTPS 相關(guān)的知識(shí)谐丢,在此記錄下學(xué)習(xí)心得严沥。
在上網(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匿值。不過(guò)要談?wù)?HTTPS 為何安全,還得從 HTTP 為何不安全說(shuō)起赂摆。
假設(shè)你現(xiàn)在正坐在教室里上課,現(xiàn)在你非常想和走道旁的迷人的 TA 說(shuō)一些話钟些,一般這個(gè)時(shí)候你會(huì)用“傳紙條”的方式來(lái)交流烟号。而這個(gè)方式和 TCP/IP 協(xié)議基本的工作模式十分相像:
通過(guò)小動(dòng)作引起對(duì)方注意;
? ? ? ? ? ? ?1.對(duì)方以多種可能的方式(注視政恍、肢體語(yǔ)言等)回應(yīng)于你汪拥;
? ? ? ? ? ? ?2.你確認(rèn)對(duì)方感知到你后,將紙條傳給對(duì)方篙耗;
? ? ? ? ? ? ?3.對(duì)方閱讀紙條迫筑;
? ? ? ? ? ? ?4.對(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 針對(duì)這個(gè)問(wèn)題补君,采用了“加密”的方式來(lái)解決引几。最著名原始的加密方法就是對(duì)稱加密算法了,就是雙方約定一個(gè)暗號(hào)挽铁,用什么字母替換什么字母之類的∥拔Γ現(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ù)娜肯ⅰ?/p>
這個(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 證書在通常情況下是值得信任的犬性。
總結(jié)
使 HTTP 后面增加一個(gè)S(Security)的技術(shù)瞻离,正是 對(duì)稱加密 + 非對(duì)稱加密 + CA 認(rèn)證 這三種技術(shù)的混合體。當(dāng)然這個(gè)主要是 HTTPS 的基本原理乒裆,真正實(shí)際中的 HTTPS 的協(xié)議是比以上的描述更為復(fù)雜一些的套利,并且其中任何一步稍有閃失,整個(gè)流程都將不再安全鹤耍。
這也是為什么 HTTPS 協(xié)議從 SSL 1.0升級(jí)到 SSL 3.0肉迫,再被 TLS 1.0 現(xiàn)在被 TLS 1.3取代,其背后都是一個(gè)個(gè)細(xì)節(jié)上的優(yōu)化稿黄,以防有任何閃失喊衫。
TLS 協(xié)議相比 SSL 協(xié)議增加了傳輸層的安全保證。