1、引言
平時(shí)開(kāi)發(fā)工作中,我們會(huì)經(jīng)常接觸加密、解密的技術(shù)。尤其在今天移動(dòng)互聯(lián)網(wǎng)時(shí)代,越來(lái)越多的用戶會(huì)將數(shù)據(jù)存儲(chǔ)在云端,或使用在線的服務(wù)處理信息。這些數(shù)據(jù)有些涉及用戶的隱私,有些涉及用戶的財(cái)產(chǎn),要是沒(méi)有一套的方案來(lái)解決用戶的數(shù)據(jù)安全問(wèn)題的話,這將是一個(gè)多么可怕的事兒。
作為開(kāi)發(fā)者,也會(huì)經(jīng)常遇到用戶對(duì)數(shù)據(jù)安全的需求,當(dāng)我們碰到了這些需求后如何解決,如何何種方式保證數(shù)據(jù)安全,哪種方式最有效,這些問(wèn)題經(jīng)常困惑著我們。52im社區(qū)本次著重整理了常見(jiàn)的通訊安全問(wèn)題和加解密算法知識(shí)與即時(shí)通訊/IM開(kāi)發(fā)同行們一起分享和學(xué)習(xí)。
2、通訊安全性威脅
一般的,我們?cè)诰W(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù),都可以認(rèn)為是存在這潛在的風(fēng)險(xiǎn)的。用一句話來(lái)概括就是:“任何在網(wǎng)絡(luò)中傳輸?shù)拿魑臄?shù)據(jù)都存在安全性威脅。”
下面就列舉下我們通信中面臨的四種威脅:
1)中斷:攻擊者有意破壞和切斷他人在網(wǎng)絡(luò)上的通信,這是對(duì)可用性的攻擊;
2)截獲:屬于被動(dòng)攻ji,攻擊者從網(wǎng)絡(luò)上qie聽(tīng)他人的通信內(nèi)容,破壞信息的機(jī)密性;
3)篡改:攻擊者故意篡改網(wǎng)絡(luò)上傳送的報(bào)文,這是對(duì)完整性的攻擊;
4)偽造:攻擊者偽造信息在網(wǎng)絡(luò)傳送,這是對(duì)真實(shí)性的攻擊。

我們經(jīng)常說(shuō)加密解密算法是數(shù)據(jù)安全領(lǐng)域里的“劍”,是一種主動(dòng)的防護(hù),對(duì)數(shù)據(jù)進(jìn)行必要的加密處理,以保證其在數(shù)據(jù)傳輸、存儲(chǔ)中的安全。接下來(lái)講著重講解加解密算法知識(shí)。
3、Base64算法介紹
3.1 原理
嚴(yán)謹(jǐn)?shù)恼f(shuō),base64并不是加密算法,這里提到他是因?yàn)樗膶?shí)現(xiàn)比較簡(jiǎn)單,通過(guò)他的實(shí)現(xiàn),我們可以更好的理解加密解密的過(guò)程。
下面看下他是如何“加密”的。假設(shè)我們要對(duì)“BC”字符串進(jìn)行加密。現(xiàn)將其轉(zhuǎn)換為二進(jìn)制表達(dá)方式,并連起來(lái):01000010 01000011,接下來(lái)對(duì)二進(jìn)制按6位分組,不夠6位補(bǔ)0,得到010000、100100、001100(最后兩位補(bǔ)0)。下面查表,找到對(duì)應(yīng)的值“QKM”。那么“QKM”就是“BC”用base64“加密”后的值了。

從上面的base64算法,我們可以窺視部分加密的本質(zhì):將一段有意義的信息,通過(guò)某種方式,映射為一段看不懂的信息。
使用函數(shù)表達(dá)即為:
1public?Ciphertext encrypted(Plaintext text);
值得注意的是:base64里有一張映射表,如果改變映射表的順序,最終得到的結(jié)果就會(huì)跟著改變。有點(diǎn)類似烹調(diào),在相同原料、相同烹調(diào)方式下,我們改變加入的調(diào)料,最終做出的東西將會(huì)也不一樣。這里的映射表,我們叫之為“密鑰”。
3.2 小結(jié)
通過(guò)base64算法可以看出,一個(gè)加密算法會(huì)有兩部分組成:
1)密鑰;
2)算法。
兩者不能都公開(kāi),都公開(kāi)的話,就可以被人逆向運(yùn)算,進(jìn)行解密。
一般的:我們將密鑰進(jìn)行保密,將算法進(jìn)行公開(kāi)。算法的公開(kāi),有利于算法的推廣,普及,更有利于尋找算法中的漏洞。也就是因?yàn)閎ase64同時(shí)公開(kāi)了算法、密鑰,所以我們說(shuō)他并不是真正的加密算法。當(dāng)然如果你調(diào)整了上面映射表,那么也能做到加密算法的目的,不過(guò)base64加密的強(qiáng)度比較差,所以不建議在實(shí)際應(yīng)用中作為加密算法使用。
4、摘要算法介紹
4.1 基本
我們?cè)谄綍r(shí)的工作中經(jīng)常聽(tīng)到MD5算法。比如在一些下載頁(yè)面里會(huì)給出一個(gè)md5的作為文件驗(yàn)證串,在迅雷下載中作為文件的唯一標(biāo)識(shí)。
這類算法嚴(yán)格上來(lái)說(shuō)也不是加密算法,是一種叫做摘要算法的算法,不過(guò)在平時(shí)的使用中,我們經(jīng)常將摘要算法混合使用,所以在廣義上來(lái)說(shuō)也可以將他叫為加密算法。
4.2 摘要長(zhǎng)度
摘要算法的特點(diǎn)是可以將任意長(zhǎng)度的字符串,給轉(zhuǎn)換為定長(zhǎng)的字符串。
可以意料的是,在這個(gè)轉(zhuǎn)換過(guò)程中,一定是一共單向的過(guò)程。打個(gè)比方,我們將一個(gè)256長(zhǎng)度的字符串轉(zhuǎn)換為128長(zhǎng)度的字符串,轉(zhuǎn)換前有N^256種可能,轉(zhuǎn)換后有N^128種可能,這一定不可能是1對(duì)1的對(duì)應(yīng)關(guān)系。
所以我們只要保證摘要串(轉(zhuǎn)換后的串)位數(shù)只夠的長(zhǎng),使得“給定一個(gè)字符串A,經(jīng)過(guò)摘要算法處理后的串B,很難找到一個(gè)字符串C,其摘要后的串和串B相同” 即可。所以目前主流的摘要算法MD/SHA的摘要串長(zhǎng)度都在128位以上。而正是出于這個(gè)原因,美國(guó)還對(duì)長(zhǎng)摘要串的加密算法進(jìn)行了出口的限制。
4.3 通訊模型
摘要算法在平時(shí)的使用中,經(jīng)常以如下的形式進(jìn)行:
假設(shè)客戶端需要傳輸一段信息data給服務(wù)器端,為了data在網(wǎng)絡(luò)中數(shù)據(jù)的完整性,或者說(shuō)防止信息data被惡意的用戶篡改,可以始終這種安全通信模型:客戶端與服務(wù)器端實(shí)現(xiàn)確定了加密密鑰key,一段任意的字符串,客戶端將key與數(shù)據(jù)data拼接在一起,進(jìn)行摘要得到摘要串C,將data、C傳給服務(wù)器端,服務(wù)器端得到data和C后,同樣使用與客戶端相同的方法,計(jì)算摘要串S,如果S等于C的話,就說(shuō)明A在傳輸中,沒(méi)有被人篡改。
流程如下圖:

對(duì)于我們?cè)谕ㄐ诺拿媾R的四種威脅,摘要算法是否能防范呢:
1)截獲:由于網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)依然的明文的,對(duì)于攻擊者來(lái)說(shuō)暴露無(wú)遺,所以摘要算法對(duì)于這種威脅,沒(méi)什么辦法。
2)中斷:摘要算法,是對(duì)數(shù)據(jù)的驗(yàn)證,對(duì)整個(gè)網(wǎng)絡(luò)的可用性方面的攻擊,無(wú)法防范。
3)篡改:客戶端發(fā)出的數(shù)據(jù),中途被攻擊者進(jìn)行了修改,由于攻擊者并不知道密鑰key,將無(wú)法生成正確的摘要串。所以,摘要算法可以防范篡改威脅。
4)偽造:攻擊者偽造成客戶端,給服務(wù)器端發(fā)數(shù)據(jù),但由于拿不到密鑰key,偽造不出摘要串。所以,在這種情況下,摘要算法是有一定的防范作用的。但是,在偽造威脅中,還有一種是重放攻擊,攻擊者事先將客戶端發(fā)給服務(wù)器端的包截下來(lái),然后重復(fù)發(fā)送。例如:客戶端發(fā)給服務(wù)器端密碼時(shí),被攻擊者記錄了下來(lái),當(dāng)下次,服務(wù)器端再向客戶端詢問(wèn)密碼時(shí),攻擊者只需將記錄下來(lái)的包發(fā)給服務(wù)器端即可。所以摘要算法對(duì)于偽造威脅的防范是不徹底的,其只可以辨別偽造的內(nèi)容,不能辨別偽造的發(fā)送方。

常見(jiàn)的摘要算法有MD5/MD4/SHA-1/SHA-2等,其摘要串長(zhǎng)度也不盡相同?,F(xiàn)在MD4/MD5/SHA-1等一些摘要串長(zhǎng)度128比特的摘要算法已不再安全,山東大學(xué)的王小云教授已經(jīng)證明MD4/MD5/SHA-1已經(jīng)可以快速生成“碰撞”。所以在真正的對(duì)安全性要求極高的場(chǎng)所還是使用長(zhǎng)摘要串的摘要算法來(lái)的靠譜一些。

5、對(duì)稱加密算法介紹
5.1 基本
理論上說(shuō)對(duì)稱加密算法,才是我們真正說(shuō)的加密算法。
所謂對(duì)稱加密算法,通俗的講,就是使用密鑰加密,再使用密鑰解密的加密算法的總稱。也就是平時(shí)我們說(shuō)到加密算法,腦子里第一個(gè)跳出來(lái)的加密方式一般都是對(duì)稱加密算法。上面將的base64其實(shí)也是一種“對(duì)稱加密算法”,只是其密鑰公開(kāi)了而已。
5.2 通訊模型
同樣的場(chǎng)景:客戶端要將數(shù)據(jù)data發(fā)給服務(wù)器端。客戶端對(duì)使用密鑰key,對(duì)數(shù)據(jù)data加密,生成加密串C,通過(guò)網(wǎng)絡(luò)將C傳輸為服務(wù)器端,服務(wù)器端,使用密鑰key對(duì)C解密,獲取數(shù)據(jù)data,做自己的業(yè)務(wù)邏輯。

簡(jiǎn)單直接的一種加密方式,與摘要算法不同的地方是,加密過(guò)程其是雙向的,C由data加密而來(lái),同樣可以解密獲得data,前提條件是加密解密時(shí)的key相同。而摘要算法無(wú)法從C解密得到data。
加密過(guò)程簡(jiǎn)單,那么其在對(duì)抗通信中面臨的四種威脅的作用有怎么樣呢:
1)截獲:這么在網(wǎng)絡(luò)中傳輸?shù)膬?nèi)容為密文,即使攻擊者截獲了報(bào)文,由于沒(méi)有密鑰,也無(wú)法解析。所以,這次對(duì)稱加密算法在防范截獲威脅方面有這很大的優(yōu)勢(shì);
2)中斷:和摘要算法一樣,無(wú)法防范;
3)篡改:由于數(shù)據(jù)是密文傳輸?shù)?,攻擊者,無(wú)法解析,更無(wú)法偽造了。所以,可以防范;
4)偽造:對(duì)于數(shù)據(jù)的偽造,和摘要算法一樣,可以防范,但對(duì)于偽造的發(fā)送方,對(duì)稱加密算法和摘要算法一樣,比較的無(wú)力。

5.3 算法優(yōu)缺點(diǎn)
對(duì)稱加密算法有著很多的好處,比較加密速度快,算法簡(jiǎn)單,安全模型的安全性較高等,但在正式中使用時(shí),卻不得不解決一個(gè)問(wèn)題:密鑰如何傳遞。如果將密鑰在網(wǎng)絡(luò)中傳遞,勢(shì)必有被截獲的風(fēng)險(xiǎn)。由于這個(gè)問(wèn)題的存在,導(dǎo)致單純的使用對(duì)稱加密算法的通訊模型,并不是一個(gè)通用的模型,只在一些特殊的場(chǎng)合中使用,例如:客戶端/服務(wù)器端為同一端點(diǎn),或者線下合作的場(chǎng)景——雙方將密鑰寫(xiě)入合同中,線下傳遞。
不過(guò)對(duì)于密鑰,還是建議經(jīng)常的更換,密鑰的po解是一個(gè)耗時(shí)的過(guò)程,長(zhǎng)時(shí)間不變的密鑰,無(wú)遺對(duì)攻擊者創(chuàng)造了po解的機(jī)會(huì),當(dāng)有一天攻擊者po解了密鑰,滅頂之災(zāi)也就來(lái)到。
說(shuō)了這么多的對(duì)稱加密算法,還沒(méi)有說(shuō)對(duì)稱加密算法有哪些,比較常用的對(duì)稱加密算法有DES/3DES/AES/IDEA/RC4/RC2等。其加密強(qiáng)度,可以從其支持的密鑰長(zhǎng)度看出,密鑰越長(zhǎng),加密強(qiáng)度越好;同時(shí),加密過(guò)程越慢。

6、非對(duì)稱加密算法介紹
6.1 基本
對(duì)稱加密算法指加密解密用同一密鑰,那么非對(duì)稱加密就是加密解密用不同的密鑰。
加密算法一次生成兩個(gè)密鑰,一個(gè)叫做公鑰,一個(gè)較為密鑰。公鑰加密的數(shù)據(jù),用密鑰解密;密鑰加密的數(shù)據(jù),用公鑰來(lái)解密(有些非對(duì)稱加密算法,只能用密鑰加密,公鑰解密,或只能用密鑰加密,公鑰解密)。
非對(duì)稱加密算法的確神奇,其理論的基礎(chǔ)來(lái)自于數(shù)論。例如RSA算法建立在數(shù)論中的“大數(shù)分解和素?cái)?shù)檢測(cè)”的理論基礎(chǔ)上。而ElGamal和ECC算法基于的則是數(shù)論中的“離散對(duì)數(shù)問(wèn)題”。數(shù)學(xué)中的最后一個(gè)未找到應(yīng)用場(chǎng)景的分支學(xué)科——數(shù)論,終于在加密學(xué)領(lǐng)域,找到了應(yīng)用場(chǎng)景,這不得不說(shuō)是個(gè)奇跡。
非對(duì)稱加密算法的加入,使得加密算法得以真正的完整,他有這舉足輕重的作用。他很好的解決了對(duì)稱加密算法的缺陷。
6.2 通訊模型
客戶端要將數(shù)據(jù)data發(fā)送給服務(wù)器端,客戶端向服務(wù)器端發(fā)起對(duì)話請(qǐng)求,服務(wù)器端生成一對(duì)密鑰——公鑰Gkey和私鑰Skey。將Gkey發(fā)送給客戶端,客戶端使用Gkey對(duì)數(shù)據(jù)data進(jìn)行加密,獲得密文C,將C發(fā)給服務(wù)器端,服務(wù)器端使用自己的Skey解密,獲得數(shù)據(jù)data,完成后續(xù)業(yè)務(wù)邏輯。

從上面的通訊模型中可以看到,在網(wǎng)絡(luò)中傳輸?shù)闹挥忻芪腃、和公鑰Gkey。而私鑰Skey不會(huì)在網(wǎng)絡(luò)中傳輸,攻擊者只能獲取到公鑰,無(wú)法對(duì)解密密文C,也就保證了數(shù)據(jù)的安全性。
詳細(xì)的分析下通訊中面臨的四種威脅:
1)截獲:同樣網(wǎng)絡(luò)中傳輸?shù)氖敲芪模磿r(shí)被截獲,攻擊者沒(méi)有私鑰,也無(wú)法解析密文。所以可以很好的防范截獲威脅;
2)中斷:對(duì)于針對(duì)可用性的攻擊,由于一般都是基于底層協(xié)議的攻擊,所以一般很難防范;
3)篡改:由于數(shù)據(jù)是密文傳輸?shù)?,攻擊者沒(méi)有私鑰,無(wú)法解析,更無(wú)法偽造了;
4)偽造:對(duì)于數(shù)據(jù)的偽造,和摘要算法一樣,可以防范,但對(duì)于偽造的發(fā)送方,對(duì)稱加密算法和摘要算法一樣,比較的無(wú)力。

和對(duì)稱加密算法一樣,只能對(duì)通信中的截獲、篡改有防范作用,對(duì)其他兩個(gè)中斷、偽造威脅都無(wú)法防范。而由于非對(duì)稱加密算法,很好的解決了對(duì)稱加密算法中密鑰交換的問(wèn)題,所以其有著很不錯(cuò)的應(yīng)用場(chǎng)景,可以說(shuō)是一種通用的加密模型。
6.3 算法優(yōu)缺點(diǎn)
那么非對(duì)稱加密算法就沒(méi)有缺點(diǎn)嗎?
也不是。首先,我們看上面的通訊模型,他比對(duì)稱加密算法的通訊模型來(lái)的復(fù)雜,存在著兩次請(qǐng)求/響應(yīng)。此外,非對(duì)稱加密算法的計(jì)算可能會(huì)很慢,比對(duì)稱加密算法來(lái)慢得多。所以,非對(duì)稱加密算法在解決了對(duì)稱加密算法的缺陷后,存在著一些性能問(wèn)題,比較通用的解決辦法是將兩種加密算法進(jìn)行結(jié)合——先使用非對(duì)稱加密算法傳遞臨時(shí)的對(duì)稱加密算法的密鑰,密鑰傳遞完成后,再使用更快的對(duì)稱加密算法來(lái)進(jìn)行真正的數(shù)據(jù)通信。
典型的非對(duì)稱加密算法有RSA/ElGamal/ECC算法,除了這兩個(gè)算法外,還有一個(gè)DH算法,其比較的另類,其設(shè)計(jì)的初衷就是解決對(duì)稱加密算法中密鑰安全交換的問(wèn)題。
其通訊模型如下:
所有客戶端生成一堆公鑰CGkey和私鑰CSkey,將AGkey發(fā)給服務(wù)器端。服務(wù)器端通過(guò)AGkey生成服務(wù)器端的公鑰SGkey和私鑰SSkey,并將SGkey發(fā)還給客戶端。客戶端通過(guò)CSkey與SGkey生成對(duì)稱加密算法的密鑰key,服務(wù)器端通過(guò)CGkey和SSkey生成相同的密鑰key。后續(xù)客戶端和服務(wù)器端都是用各自的密鑰key來(lái)通信。

不得不說(shuō),這又是一個(gè)多么神奇的算法。但是他的確存在。并且早于其他的非對(duì)稱加密算法。
7、數(shù)字簽名介紹
7.1 基本
以上三種算法都有防篡改的功能,但摘要算法、和對(duì)稱加密算法若要防篡改,則需要交換密鑰,這又是一件麻煩事兒。所以一般在單純的防篡改的需求上,都是使用非對(duì)稱加密算法。但若是對(duì)整個(gè)明文進(jìn)行加密的話,加密過(guò)程勢(shì)必消耗大量時(shí)間,所以就誕生了數(shù)字簽名。
數(shù)字簽名,本質(zhì)上就是非對(duì)稱加密算法,但出于解密運(yùn)行效率的考慮,并是不對(duì)明文進(jìn)行加密,而是對(duì)明文的摘要加密,生成“數(shù)字串”,并將“數(shù)字串”附在明文之后。
數(shù)字簽名實(shí)際上是非對(duì)稱加密算法的一個(gè)妥協(xié)方案,為了提高加解密的效率,舍棄了非對(duì)稱加密算法對(duì)截獲威脅的優(yōu)勢(shì)。
7.2 通訊模型
先來(lái)看非對(duì)稱加密算法的第一種通訊模型,由客戶端生成一堆密鑰——公鑰Gkey和私鑰Skey,并使用Skey對(duì)明文data進(jìn)行加密,獲得密文C。將C與Gkey發(fā)送給服務(wù)器端,服務(wù)器端使用Gkey對(duì)C進(jìn)行解密。

這種通訊模型,只需要一次請(qǐng)求/響應(yīng)過(guò)程,但卻無(wú)法防范截獲威脅,由于最后的密文C的解密用的是公鑰Gkey,而Gkey在通過(guò)網(wǎng)絡(luò)傳遞,所以攻擊者可以很方便的對(duì)數(shù)據(jù)進(jìn)行截獲、解密,獲得明文data。但這種通訊模型,對(duì)于數(shù)字簽名的場(chǎng)景正合適,數(shù)字簽名的場(chǎng)景并不準(zhǔn)備防范“截獲”威脅。
那么下面來(lái)看下完整的數(shù)字簽名的通訊模型:服務(wù)器端生成一堆密鑰,公鑰Gkey和私鑰Skey,在將明文data進(jìn)行摘要,獲得摘要串Z1,使用私鑰對(duì)Z1加密,獲得密文C,將C,data,Gkey發(fā)給服務(wù)器端,服務(wù)器端使用Gkey解密后獲得Z1,重新根據(jù)data計(jì)算出摘要Z2,通過(guò)比較Z1是否等于Z2來(lái)判斷數(shù)據(jù)是否被篡改。

以上的模型主要由兩個(gè)步驟組成,摘要與非對(duì)稱加密算法的應(yīng)用。
平常我們經(jīng)常用到的簽名算法,也是這兩種算法的組合,比如:
1)SHA1wthRSA,使用SHA1來(lái)做摘要,RSA做未對(duì)稱加密;
2)MD5withRSA,使用MD5做摘要算法,RSA做未對(duì)稱加密;
3)SHA1withDSA,DSA是ElGamal算法的一種改進(jìn)。
8、數(shù)字證書(shū)介紹
8.1 基本
上面說(shuō)了這么多算法,又是摘要算法,又是對(duì)稱加密算法,又是非對(duì)稱加密算法的。但是對(duì)于通訊中的四種威脅——截獲、中斷、篡改、偽造最多也就只能解決其中的兩個(gè),對(duì)于中斷、和偽造威脅,只能干瞪眼。難道,就沒(méi)有其他辦法了嗎。
對(duì)于中斷,一般是網(wǎng)絡(luò)拓?fù)浠騾f(xié)議級(jí)別要解決的問(wèn)題,已經(jīng)超出了我們的范疇,暫時(shí)不表,我們只能做到的是當(dāng)網(wǎng)絡(luò)不可用時(shí),傳輸?shù)臄?shù)據(jù)出現(xiàn)丟包或異常時(shí)可以進(jìn)行及時(shí)的建設(shè),這里就需要用到數(shù)據(jù)完整性的驗(yàn)證了。
至于,要對(duì)付攻擊者“偽造”的威脅,這不僅僅是單一算法層面可以解決的問(wèn)題了。
8.2 通訊模型
正如上面幾節(jié)所說(shuō),偽造分為兩種,一種是數(shù)據(jù)偽造,只要做好防篡改的工作,數(shù)據(jù)偽造都可以很好的防范。另外一種是偽裝成某一網(wǎng)站,與用戶進(jìn)行交互,盜取用戶的一些信。比較常見(jiàn)的如釣yu網(wǎng)站、黑代理服務(wù)器等。
哪非對(duì)稱加密算法的通訊模型來(lái)舉個(gè)例子??蛻舳薃在獲得給自己公鑰時(shí),并沒(méi)有懷疑與公鑰發(fā)出方的身份,客戶端A以為發(fā)給他的依然B,實(shí)際上,B發(fā)出的公鑰已經(jīng)被攻擊者C攔截并丟棄了,C重新生成公鑰偽裝為B發(fā)給了客戶端,后續(xù)的流程實(shí)際上都是攻擊者C在于客戶端A通訊,而客戶端A則以為與自己通訊的是服務(wù)器B。

這個(gè)偽造的過(guò)程在平時(shí)我們的生活中也經(jīng)常會(huì)碰見(jiàn),比如:在實(shí)名制以前,張三買到火車票后,半路被人da劫,車票被搶。這就有點(diǎn)類似于遭遇了攻擊者的攻擊,攻擊者搶走了張三的火車票(公鑰Gkey),并偽造了一張可以以將亂真的車票,(重新生成公鑰Gkey)使用這張車票上火車。整個(gè)過(guò)程看似天衣無(wú)縫,攻擊者獲得了一張免費(fèi)的車票,張三損失了一張火車票。
當(dāng)然,現(xiàn)在這種火車票qiang劫的事件已經(jīng)不太會(huì)發(fā)生了,因?yàn)橐呀?jīng)實(shí)行了實(shí)名制。實(shí)名制的引入,給我們解決上面的“偽造”威脅提供了一個(gè)方案。火車票實(shí)名制,使用了身份證作為驗(yàn)證用戶身份的一個(gè)證明。那么我們?cè)诰W(wǎng)絡(luò)通訊中是否也可以引入這么個(gè)“網(wǎng)站身份證”呢。回答是肯定的,目前也正是這么做的,我們叫他“數(shù)字證書(shū)”。
8.3 CA
正如我們身份證是由可信任的gong an 局辦發(fā)。數(shù)字證書(shū)也是由權(quán)威機(jī)構(gòu)簽發(fā),我們叫做CA,CA會(huì)保證證書(shū)的確是發(fā)給了應(yīng)該得到該證書(shū)的的人。CA也屬于一個(gè)機(jī)構(gòu),他也有被人偽造的風(fēng)險(xiǎn)。所以CA一般是分級(jí)的,頂層的叫做RootCA,由他保證下面的CA的身份。
所以我們的機(jī)器里,保存著有限的幾個(gè)RootCA的機(jī)構(gòu)的公鑰。打個(gè)比方,張三有個(gè)數(shù)字證書(shū),是由A這個(gè)CA機(jī)構(gòu)頒發(fā)的,A的身份由RootCA來(lái)保證。當(dāng)瀏覽器與張三的網(wǎng)站進(jìn)行通訊時(shí),獲取到了張三的數(shù)字證書(shū),實(shí)際上這個(gè)數(shù)字證書(shū)是個(gè)嵌套的證書(shū),里面包含著兩個(gè)子證書(shū):RootCA頒發(fā)給A的證書(shū),和A頒發(fā)給張三網(wǎng)站的證書(shū)。在瀏覽器中保存著有限個(gè)著RootCA的公鑰。使用RootCa的公鑰對(duì)A證書(shū)進(jìn)行驗(yàn)證,驗(yàn)證通過(guò),使用A證書(shū)里的公鑰對(duì)張三網(wǎng)站的證書(shū)進(jìn)行驗(yàn)證,只有再次驗(yàn)證通過(guò)后,才能說(shuō)張三網(wǎng)站的證書(shū)得到了確認(rèn)。
整個(gè)驗(yàn)證過(guò)程是一個(gè)信任鏈。

數(shù)字證書(shū)里主要包含著兩樣?xùn)|西:數(shù)字證書(shū)所有者的身份信息,數(shù)字證書(shū)所有者的公鑰。為了保證證書(shū)在網(wǎng)絡(luò)中通信不被篡改,證書(shū)里會(huì)帶上這些信息的數(shù)字簽名。那么對(duì)數(shù)字證書(shū)的驗(yàn)證就是對(duì)數(shù)字簽名的驗(yàn)證,這就是上圖中每次證書(shū)的驗(yàn)證都要使用到公鑰的原因了。
9、參考資料
[1]?傳輸層安全協(xié)議SSL/TLS的Java平臺(tái)實(shí)現(xiàn)簡(jiǎn)介和Demo演示
[2]?理論聯(lián)系實(shí)際:一套典型的IM通信協(xié)議設(shè)計(jì)詳解(含安全層設(shè)計(jì))
[3]?微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解
[4]?來(lái)自阿里OpenIM:打造安全可靠即時(shí)通訊服務(wù)的技術(shù)實(shí)踐分享
[5]?簡(jiǎn)述實(shí)時(shí)音視頻聊天中端到端加密(E2EE)的工作原理
[6]?移動(dòng)端安全通信的利器——端到端加密(E2EE)技術(shù)詳解
[7]?Web端即時(shí)通訊安全:跨站點(diǎn)WebSocket劫持漏洞詳解(含示例代碼)
[8]?通俗易懂:一篇掌握即時(shí)通訊的消息傳輸安全原理
[9]?IM開(kāi)發(fā)基礎(chǔ)知識(shí)補(bǔ)課(四):正確理解HTTP短連接中的Cookie、Session和Token
[10]?快速讀懂量子通信、量子加密技術(shù)
[11]?一分鐘理解 HTTPS 到底解決了什么問(wèn)題
[12]?一篇讀懂HTTPS:加密原理、安全邏輯、數(shù)字證書(shū)等
[13]?基于Netty的IM聊天加密技術(shù)學(xué)習(xí):一文理清常見(jiàn)的加密概念、術(shù)語(yǔ)等
[14]?手把手教你為基于Netty的IM生成自簽名SSL/TLS證書(shū)
[15]?微信技術(shù)分享:揭秘微信后臺(tái)安全特征數(shù)據(jù)倉(cāng)庫(kù)的架構(gòu)設(shè)計(jì)
[16]?即時(shí)通訊初學(xué)者必知必會(huì)的20個(gè)網(wǎng)絡(luò)編程和通信安全知識(shí)點(diǎn)
[17]?零基礎(chǔ)IM開(kāi)發(fā)入門(mén)(五):什么是IM系統(tǒng)的端到端加密?
10、IM安全系列文章
本文是IM通訊安全知識(shí)系列文章中的第?3?篇,總目錄如下:
《即時(shí)通訊安全篇(一):正確地理解和使用Android端加密算法》
《即時(shí)通訊安全篇(二):探討組合加密算法在IM中的應(yīng)用》
《即時(shí)通訊安全篇(三):常用加解密算法與通訊安全講解》(本文)
《即時(shí)通訊安全篇(四):實(shí)例分析Android中密鑰硬編碼的風(fēng)險(xiǎn)》
《即時(shí)通訊安全篇(五):對(duì)稱加密技術(shù)在Android上的應(yīng)用實(shí)踐》
《即時(shí)通訊安全篇(六):非對(duì)稱加密技術(shù)的原理與應(yīng)用實(shí)踐》
《即時(shí)通訊安全篇(七):用JWT技術(shù)解決IM系統(tǒng)Socket長(zhǎng)連接的身份認(rèn)證痛點(diǎn)》
《即時(shí)通訊安全篇(八):如果這樣來(lái)理解HTTPS原理,一篇就夠了》
《即時(shí)通訊安全篇(九):你知道,HTTPS用的是對(duì)稱加密還是非對(duì)稱加密?》
《即時(shí)通訊安全篇(十):為什么要用HTTPS?深入淺出,探密短連接的安全性》
《即時(shí)通訊安全篇(十一):IM聊天系統(tǒng)安全手段之通信連接層加密技術(shù)》
《即時(shí)通訊安全篇(十二):IM聊天系統(tǒng)安全手段之傳輸內(nèi)容端到端加密技術(shù)》
《即時(shí)通訊安全篇(十三):信創(chuàng)必學(xué),一文讀懂什么是國(guó)密算法》
《即時(shí)通訊安全篇(十四):網(wǎng)絡(luò)端口的安全防護(hù)技術(shù)實(shí)踐》