博客 / 詳情

返回

即時通訊安全篇(三):一文讀懂常用加解密算法與網絡通訊安全

1、引言
平時開發工作中,我們會經常接觸加密、解密的技術。尤其在今天移動互聯網時代,越來越多的用户會將數據存儲在雲端,或使用在線的服務處理信息。這些數據有些涉及用户的隱私,有些涉及用户的財產,要是沒有一套的方案來解決用户的數據安全問題的話,這將是一個多麼可怕的事兒。

作為開發者,也會經常遇到用户對數據安全的需求,當我們碰到了這些需求後如何解決,如何何種方式保證數據安全,哪種方式最有效,這些問題經常困惑着我們。52im社區本次着重整理了常見的通訊安全問題和加解密算法知識與即時通訊/IM開發同行們一起分享和學習。

2、通訊安全性威脅
一般的,我們在網絡中傳輸的數據,都可以認為是存在這潛在的風險的。用一句話來概括就是:“任何在網絡中傳輸的明文數據都存在安全性威脅。”下面就列舉下我們通信中面臨的四種威脅:1)中斷:攻擊者有意破壞和切斷他人在網絡上的通信,這是對可用性的攻擊;2)截獲:屬於被動攻ji,攻擊者從網絡上qie聽他人的通信內容,破壞信息的機密性;3)篡改:攻擊者故意篡改網絡上傳送的報文,這是對完整性的攻擊;4)偽造:攻擊者偽造信息在網絡傳送,這是對真實性的攻擊。
圖片
我們經常説加密解密算法是數據安全領域裏的“劍”,是一種主動的防護,對數據進行必要的加密處理,以保證其在數據傳輸、存儲中的安全。接下來講着重講解加解密算法知識。

3、Base64算法介紹
3.1 原理
嚴謹的説,base64並不是加密算法,這裏提到他是因為他的實現比較簡單,通過他的實現,我們可以更好的理解加密解密的過程。下面看下他是如何“加密”的。假設我們要對“BC”字符串進行加密。現將其轉換為二進制表達方式,並連起來:01000010 01000011,接下來對二進制按6位分組,不夠6位補0,得到010000、100100、001100(最後兩位補0)。下面查表,找到對應的值“QKM”。那麼“QKM”就是“BC”用base64“加密”後的值了。
圖片

從上面的base64算法,我們可以窺視部分加密的本質:將一段有意義的信息,通過某種方式,映射為一段看不懂的信息。

使用函數表達即為:

public Ciphertext encrypted(Plaintext text);

值得注意的是:base64裏有一張映射表,如果改變映射表的順序,最終得到的結果就會跟着改變。有點類似烹調,在相同原料、相同烹調方式下,我們改變加入的調料,最終做出的東西將會也不一樣。這裏的映射表,我們叫之為“密鑰”。

3.2 小結
通過base64算法可以看出,一個加密算法會有兩部分組成:

1)密鑰;
2)算法。
兩者不能都公開,都公開的話,就可以被人逆向運算,進行解密。

一般的:我們將密鑰進行保密,將算法進行公開。算法的公開,有利於算法的推廣,普及,更有利於尋找算法中的漏洞。也就是因為base64同時公開了算法、密鑰,所以我們説他並不是真正的加密算法。當然如果你調整了上面映射表,那麼也能做到加密算法的目的,不過base64加密的強度比較差,所以不建議在實際應用中作為加密算法使用。

4、摘要算法介紹
4.1 基本
我們在平時的工作中經常聽到MD5算法。比如在一些下載頁面裏會給出一個md5的作為文件驗證串,在迅雷下載中作為文件的唯一標識。

這類算法嚴格上來説也不是加密算法,是一種叫做摘要算法的算法,不過在平時的使用中,我們經常將摘要算法混合使用,所以在廣義上來説也可以將他叫為加密算法。

4.2 摘要長度
摘要算法的特點是可以將任意長度的字符串,給轉換為定長的字符串。

可以意料的是,在這個轉換過程中,一定是一共單向的過程。打個比方,我們將一個256長度的字符串轉換為128長度的字符串,轉換前有N^256種可能,轉換後有N^128種可能,這一定不可能是1對1的對應關係。

所以我們只要保證摘要串(轉換後的串)位數只夠的長,使得“給定一個字符串A,經過摘要算法處理後的串B,很難找到一個字符串C,其摘要後的串和串B相同” 即可。所以目前主流的摘要算法MD/SHA的摘要串長度都在128位以上。而正是出於這個原因,美國還對長摘要串的加密算法進行了出口的限制。

4.3 通訊模型
摘要算法在平時的使用中,經常以如下的形式進行:

假設客户端需要傳輸一段信息data給服務器端,為了data在網絡中數據的完整性,或者説防止信息data被惡意的用户篡改,可以始終這種安全通信模型:客户端與服務器端實現確定了加密密鑰key,一段任意的字符串,客户端將key與數據data拼接在一起,進行摘要得到摘要串C,將data、C傳給服務器端,服務器端得到data和C後,同樣使用與客户端相同的方法,計算摘要串S,如果S等於C的話,就説明A在傳輸中,沒有被人篡改。

流程如下圖:
圖片
對於我們在通信的面臨的四種威脅,摘要算法是否能防範呢:
1)截獲:由於網絡中傳輸的數據依然的明文的,對於攻擊者來説暴露無遺,所以摘要算法對於這種威脅,沒什麼辦法。
2)中斷:摘要算法,是對數據的驗證,對整個網絡的可用性方面的攻擊,無法防範。
3)篡改:客户端發出的數據,中途被攻擊者進行了修改,由於攻擊者並不知道密鑰key,將無法生成正確的摘要串。所以,摘要算法可以防範篡改威脅。
4)偽造:攻擊者偽造成客户端,給服務器端發數據,但由於拿不到密鑰key,偽造不出摘要串。所以,在這種情況下,摘要算法是有一定的防範作用的。但是,在偽造威脅中,還有一種是重放攻擊,攻擊者事先將客户端發給服務器端的包截下來,然後重複發送。例如:客户端發給服務器端密碼時,被攻擊者記錄了下來,當下次,服務器端再向客户端詢問密碼時,攻擊者只需將記錄下來的包發給服務器端即可。所以摘要算法對於偽造威脅的防範是不徹底的,其只可以辨別偽造的內容,不能辨別偽造的發送方。

圖片
常見的摘要算法有MD5/MD4/SHA-1/SHA-2等,其摘要串長度也不盡相同。現在MD4/MD5/SHA-1等一些摘要串長度128比特的摘要算法已不再安全,山東大學的王小云教授已經證明MD4/MD5/SHA-1已經可以快速生成“碰撞”。所以在真正的對安全性要求極高的場所還是使用長摘要串的摘要算法來的靠譜一些。
圖片

5、對稱加密算法介紹
5.1 基本
理論上説對稱加密算法,才是我們真正説的加密算法。

所謂對稱加密算法,通俗的講,就是使用密鑰加密,再使用密鑰解密的加密算法的總稱。也就是平時我們説到加密算法,腦子裏第一個跳出來的加密方式一般都是對稱加密算法。上面將的base64其實也是一種“對稱加密算法”,只是其密鑰公開了而已。

5.2 通訊模型
同樣的場景:客户端要將數據data發給服務器端。客户端對使用密鑰key,對數據data加密,生成加密串C,通過網絡將C傳輸為服務器端,服務器端,使用密鑰key對C解密,獲取數據data,做自己的業務邏輯。

圖片
簡單直接的一種加密方式,與摘要算法不同的地方是,加密過程其是雙向的,C由data加密而來,同樣可以解密獲得data,前提條件是加密解密時的key相同。而摘要算法無法從C解密得到data。加密過程簡單,那麼其在對抗通信中面臨的四種威脅的作用有怎麼樣呢:

1)截獲:這麼在網絡中傳輸的內容為密文,即使攻擊者截獲了報文,由於沒有密鑰,也無法解析。所以,這次對稱加密算法在防範截獲威脅方面有這很大的優勢;
2)中斷:和摘要算法一樣,無法防範;
3)篡改:由於數據是密文傳輸的,攻擊者,無法解析,更無法偽造了。所以,可以防範;
4)偽造:對於數據的偽造,和摘要算法一樣,可以防範,但對於偽造的發送方,對稱加密算法和摘要算法一樣,比較的無力。

圖片

5.3 算法優缺點
對稱加密算法有着很多的好處,比較加密速度快,算法簡單,安全模型的安全性較高等,但在正式中使用時,卻不得不解決一個問題:密鑰如何傳遞。如果將密鑰在網絡中傳遞,勢必有被截獲的風險。由於這個問題的存在,導致單純的使用對稱加密算法的通訊模型,並不是一個通用的模型,只在一些特殊的場合中使用,例如:客户端/服務器端為同一端點,或者線下合作的場景——雙方將密鑰寫入合同中,線下傳遞。不過對於密鑰,還是建議經常的更換,密鑰的po解是一個耗時的過程,長時間不變的密鑰,無遺對攻擊者創造了po解的機會,當有一天攻擊者po解了密鑰,滅頂之災也就來到。説了這麼多的對稱加密算法,還沒有説對稱加密算法有哪些,比較常用的對稱加密算法有DES/3DES/AES/IDEA/RC4/RC2等。其加密強度,可以從其支持的密鑰長度看出,密鑰越長,加密強度越好;同時,加密過程越慢。
圖片

6、非對稱加密算法介紹
6.1 基本
對稱加密算法指加密解密用同一密鑰,那麼非對稱加密就是加密解密用不同的密鑰。

加密算法一次生成兩個密鑰,一個叫做公鑰,一個較為密鑰。公鑰加密的數據,用密鑰解密;密鑰加密的數據,用公鑰來解密(有些非對稱加密算法,只能用密鑰加密,公鑰解密,或只能用密鑰加密,公鑰解密)。

非對稱加密算法的確神奇,其理論的基礎來自於數論。例如RSA算法建立在數論中的“大數分解和素數檢測”的理論基礎上。而ElGamal和ECC算法基於的則是數論中的“離散對數問題”。數學中的最後一個未找到應用場景的分支學科——數論,終於在加密學領域,找到了應用場景,這不得不説是個奇蹟。

非對稱加密算法的加入,使得加密算法得以真正的完整,他有這舉足輕重的作用。他很好的解決了對稱加密算法的缺陷。

6.2 通訊模型

客户端要將數據data發送給服務器端,客户端向服務器端發起對話請求,服務器端生成一對密鑰——公鑰Gkey和私鑰Skey。將Gkey發送給客户端,客户端使用Gkey對數據data進行加密,獲得密文C,將C發給服務器端,服務器端使用自己的Skey解密,獲得數據data,完成後續業務邏輯。
圖片
從上面的通訊模型中可以看到,在網絡中傳輸的只有密文C、和公鑰Gkey。而私鑰Skey不會在網絡中傳輸,攻擊者只能獲取到公鑰,無法對解密密文C,也就保證了數據的安全性。詳細的分析下通訊中面臨的四種威脅:

1)截獲:同樣網絡中傳輸的是密文,即時被截獲,攻擊者沒有私鑰,也無法解析密文。所以可以很好的防範截獲威脅;
2)中斷:對於針對可用性的攻擊,由於一般都是基於底層協議的攻擊,所以一般很難防範;
3)篡改:由於數據是密文傳輸的,攻擊者沒有私鑰,無法解析,更無法偽造了;
4)偽造:對於數據的偽造,和摘要算法一樣,可以防範,但對於偽造的發送方,對稱加密算法和摘要算法一樣,比較的無力。

圖片
和對稱加密算法一樣,只能對通信中的截獲、篡改有防範作用,對其他兩個中斷、偽造威脅都無法防範。而由於非對稱加密算法,很好的解決了對稱加密算法中密鑰交換的問題,所以其有着很不錯的應用場景,可以説是一種通用的加密模型。

6.3 算法優缺點
那麼非對稱加密算法就沒有缺點嗎?

也不是。首先,我們看上面的通訊模型,他比對稱加密算法的通訊模型來的複雜,存在着兩次請求/響應。此外,非對稱加密算法的計算可能會很慢,比對稱加密算法來慢得多。所以,非對稱加密算法在解決了對稱加密算法的缺陷後,存在着一些性能問題,比較通用的解決辦法是將兩種加密算法進行結合——先使用非對稱加密算法傳遞臨時的對稱加密算法的密鑰,密鑰傳遞完成後,再使用更快的對稱加密算法來進行真正的數據通信。

典型的非對稱加密算法有RSA/ElGamal/ECC算法,除了這兩個算法外,還有一個DH算法,其比較的另類,其設計的初衷就是解決對稱加密算法中密鑰安全交換的問題。

其通訊模型如下:

所有客户端生成一堆公鑰CGkey和私鑰CSkey,將AGkey發給服務器端。服務器端通過AGkey生成服務器端的公鑰SGkey和私鑰SSkey,並將SGkey發還給客户端。客户端通過CSkey與SGkey生成對稱加密算法的密鑰key,服務器端通過CGkey和SSkey生成相同的密鑰key。後續客户端和服務器端都是用各自的密鑰key來通信。

圖片
不得不説,這又是一個多麼神奇的算法。但是他的確存在。並且早於其他的非對稱加密算法。

7、數字簽名介紹
7.1 基本
以上三種算法都有防篡改的功能,但摘要算法、和對稱加密算法若要防篡改,則需要交換密鑰,這又是一件麻煩事兒。所以一般在單純的防篡改的需求上,都是使用非對稱加密算法。但若是對整個明文進行加密的話,加密過程勢必消耗大量時間,所以就誕生了數字簽名。

數字簽名,本質上就是非對稱加密算法,但出於解密運行效率的考慮,並是不對明文進行加密,而是對明文的摘要加密,生成“數字串”,並將“數字串”附在明文之後。

數字簽名實際上是非對稱加密算法的一個妥協方案,為了提高加解密的效率,捨棄了非對稱加密算法對截獲威脅的優勢。

7.2 通訊模型
先來看非對稱加密算法的第一種通訊模型,由客户端生成一堆密鑰——公鑰Gkey和私鑰Skey,並使用Skey對明文data進行加密,獲得密文C。將C與Gkey發送給服務器端,服務器端使用Gkey對C進行解密。
圖片
這種通訊模型,只需要一次請求/響應過程,但卻無法防範截獲威脅,由於最後的密文C的解密用的是公鑰Gkey,而Gkey在通過網絡傳遞,所以攻擊者可以很方便的對數據進行截獲、解密,獲得明文data。但這種通訊模型,對於數字簽名的場景正合適,數字簽名的場景並不準備防範“截獲”威脅。那麼下面來看下完整的數字簽名的通訊模型:服務器端生成一堆密鑰,公鑰Gkey和私鑰Skey,在將明文data進行摘要,獲得摘要串Z1,使用私鑰對Z1加密,獲得密文C,將C,data,Gkey發給服務器端,服務器端使用Gkey解密後獲得Z1,重新根據data計算出摘要Z2,通過比較Z1是否等於Z2來判斷數據是否被篡改。

圖片
以上的模型主要由兩個步驟組成,摘要與非對稱加密算法的應用。平常我們經常用到的簽名算法,也是這兩種算法的組合,比如:

1)SHA1wthRSA,使用SHA1來做摘要,RSA做未對稱加密;
2)MD5withRSA,使用MD5做摘要算法,RSA做未對稱加密;
3)SHA1withDSA,DSA是ElGamal算法的一種改進。

8、數字證書介紹
8.1 基本
上面説了這麼多算法,又是摘要算法,又是對稱加密算法,又是非對稱加密算法的。但是對於通訊中的四種威脅——截獲、中斷、篡改、偽造最多也就只能解決其中的兩個,對於中斷、和偽造威脅,只能乾瞪眼。難道,就沒有其他辦法了嗎。

對於中斷,一般是網絡拓撲或協議級別要解決的問題,已經超出了我們的範疇,暫時不表,我們只能做到的是當網絡不可用時,傳輸的數據出現丟包或異常時可以進行及時的建設,這裏就需要用到數據完整性的驗證了。

至於,要對付攻擊者“偽造”的威脅,這不僅僅是單一算法層面可以解決的問題了。

8.2 通訊模型
正如上面幾節所説,偽造分為兩種,一種是數據偽造,只要做好防篡改的工作,數據偽造都可以很好的防範。另外一種是偽裝成某一網站,與用户進行交互,盜取用户的一些信。比較常見的如釣yu網站、黑代理服務器等。哪非對稱加密算法的通訊模型來舉個例子。客户端A在獲得給自己公鑰時,並沒有懷疑與公鑰發出方的身份,客户端A以為發給他的依然B,實際上,B發出的公鑰已經被攻擊者C攔截並丟棄了,C重新生成公鑰偽裝為B發給了客户端,後續的流程實際上都是攻擊者C在於客户端A通訊,而客户端A則以為與自己通訊的是服務器B。
圖片
這個偽造的過程在平時我們的生活中也經常會碰見,比如:在實名制以前,張三買到火車票後,半路被人da劫,車票被搶。這就有點類似於遭遇了攻擊者的攻擊,攻擊者搶走了張三的火車票(公鑰Gkey),並偽造了一張可以以將亂真的車票,(重新生成公鑰Gkey)使用這張車票上火車。整個過程看似天衣無縫,攻擊者獲得了一張免費的車票,張三損失了一張火車票。當然,現在這種火車票qiang劫的事件已經不太會發生了,因為已經實行了實名制。實名制的引入,給我們解決上面的“偽造”威脅提供了一個方案。火車票實名制,使用了身份證作為驗證用户身份的一個證明。那麼我們在網絡通訊中是否也可以引入這麼個“網站身份證”呢。回答是肯定的,目前也正是這麼做的,我們叫他“數字證書”。

8.3 CA
正如我們身份證是由可信任的gong an 局辦發。數字證書也是由權威機構簽發,我們叫做CA,CA會保證證書的確是發給了應該得到該證書的的人。CA也屬於一個機構,他也有被人偽造的風險。所以CA一般是分級的,頂層的叫做RootCA,由他保證下面的CA的身份。所以我們的機器裏,保存着有限的幾個RootCA的機構的公鑰。打個比方,張三有個數字證書,是由A這個CA機構頒發的,A的身份由RootCA來保證。當瀏覽器與張三的網站進行通訊時,獲取到了張三的數字證書,實際上這個數字證書是個嵌套的證書,裏面包含着兩個子證書:RootCA頒發給A的證書,和A頒發給張三網站的證書。在瀏覽器中保存着有限個着RootCA的公鑰。使用RootCa的公鑰對A證書進行驗證,驗證通過,使用A證書裏的公鑰對張三網站的證書進行驗證,只有再次驗證通過後,才能説張三網站的證書得到了確認。整個驗證過程是一個信任鏈。
圖片

數字證書裏主要包含着兩樣東西:數字證書所有者的身份信息,數字證書所有者的公鑰。為了保證證書在網絡中通信不被篡改,證書裏會帶上這些信息的數字簽名。那麼對數字證書的驗證就是對數字簽名的驗證,這就是上圖中每次證書的驗證都要使用到公鑰的原因了。

9、參考資料
[1] 傳輸層安全協議SSL/TLS的Java平台實現簡介和Demo演示

[2] 理論聯繫實際:一套典型的IM通信協議設計詳解(含安全層設計)

[3] 微信新一代通信安全解決方案:基於TLS1.3的MMTLS詳解

[4] 來自阿里OpenIM:打造安全可靠即時通訊服務的技術實踐分享

[5] 簡述實時音視頻聊天中端到端加密(E2EE)的工作原理

[6] 移動端安全通信的利器——端到端加密(E2EE)技術詳解

[7] Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例代碼)

[8] 通俗易懂:一篇掌握即時通訊的消息傳輸安全原理

[9] IM開發基礎知識補課(四):正確理解HTTP短連接中的Cookie、Session和Token

[10] 快速讀懂量子通信、量子加密技術

[11] 一分鐘理解 HTTPS 到底解決了什麼問題

[12] 一篇讀懂HTTPS:加密原理、安全邏輯、數字證書等

[13] 基於Netty的IM聊天加密技術學習:一文理清常見的加密概念、術語等

[14] 手把手教你為基於Netty的IM生成自簽名SSL/TLS證書

[15] 微信技術分享:揭秘微信後台安全特徵數據倉庫的架構設計

[16] 即時通訊初學者必知必會的20個網絡編程和通信安全知識點

[17] 零基礎IM開發入門(五):什麼是IM系統的端到端加密?

10、IM安全系列文章
本文是IM通訊安全知識系列文章中的第 3 篇,總目錄如下:

《即時通訊安全篇(一):正確地理解和使用Android端加密算法》

《即時通訊安全篇(二):探討組合加密算法在IM中的應用》

《即時通訊安全篇(三):常用加解密算法與通訊安全講解》(本文)

《即時通訊安全篇(四):實例分析Android中密鑰硬編碼的風險》

《即時通訊安全篇(五):對稱加密技術在Android上的應用實踐》

《即時通訊安全篇(六):非對稱加密技術的原理與應用實踐》

《即時通訊安全篇(七):用JWT技術解決IM系統Socket長連接的身份認證痛點》

《即時通訊安全篇(八):如果這樣來理解HTTPS原理,一篇就夠了》

《即時通訊安全篇(九):你知道,HTTPS用的是對稱加密還是非對稱加密?》

《即時通訊安全篇(十):為什麼要用HTTPS?深入淺出,探密短連接的安全性》

《即時通訊安全篇(十一):IM聊天系統安全手段之通信連接層加密技術》

《即時通訊安全篇(十二):IM聊天系統安全手段之傳輸內容端到端加密技術》

《即時通訊安全篇(十三):信創必學,一文讀懂什麼是國密算法》

《即時通訊安全篇(十四):網絡端口的安全防護技術實踐》

《即時通訊安全篇(十五):詳解硬編碼密碼的泄漏風險及其掃描原理和工具》

(本文已同步發佈於:http://www.52im.net/thread-219-1-1.html)

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.