印刷 網(wǎng)站源碼營銷型網(wǎng)站建設(shè)
文章整理自羅劍鋒老師的 《透視 HTTP 協(xié)議》, 可配合《實用密碼學(xué)》一起食用
為什么要有HTTPS
由于HTTP明文的特點,整個傳輸過程完全透明,任何人都能夠在鏈路中截獲、修改或者偽造請求 / 響應(yīng)報文,數(shù)據(jù)不具有可信性。催生了HTTPS, 它通過SSL/TLS為HTTP增加了安全性。安全主要包括四個特性,機(jī)密性、完整性,身份認(rèn)證和不可否認(rèn)。
機(jī)密性(Secrecy/Confidentiality)是指對數(shù)據(jù)的“保密”,只能由可信的人訪問,對其他人是不可見的“秘密”。
完整性(Integrity,也叫一致性)是指數(shù)據(jù)在傳輸過程中沒有被竄改,不多也不少,“完完整整”地保持著原狀。
身份認(rèn)證(Authentication)是指確認(rèn)對方的真實身份,也就是“證明你真的是你”,保證消息只能發(fā)送給可信的人。如果通信時另一方是假冒的網(wǎng)站,那么數(shù)據(jù)再保密也沒有用,黑客完全可以使用冒充的身份“套”出各種信息,加密和沒加密一樣。
不可否認(rèn)(Non-repudiation/Undeniable),也叫不可抵賴,意思是不能否認(rèn)已經(jīng)發(fā)生過的行為,不能“說話不算數(shù)” “耍賴皮”。
安全性
1.機(jī)密性
1.1 對稱加密
指加密和解密時使用的密鑰都是同一個,是“對稱”的。只要保證了密鑰的安全,那整個通信過程就可以說具有了機(jī)密性。
TLS 里有非常多的對稱加密算法可供選擇,比如 RC4、DES、3DES、AES、ChaCha20 等,但前三種算法都被認(rèn)為是不安全的,通常都禁止使用,目前常用的只有 AES 和 ChaCha20。
1.2 非對稱加密
對稱加密看上去好像完美地實現(xiàn)了機(jī)密性,但其中有一個很大的問題:如何把密鑰安全地傳遞給對方,術(shù)語叫“密鑰交換”。因為在對稱加密算法中只要持有密鑰就可以解密。如果你和網(wǎng)站約定的密鑰在傳遞途中被黑客竊取,那他就可以在之后隨意解密收發(fā)的數(shù)據(jù),通信過程也就沒有機(jī)密性可言了。
非對稱加密有兩個密鑰,一個叫“公鑰”(public key),一個叫“私鑰”(private key)。兩個密鑰是不同的,“不對稱”,公鑰可以公開給任何人使用,而私鑰必須嚴(yán)格保密。
公鑰和私鑰有個特別的“單向”性,雖然都可以用來加密解密,但公鑰加密后只能用私鑰解密,反過來,私鑰加密后也只能用公鑰解密。
非對稱加密可以解決“密鑰交換”的問題。網(wǎng)站秘密保管私鑰,在網(wǎng)上任意分發(fā)公鑰,你想要登錄網(wǎng)站只要用公鑰加密就行了,密文只能由私鑰持有者才能解密。而黑客因為沒有私鑰,所以就無法破解密文。
1.3 混合加密
雖然非對稱加密沒有“密鑰交換”的問題,但因為它們都是基于復(fù)雜的數(shù)學(xué)難題,運(yùn)算速度很慢。TLS里面使用混合加密的方式。
在通信剛開始的時候使用非對稱算法,比如 RSA、ECDHE,首先解決密鑰交換的問題。
然后用隨機(jī)數(shù)產(chǎn)生對稱算法使用的“會話密鑰”(session key),再用公鑰加密。因為會話密鑰很短,通常只有 16 字節(jié)或 32 字節(jié),所以慢一點也無所謂。
對方拿到密文后用私鑰解密,取出會話密鑰。這樣,雙方就實現(xiàn)了對稱密鑰的安全交換,后續(xù)就不再使用非對稱加密,全都使用對稱加密。
2. 完整性
黑客雖然拿不到會話密鑰,無法破解密文,但可以通過竊聽收集到足夠多的密文,再嘗試著修改、重組后發(fā)給網(wǎng)站。因為沒有完整性保證,服務(wù)器只能“照單全收”,然后他就可以通過服務(wù)器的響應(yīng)獲取進(jìn)一步的線索,最終就會破解出明文。
另外,黑客也可以偽造身份發(fā)布公鑰。如果你拿到了假的公鑰,混合加密就完全失效了。你以為自己是在和“某寶”通信,實際上網(wǎng)線的另一端卻是黑客,銀行卡號、密碼等敏感信息就在“安全”的通信過程中被竊取了。
所以,在機(jī)密性的基礎(chǔ)上還必須加上完整性、身份認(rèn)證等特性,才能實現(xiàn)真正的安全。
2.1 摘要算法
實現(xiàn)完整性的手段主要是摘要算法(Digest Algorithm),也就是常說的散列函數(shù)、哈希函數(shù)(Hash Function)。摘要算法保證了“數(shù)字摘要”和原文是完全等價的。所以,我們只要在原文后附上它的摘要,就能夠保證數(shù)據(jù)的完整性。不過摘要算法不具有機(jī)密性,如果明文傳輸,那么黑客可以修改消息后把摘要也一起改了,網(wǎng)站還是鑒別不出完整性。
摘要算法實際上是把數(shù)據(jù)從一個“大空間”映射到了“小空間”,所以就存在**“碰撞”**的可能性,摘要算法必須讓這種可能性盡量地小。
常用的摘要算法 MD5(Message-Digest 5)、SHA-1安全強(qiáng)度較低,TLS 推薦使用的是 SHA-1 的后繼者:SHA-2。
3. 身份認(rèn)證和不可否認(rèn)
3.1 數(shù)字簽名
加密算法結(jié)合摘要算法,我們的通信過程可以說是比較安全了。但這里還有漏洞,就是通信的兩個端點。
就像一開始所說的,黑客可以偽裝成網(wǎng)站來竊取信息。而反過來,他也可以偽裝成你,向網(wǎng)站發(fā)送支付、轉(zhuǎn)賬等消息,網(wǎng)站沒有辦法確認(rèn)你的身份。
通過使用私鑰再加上摘要算法,就能夠?qū)崿F(xiàn)“數(shù)字簽名”,同時實現(xiàn)“身份認(rèn)證”和“不可否認(rèn)”。
數(shù)字簽名的原理其實很簡單,就是把公鑰私鑰的用法反過來,之前是公鑰加密、私鑰解密,現(xiàn)在是私鑰加密、公鑰解密。但又因為非對稱加密效率太低,所以私鑰只加密原文的摘要,這樣運(yùn)算量就小的多,而且得到的數(shù)字簽名也很小,方便保管和傳輸。
簽名和公鑰一樣完全公開,任何人都可以獲取。但這個簽名只有用私鑰對應(yīng)的公鑰才能解開,拿到摘要后,再比對原文驗證完整性,就可以像簽署文件一樣證明消息確實是你發(fā)的。
4. 證書體系的弱點
證書體系(PKI,Public Key Infrastructure)雖然是目前整個網(wǎng)絡(luò)世界的安全基礎(chǔ)設(shè)施,但絕對的安全是不存在的,它也有弱點,還是關(guān)鍵的“信任”二字。
如果 CA 失誤或者被欺騙,簽發(fā)了錯誤的證書,雖然證書是真的,可它代表的網(wǎng)站卻是假的。
還有一種更危險的情況,CA 被黑客攻陷,或者 CA 有惡意,因為它(即根證書)是信任的源頭,整個信任鏈里的所有證書也就都不可信了。
文章整理自羅劍鋒老師的 《透視 HTTP 協(xié)議》, 可配合《實用密碼學(xué)》一起食用