HTTPS是如何做到『內(nèi)容加密』骂倘、『身份認(rèn)證』、『內(nèi)容完整性』的?
下面從原理角度看一下
HTTPS 原理介紹之內(nèi)容加密
一纽匙、加密算法簡介
1> 加密算法一般分為兩種: '對稱加密' 和 '非對稱加密'。
2> '對稱加密': 也叫'密鑰加密'拍谐,就是指加密和解密使用的是相同的密鑰烛缔。
3> '非對稱加密': 也叫'公鑰加密',就是指加密和解密使用的是不同的密鑰轩拨。
對稱加密特點
1> 對稱加密強度非常高践瓷,一般破解不了。
2> 但存在一個很大的問題就是'無法安全地生成和保管密鑰'亡蓉。
3> 假如客戶端和服務(wù)器之間每次會話都使用固定的晕翠、相同的密鑰加密和解密,肯定存在很大的安全隱患砍濒。
4> 如果有人從客戶端獲取到了對稱密鑰崖面,整個內(nèi)容就不存在安全性了元咙,而且管理海量的客戶端密鑰也是一件很復(fù)雜的事情。
非對稱加密特點
1> 非對稱加密主要用于密鑰交換(也叫密鑰協(xié)商)巫员,能夠很好地解決這個問題庶香。
2> 客戶端和服務(wù)器每次新建會話時都使用非對稱密鑰交換算法協(xié)商出對稱密鑰,使用這些對稱密鑰完成應(yīng)用數(shù)據(jù)的加解密和驗證简识,整個會話過程中的密鑰只在內(nèi)存中生成和保存赶掖,而且每個會話的對稱密鑰都不相同(除非會話復(fù)用),中間者無法竊取七扰。
3> 非對稱密鑰交換很安全奢赂,但同時也是 HTTPS 性能和速度嚴(yán)重降低的“罪魁禍?zhǔn)住薄O胍?HTTPS 為什么影響速度颈走,為什么消耗資源膳灶,就一定要理解非對稱密鑰交換的整個過程。
下面重點介紹一下非對稱密鑰交換的數(shù)學(xué)原理以及在 TLS 握手過程中的應(yīng)用立由。
二轧钓、 非對稱密鑰交換
簡介
1> 在非對稱密鑰交換算法出現(xiàn)以前,對稱加密一個很大的問題就是不知道如何安全生成和保管密鑰锐膜。
2> 非對稱密鑰交換過程主要就是為了解決這個問題毕箍,使得對稱密鑰的生成和使用更加安全。
3> 密鑰交換算法本身非常復(fù)雜道盏,密鑰交換過程涉及到隨機(jī)數(shù)生成而柑,模指數(shù)運算,空白補齊荷逞,加密媒咳,簽名等操作。
常見的密鑰交換算法有: RSA种远、ECDHE筏养、DH、DHE等算法,它們的特性如下:
RSA
1> 算法實現(xiàn)簡單弛槐,誕生與1977年速警,歷史悠久长豁,經(jīng)過了長時間的破解測試该园,安全性高弱匪。
2> 缺點就是需要比較大的素數(shù)(目前常用的是2048位)來保證安全強度,很消耗CPU運算資源。
3> RSA是目前'唯一一個'既能用于'密鑰交換'又能用于'證書簽名'的算法。
DH
Diffie-Hellman 密鑰交換算法,誕生事件比較早(1977年),但是1999年才公開先改,缺點是比較消耗CPU性能载碌。
Diffie-Hellman 表示的是兩位美國計算機(jī)學(xué)家: Whitfield Diffie 和 Martin Hellman步咪。
ECDHE
1> 使用橢圓曲線(ECC)的DH算法。
2> 優(yōu)點: 能用較小的素數(shù)(256位)實現(xiàn)RSA相同的安全等級。
3> 缺點: 算法實現(xiàn)復(fù)雜闰挡,用于密鑰交換的歷史不長夺脾,沒有經(jīng)過長時間的安全攻擊測試乙墙。
ECDH
不支持PFS腥刹,安全性低,同時無法實現(xiàn) false start
'PFS'(perfect forward secrecy)汉买,中文可叫做'完全前向保密'衔峰。
1> 要求一個密鑰只能訪問由它所保護(hù)的數(shù)據(jù);
2> 用來產(chǎn)生密鑰的元素一次一換蛙粘,不能再產(chǎn)生其它的密鑰垫卤;
3> 一個密鑰被破解,并不影響其他密鑰的安全性出牧。
TLS False Start 的功能
用來對 HTTPS 網(wǎng)站進(jìn)行加速的穴肘,它是通過 '減少' 客戶端和服務(wù)器之間的'通信往返RT(Round Trip)'來實現(xiàn)的。
DHE
不支持ECC舔痕。非常消耗CPU資源评抚。
建議優(yōu)先支持 RSA 和 ECDHE_RSA 密鑰交換算法。原因如下:
1> ECDHE 支持 ECC 加速伯复,計算速度更快慨代。支持 PFS,更加安全啸如。支持 false start侍匙,用戶訪問速度更快。
2> 目前還有至少 20% 以上的客戶端不支持 ECDHE叮雳,我們推薦使用 RSA 而不是 DH 或者 DHE想暗,因為 DH 系列算法非常消耗 CPU(相當(dāng)于要做兩次 RSA 計算)。
需要注意:
通常所說的 ECDHE 密鑰交換默認(rèn)都是指 ECDHE_RSA债鸡,使用 ECDHE 生成 DH 算法所需的公私鑰江滨,然后使用 RSA 算法進(jìn)行簽名铛纬,最后再計算得出對稱密鑰厌均。
非對稱加密相比對稱加密更加安全,但也存在兩個明顯缺點
1> CPU 計算資源消耗非常大告唆。一次完全 TLS 握手棺弊,密鑰交換時的非對稱解密計算量占整個握手過程的 90% 以上。而對稱加密的計算量只相當(dāng)于非對稱加密的 0.1%擒悬,如果應(yīng)用層數(shù)據(jù)也使用非對稱加解密模她,性能開銷太大,無法承受懂牧。
2> 非對稱加密算法對加密內(nèi)容的長度有限制侈净,不能超過公鑰長度尊勿。比如現(xiàn)在常用的公鑰長度是 2048 位,意味著待加密內(nèi)容不能超過 256 個字節(jié)畜侦。
3> 所以公鑰加密目前只能用來作'密鑰交換'或者'內(nèi)容簽名'元扔。
4> '不適合用來做應(yīng)用層傳輸內(nèi)容的加解密'。
5> 非對稱密鑰交換算法是整個 HTTPS 得以安全的基石旋膳,充分理解非對稱密鑰交換算法是理解 HTTPS 協(xié)議和功能的關(guān)鍵澎语。
2.1 RSA 密鑰協(xié)商
2.1.1 RSA 算法介紹
1. RSA 算法的安全性是建立在乘法不可逆或者大數(shù)因子很難分解的基礎(chǔ)上。
2. RSA 的推導(dǎo)和實現(xiàn)涉及到了'歐拉函數(shù)'和'費馬定理'及'模反元素'的概念验懊,有興趣可以自行百度擅羞。
3. RSA 算法是'統(tǒng)治世界'的最重要算法之一,而且從目前來看义图,RSA 也是 'HTTPS 體系中最重要的算法'减俏,沒有之一。
數(shù)學(xué)知識
1. 互質(zhì)關(guān)系
1> 如果兩個正整數(shù)歌溉,除了1之外垄懂,沒有其它公因子,我們就稱這兩個數(shù)是'互質(zhì)關(guān)系'痛垛。
2> 比如: 11 和 30 沒有除1之外的公因子草慧,所以它們就是互質(zhì)關(guān)系。這也說明匙头,不是質(zhì)數(shù)也可以構(gòu)成互質(zhì)關(guān)系漫谷。
3> 如果一個正整數(shù),它的因子除了1就是它本身蹂析,這個正整數(shù)就是'質(zhì)數(shù)'舔示。
2. 歐拉函數(shù):
1> 任意給定一個正整數(shù) n,請問在小于等于 n 的正整數(shù)之中电抚,有多少個數(shù)與 n 構(gòu)成'互質(zhì)'關(guān)系惕稻?
2> 計算這個值的方法就叫'歐拉函數(shù)',以 φ(n) 表示蝙叛。
3> 例如: φ(8) 俺祠,在1到8之中,與8構(gòu)成互質(zhì)關(guān)系的是1借帘、3蜘渣、5、7肺然,所以 φ(8) = 4.
3.
2.2 RSA 的密鑰生成步驟如下:
1. 隨機(jī)挑選兩個不相等的質(zhì)數(shù) p 和 q蔫缸,假設(shè) p = 13, q = 19。
(實際應(yīng)用中际起,這兩個質(zhì)數(shù)越大拾碌,就越難破解)
2. 計算 p 和 q 的乘積 n
1> n = p * q = 13 * 19 = 247;
2> n 的長度就是密鑰長度吐葱。 247對應(yīng)的二進(jìn)制是 11110111,一共8位校翔,所以這個密鑰就是8位唇撬。
3> 實際應(yīng)用中,RSA密鑰一般是1024位展融,重要場合則為2048位窖认。
3. 計算 n 的歐拉函數(shù) φ(n)。
1> φ(n) 表示與整數(shù) n 互質(zhì)數(shù)的個數(shù)告希。如果 n 等于兩個質(zhì)數(shù)的積扑浸,則φ(n) = (p-1)(q-1) 。
2> φ(247) = (13-1)(19-1) = 216燕偶。
4. 隨機(jī)選擇一個整數(shù)數(shù) e喝噪,滿足 1< e <φ(n) ,并且 e 與φ(n)互質(zhì)指么,假設(shè) e = 17酝惧。
(實際應(yīng)用中,常常選擇65537)
5. 計算 e 對于 φ(n) 的模反元素d
1> 所謂『模反元素』就是指有一個整數(shù)d伯诬,可以使得 ed 被 φ(n)除的余數(shù)為1晚唇。
2> ed = 1 (mod φ(n)) 等價于 ed - 1 = kφ(n)
3> 于是,找到模反元素d盗似,實質(zhì)上就是對下面這個二元一次方程求解:
ex + φ(n)y = 1
已知 e = 17, φ(n) = 216哩陕,則 17x + 216y = 1
這個方程可以用『擴(kuò)展歐幾里得算法』求解,此處省略具體過程赫舒『芳埃總之,可以算出一組整數(shù)解為(x, y) = (89, -7)接癌,即 d = 89心赶。
至此,所有計算完成缺猛。
6. 將 n 和 e 封裝成公鑰缨叫,n 和 d 封裝成私鑰。
本例中: n = 247, e = 17, d = 89枯夜,所以公鑰就是(247, 17), 私鑰就是(247, 89)弯汰。
實際應(yīng)用中艰山,公鑰和私鑰數(shù)據(jù)都采用 ASN.1(Abstract Syntax Notation One 抽象語法標(biāo)記) 格式表達(dá)湖雹。
2.3 RSA算法的可靠性
回顧上面的密鑰生成步驟,一共出現(xiàn)了6個數(shù)字:
p曙搬、q摔吏、n鸽嫂、φ(n)、e征讲、d
1. 這6個數(shù)字之中据某,公鑰用到了兩個(n和e),其余四個數(shù)字都是不公開的诗箍。
2. 最關(guān)鍵的是d癣籽,因為 n 和 d 組成了私鑰,一旦d泄露滤祖,就等于私鑰泄露筷狼。
有無可能在已知 n 和 e 的情況下,推導(dǎo)出 d?
1> ed ≡ 1 (mod φ(n))匠童。只有知道e和φ(n)埂材,才能算出d。
2> φ(n) = (p-1)(q-1)汤求。只有知道p和q俏险,才能算出φ(n)。
3> n = pq扬绪。只有將n因數(shù)分解竖独,才能算出p和q。
結(jié)論: 如果 n 可以被因數(shù)分解挤牛,d就是算出预鬓,也就意味著私鑰被破解。
4> 但是當(dāng) n 大到一定程度時(比如接近 2^2048)赊颠,即使現(xiàn)在最快的 CPU 也無法進(jìn)行這個因式分解格二,即無法知道 n 是由哪個數(shù) p 和 q 乘出來的。
大整數(shù)的因數(shù)分解竣蹦,是一件非常困難的事情顶猜。目前,除了暴力破解痘括,還沒有發(fā)現(xiàn)別的有效方法长窄。
5> 所以就算知道了公鑰,整個加解密過程還是非常安全的纲菌。
維基百科這樣寫:
"對極大整數(shù)做因數(shù)分解的難度決定了RSA算法的可靠性挠日。
換言之,對一極大整數(shù)做因數(shù)分解愈困難翰舌,RSA算法愈可靠嚣潜。
假如有人找到一種快速因數(shù)分解的算法,那么RSA的可靠性就會極度下降椅贱。但找到這樣的算法的可能性是非常小的懂算。
今天只有短的RSA密鑰才可能被暴力破解只冻。到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式计技。
只要密鑰長度足夠長喜德,用RSA加密的信息實際上是不能被解破的。"
舉例: 你沒法對下面這個整數(shù)進(jìn)行因數(shù)分解
12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413
等于
33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917
事實上垮媒,這大概是人類已經(jīng)分解的最大整數(shù)(232個十進(jìn)制位舍悯,768個二進(jìn)制位)。
比它更大的因數(shù)分解睡雇,還沒有被報道過贱呐,因此目前被破解的最長RSA密鑰就是768位。
2.4 加密和解密
有了公鑰和私鑰入桂,就可以進(jìn)行加密解密了奄薇。
2.4.1 加密要用公鑰(n, e)
假設(shè)客戶端要想服務(wù)器發(fā)送加密信息 m,它就要用服務(wù)器的公鑰(n, e)對 m 進(jìn)行加密抗愁。這里需要注意馁蒂,m必須是整數(shù)(字符串可以取ASCII或Unicode值),并且 m 必須小于 n蜘腌。
所謂『加密』沫屡,就是算出下式的c:
m^e ≡ c (mod n)
客戶端的公鑰是(247, 17),m值假設(shè)是 135撮珠,那么可以算出下面的等式:
135^17 = 200(mod 247)
于是 c 等于200沮脖,客戶端就把 200 發(fā)送給了服務(wù)器。
2.4.2 解密要用私鑰(n, d)
服務(wù)器拿到客戶端發(fā)來的 200 以后芯急,就用自己的私鑰(247, 89)進(jìn)行解密勺届。可以證明娶耍,下面的等式一定成立:
c^d = m (mod n)
也就是說免姿,c的d次方除以n的余數(shù)為m,那么榕酒,c等于200胚膊,私鑰是(247, 89),那么服務(wù)器算出
200^89 = 135 (mod 247)
因此想鹰,服務(wù)器知道了客戶端加密前的原文就是 135紊婉。
至此,"加密-解密"的整個過程全部完成辑舷。
可以看到喻犁,如果不知道 d,就沒有辦法從c求出m。要知道d就必須分解n株汉,這是極難做到的,所以RSA算法保證了通信安全歌殃。
那么乔妈,公鑰(n, e)只能加密小于n的整數(shù),如果要加密大于n的整數(shù)氓皱,怎么辦路召?
有兩種解決方法
1> 把長信息分割成若干短信息,每段分別加密
2> 先選擇一種對稱加密算法(比如DES)波材,用這種算法的密鑰加密信息股淡,再用RSA公鑰加密DES密鑰。
1> 實際應(yīng)用中, (n, e) 組成了'公鑰對'廷区,(n, d)組成了'私鑰對'唯灵,其中 n 和 d都是一個接近2048的大數(shù)。
即使現(xiàn)在性能很強的CPU隙轻,想要計算 m≡c^d mod(n)埠帕,也需要消耗比較大的計算資源和時間。
2> 公鑰對 (n, e) 一般都注冊到了證書里玖绿,任何人都能直接查看敛瓷,比如百度證書的公鑰對如下圖,
e 取值比較小的好處有兩個:
1. 由 c = m^e mod(n) 可知斑匪,e 較小呐籽,客戶端 CPU 計算消耗的資源較少。
2. 加大 server 端的破解難度蚀瘸。e 比較小狡蝶,私鑰對中的 d 必然會非常大。所以 d 的取值空間也就非常大贮勃,增加了破解難度牢酵。
2.5 TLS握手過程中的 RSA 密鑰協(xié)商
介紹玩 RSA的原理,那最終會話所需要的對稱密鑰是如何生成的呢衙猪?跟RSA有什么關(guān)系馍乙?
以 TLS1.2為例簡單描述以下,省略跟密鑰交換無關(guān)的握手消息垫释。過程如下:
1. 客戶端發(fā)送 client_hello, 包含一個隨機(jī)數(shù) random1丝格。
2. 服務(wù)器回復(fù) server_hello,包含一個隨機(jī)數(shù) random2棵譬,同時回復(fù) certificate显蝌,攜帶了證書公鑰P。
3. 客戶端收到random2之后,就能夠生成 premaster_secrect 以及 master_secrect曼尊。
其中酬诀,premaster_secrect 長度為48個字節(jié),前兩個字節(jié)是協(xié)議版本號骆撇,剩下的46個字節(jié)填充一個隨機(jī)數(shù)瞒御。結(jié)構(gòu)如下:
Struct {byte Version[2]; bute random[46];}
** master_secrect 的生成算法簡述如下
Master_key = PRF(premaster_secrect, "master secrect", 隨機(jī)數(shù)1+隨機(jī)數(shù)2)
其中,PRF是一個隨機(jī)函數(shù)神郊,定義如下:
PRF(secrect, label, seed) = P_MD5(S1, label + seed) XOR P_SHA-1(S2, label + seed)
而 master secrect 包含了6部分內(nèi)容肴裙,分別是用于校驗內(nèi)容一致性的密鑰,用于對稱內(nèi)容加解密的密鑰涌乳,
以及初始化向量(用于CBC模式)蜻懦,客戶端和服務(wù)器各一份,從上式可以看出夕晓,把premaster_key 賦值給 secrect宛乃,
master key 賦值給 label,客戶端和服務(wù)器的兩個隨機(jī)數(shù)做種子就能確定地求出一個 48位長的隨機(jī)數(shù)蒸辆。
4. 客戶端使用證書公鑰P將 premaster_secrect加密后發(fā)送給服務(wù)器烤惊。
5. 服務(wù)器使用私鑰解密得到 premaster_secrect,又由于服務(wù)端之前就接收了隨機(jī)數(shù)1吁朦,所以服務(wù)器根據(jù)相同的生成算法柒室,在相同的輸入?yún)?shù)下,求出了相同了 master secrect逗宜。
可以看出雄右,密鑰協(xié)商過程需要 2 個 RT(Route Trip),這也是 HTTPS 慢的一個重要原因纺讲。而 RSA 發(fā)揮的關(guān)鍵作用就是對 premaster_secrect 進(jìn)行了加密和解密擂仍。中間者不可能破解 RSA 算法,也就不可能知道 premaster_secrect熬甚,從而保證了密鑰協(xié)商過程的安全性逢渔。
三、對稱內(nèi)容加密
1> 非對稱密鑰交換過程結(jié)束之后就得出了本次會話需要使用的對稱密鑰乡括。
2> 對稱加密又分為兩種模式:流式加密和分組加密肃廓。
3> 流式加密現(xiàn)在常用的就是 RC4,不過 RC4 已經(jīng)不再安全诲泌,微軟也建議網(wǎng)站盡量不要使用 RC4 流式加密盲赊。
4> 一種新的替代 RC4 的流式加密算法叫 ChaCha20,它是 google 推出的速度更快敷扫,更安全的加密算法哀蘑。
目前已經(jīng)被 android 和 chrome 采用,也編譯進(jìn)了 google 的開源 openssl 分支 —boring ssl,并且nginx 1.7.4 也支持編譯 boringssl绘迁。
5> 分組加密以前常用的模式是 AES-CBC合溺,但是 CBC 已經(jīng)被證明容易遭受BEAST和LUCKY13 攻擊。
目前建議使用的分組加密模式是 AES-GCM缀台,不過它的缺點是計算量大棠赛,性能和電量消耗都比較高,不適用于移動電話和平板電腦将硝。