- 通訊安全概述
1引言
平時開發作業中,我們會經常接觸加密、解密的技術,尤其在今天移動互聯網時代,越來越多的用戶會將資料存盤在云端,或使用在線的服務處理資訊,這些資料有些涉及用戶的隱私,有些涉及用戶的財產,要是沒有一套的方案來解決用戶的資料安全問題的話,這將是一個多么可怕的事兒,
同時,我們作為開發者,也會經常遇到用戶對資料安全的需求,當我們碰到了這些需求后如何解決,如何何種方式保證資料安全,哪種方式最有效,這些問題經常困惑著我們,即時通訊網(52im.net)本次著重整理了常見的通訊安全問題和加解密演算法知識與即時通訊(IM)開發同行們一起分享和學習,
2安全性威脅
一般的,我們在網路中傳輸的資料,都可以認為是存在這潛在的風險的,用一句話來概括就是:“任何在網路中傳輸的明文資料都存在安全性威脅,”
下面就列舉下我們通信中面臨的四種威脅:
- 第一,中斷,攻擊者有意破壞和切斷他人在網路上的通信,這是對可用性的攻擊,
- 第二,截獲,屬于被動攻擊,攻擊者從網路上qie聽他人的通信內容,破壞資訊的機密性,
- 第三,篡改,攻擊者故意篡改網路上傳送的報文,這是對完整性的攻擊,
- 第四,偽造,攻擊者偽造資訊在網路傳送,這是對真實性的攻擊,

3加密解密演算法
我們經常說加密解密演算法是資料安全領域里的“劍”,是一種主動的防護,對資料進行必要的加密處理,以保證其在資料傳輸、存盤中的安全,
- Base64演算法介紹
1原理
嚴謹的說,base64并不是加密演算法,這里提到他是因為他的實作比較簡單,通過他的實作,我們可以更好的理解加密解密的程序,
下面看下他是如何“加密”的,假設我們要對“BC”字串進行加密,現將其轉換為二進制表達方式,并連起來:01000010 01000011,接下來對二進制按6位分組,不夠6位補0,得到010000、100100、001100(最后兩位補0),下面查表,找到對應的值“QKM”,那么“QKM”就是“BC”用base64“加密”后的值了,

從上面的base64演算法,我們可以窺視部分加密的本質:將一段有意義的資訊,通過某種方式,映射為一段看不懂的資訊,使用函式表達即為:
1
public Ciphertext encrypted(Plaintext text);
值得注意的是,base64里有一張映射表,如果改變映射表的順序,最終得到的結果就會跟著改變,有點類似烹調,在相同原料、相同烹調方式下,我們改變加入的調料,最終做出的東西將會也不一樣,這里的映射表,我們叫之為“密鑰”,
2小結
通過base64演算法,可以看出,一個加密演算法會有兩部分組成:密鑰、演算法,兩者不能都公開,都公開的話,就可以被人逆向運算,進行解密,一般的,我們將密鑰進行保密,將演算法進行公開,演算法的公開,有利于演算法的推廣,普及,更有利于尋找演算法中的漏洞,也就是因為base64同時公開了演算法、密鑰,所以我們說他并不是真正的加密演算法,當然如果你調整了上面映射表,那么也能做到加密演算法的目的,不過base64加密的強度比較差,所以不建議在實際應用中作為加密演算法使用,
- 摘要演算法介紹
1基本
我們在平時的作業中經常聽到MD5演算法,比如在一些下載頁面里會給出一個md5的作為檔案驗證串,在迅雷下載中作為檔案的唯一標識,這類演算法嚴格上來說也不是加密演算法,是一種叫做摘要演算法的演算法,不過在平時的使用中,我們經常將摘要演算法混合使用,所以在廣義上來說也可以將他叫為加密演算法,
2摘要長度
摘要演算法的特點是可以將任意長度的字串,給轉換為定長的字串,可以意料的是,在這個轉換程序中,一定是一共單向的程序,打個比方,我們將一個256長度的字串轉換為128長度的字串,轉換前有N256種可能,轉換后有N128種可能,這一定不可能是1對1的對應關系,
所以我們只要保證摘要串(轉換后的串)位數只夠的長,使得“給定一個字串A,經過摘要演算法處理后的串B,很難找到一個字串C,其摘要后的串和串B相同” 即可,所以目前主流的摘要演算法MD/SHA的摘要串長度都在128位以上,而正是出于這個原因,美國還對長摘要串的加密演算法進行了出口的限制,
3通訊模型
摘要演算法在平時的使用中,經常以如下的形式進行:
假設客戶端需要傳輸一段資訊data給服務器端,為了data在網路中資料的完整性,或者說防止資訊data被惡意的用戶篡改,可以始終這種安全通信模型:客戶端與服務器端實作確定了加密密鑰key,一段任意的字串,客戶端將key與資料data拼接在一起,進行摘要得到摘要串C,將data、C傳給服務器端,服務器端得到data和C后,同樣使用與客戶端相同的方法,計算摘要串S,如果S等于C的話,就說明A在傳輸中,沒有被人篡改,
流程如下圖:

對于我們在通信的面臨的四種威脅,摘要演算法是否能防范呢:
截獲:由于網路中傳輸的資料依然的明文的,對于攻擊者來說暴露無遺,所以摘要演算法對于這種威脅,沒什么辦法,
中斷:摘要演算法,是對資料的驗證,對整個網路的可用性方面的攻擊,無法防范,
篡改:客戶端發出的資料,中途被攻擊者進行了修改,由于攻擊者并不知道密鑰key,將無法生成正確的摘要串,所以,摘要演算法可以防范篡改威脅,
偽造:攻擊者偽造成客戶端,給服務器端發資料,但由于拿不到密鑰key,偽造不出摘要串,所以,在這種情況下,摘要演算法是有一定的防范作用的,但是,在偽造威脅中,還有一種是重放攻擊,攻擊者事先將客戶端發給服務器端的包截下來,然后重復發送,例如:客戶端發給服務器端密碼時,被攻擊者記錄了下來,當下次,服務器端再向客戶端詢問密碼時,攻擊者只需將記錄下來的包發給服務器端即可,所以摘要演算法對于偽造威脅的防范是不徹底的,其只可以辨別偽造的內容,不能辨別偽造的發送方,

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

- 對稱加密演算法介紹
1基本
理論上說對稱加密演算法,才是我們真正說的加密演算法,所謂對稱加密演算法,通俗的講,就是使用密鑰加密,再使用密鑰解密的加密演算法的總稱,也就是平時我們說到加密演算法,腦子里第一個跳出來的加密方式一般都是對稱加密演算法,上面將的base64其實也是一種“對稱加密演算法”,只是其密鑰公開了而已,
2通訊模型
同樣的場景:客戶端要將資料data發給服務器端,客戶端對使用密鑰key,對資料data加密,生成加密串C,通過網路將C傳輸為服務器端,服務器端,使用密鑰key對C解密,獲取資料data,做自己的業務邏輯,

簡單直接的一種加密方式,與摘要演算法不同的地方是,加密程序其是雙向的,C由data加密而來,同樣可以解密獲得data,前提條件是加密解密時的key相同,而摘要演算法無法從C解密得到data,
加密程序簡單,那么其在對抗通信中面臨的四種威脅的作用有怎么樣呢:
截獲:這么在網路中傳輸的內容為密文,即使攻擊者截獲了報文,由于沒有密鑰,也無法決議,所以,這次對稱加密演算法在防范截獲威脅方面有這很大的優勢,
中斷:和摘要演算法一樣,無法防范,
篡改:由于資料是密文傳輸的,攻擊者,無法決議,更無法偽造了,所以,可以防范,
偽造:對于資料的偽造,和摘要演算法一樣,可以防范,但對于偽造的發送方,對稱加密演算法和摘要演算法一樣,比較的無力,

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

- 非對稱加密演算法介紹
1基本
對稱加密演算法指加密解密用同一密鑰,那么非對稱加密就是加密解密用不同的密鑰,加密演算法一次生成兩個密鑰,一個叫做公鑰,一個較為密鑰,公鑰加密的資料,用密鑰解密;密鑰加密的資料,用公鑰來解密(有些非對稱加密演算法,只能用密鑰加密,公鑰解密,或只能用密鑰加密,公鑰解密),
非對稱加密演算法的確神奇,其理論的基礎來自于數論,例如RSA演算法建立在數論中的“大數分解和素數檢測”的理論基礎上,而ElGamal和ECC演算法基于的則是數論中的“離散對數問題”,數學中的最后一個未找到應用場景的分支學科——數論,終于在加密學領域,找到了應用場景,這不得不說是個奇跡,
非對稱加密演算法的加入,使得加密演算法得以真正的完整,他有這舉足輕重的作用,他很好的解決了對稱加密演算法的缺陷,
2通訊模型
客戶端要將資料data發送給服務器端,客戶端向服務器端發起對話請求,服務器端生成一對密鑰——公鑰Gkey和私鑰Skey,將Gkey發送給客戶端,客戶端使用Gkey對資料data進行加密,獲得密文C,將C發給服務器端,服務器端使用自己的Skey解密,獲得資料data,完成后續業務邏輯,

從上面的通訊模型中可以看到,在網路中傳輸的只有密文C、和公鑰Gkey,而私鑰Skey不會在網路中傳輸,攻擊者只能獲取到公鑰,無法對解密密文C,也就保證了資料的安全性,詳細的分析下通訊中面臨的四種威脅:
截獲:同樣網路中傳輸的是密文,即時被截獲,攻擊者沒有私鑰,也無法決議密文,所以可以很好的防范截獲威脅,
中斷:對于針對可用性的攻擊,由于一般都是基于底層協議的攻擊,所以一般很難防范,
篡改:由于資料是密文傳輸的,攻擊者沒有私鑰,無法決議,更無法偽造了,
偽造:對于資料的偽造,和摘要演算法一樣,可以防范,但對于偽造的發送方,對稱加密演算法和摘要演算法一樣,比較的無力,

和對稱加密演算法一樣,只能對通信中的截獲、篡改有防范作用,對其他兩個中斷、偽造威脅都無法防范,而由于非對稱加密演算法,很好的解決了對稱加密演算法中密鑰交換的問題,所以其有著很不錯的應用場景,可以說是一種通用的加密模型,
3演算法優缺點
那么非對稱加密演算法就沒有缺點嗎?也不是,首先,我們看上面的通訊模型,他比對稱加密演算法的通訊模型來的復雜,存在著兩次請求/回應,此外,非對稱加密演算法的計算可能會很慢,比對稱加密演算法來慢得多,所以,非對稱加密演算法在解決了對稱加密演算法的缺陷后,存在著一些性能問題,比較通用的解決辦法是將兩種加密演算法進行結合——先使用非對稱加密演算法傳遞臨時的對稱加密演算法的密鑰,密鑰傳遞完成后,再使用更快的對稱加密演算法來進行真正的資料通信,
典型的非對稱加密演算法有RSA/ElGamal/ECC演算法,除了這兩個演算法外,還有一個DH演算法,其比較的另類,其設計的初衷就是解決對稱加密演算法中密鑰安全交換的問題,其通訊模型如下:
所有客戶端生成一堆公鑰CGkey和私鑰CSkey,將AGkey發給服務器端,服務器端通過AGkey生成服務器端的公鑰SGkey和私鑰SSkey,并將SGkey發還給客戶端,客戶端通過CSkey與SGkey生成對稱加密演算法的密鑰key,服務器端通過CGkey和SSkey生成相同的密鑰key,后續客戶端和服務器端都是用各自的密鑰key來通信,

不得不說,這又是一個多么神奇的演算法,但是他的確存在,并且早于其他的非對稱加密演算法,
- 數字簽名介紹
1基本
以上三種演算法都有防篡改的功能,但摘要演算法、和對稱加密演算法若要防篡改,則需要交換密鑰,這又是一件麻煩事兒,所以一般在單純的防篡改的需求上,都是使用非對稱加密演算法,但若是對整個明文進行加密的話,加密程序勢必消耗大量時間,所以就誕生了數字簽名,
數字簽名,本質上就是非對稱加密演算法,但出于解密運行效率的考慮,并是不對明文進行加密,而是對明文的摘要加密,生成“數字串”,并將“數字串”附在明文之后,
數字簽名實際上是非對稱加密演算法的一個妥協方案,為了提高加解密的效率,舍棄了非對稱加密演算法對截獲威脅的優勢,
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來判斷資料是否被篡改,

以上的模型主要由兩個步驟組成,摘要與非對稱加密演算法的應用,平常我們經常用到的簽名演算法,也是這兩種演算法的組合,比如:SHA1wthRSA,使用SHA1來做摘要,RSA做未對稱加密;MD5withRSA,使用MD5做摘要演算法,RSA做未對稱加密;SHA1withDSA,DSA是ElGamal演算法的一種改進,
- 數字證書介紹
1基本
上面說了這么多演算法,又是摘要演算法,又是對稱加密演算法,又是非對稱加密演算法的,但是對于通訊中的四種威脅——截獲、中斷、篡改、偽造最多也就只能解決其中的兩個,對于中斷、和偽造威脅,只能干瞪眼,難道,就沒有其他辦法了嗎,
對于中斷,一般是網路拓撲或協議級別要解決的問題,已經超出了我們的范疇,暫時不表,我們只能做到的是當網路不可用時,傳輸的資料出現丟包或例外時可以進行及時的建設,這里就需要用到資料完整性的驗證了,
至于,要對付攻擊者“偽造”的威脅,這不僅僅是單一演算法層面可以解決的問題了,
2通訊模型
正如上面幾節所說,偽造分為兩種,一種是資料偽造,只要做好防篡改的作業,資料偽造都可以很好的防范,另外一種是偽裝成某一網站,與用戶進行互動,盜取用戶的一些信,比較常見的如釣魚網站、黑代理服務器等,
哪非對稱加密演算法的通訊模型來舉個例子,客戶端A在獲得給自己公鑰時,并沒有懷疑與公鑰發出方的身份,客戶端A以為發給他的依然B,實際上,B發出的公鑰已經被攻擊者C攔截并丟棄了,C重新生成公鑰偽裝為B發給了客戶端,后續的流程實際上都是攻擊者C在于客戶端A通訊,而客戶端A則以為與自己通訊的是服務器B,

這個偽造的程序在平時我們的生活中也經常會碰見,比如:在實名制以前,張三買到火車票后,半路被人打劫,車票被搶,這就有點類似于遭遇了攻擊者的攻擊,攻擊者搶走了張三的火車票(公鑰Gkey),并偽造了一張可以以將亂真的車票,(重新生成公鑰Gkey’)使用這張車票上火車,整個程序看似天衣無縫,攻擊者獲得了一張免費的車票,張三損失了一張火車票,
當然,現在這種火車票qiang劫的事件已經不太會發生了,因為已經實行了實名制,實名制的引入,給我們解決上面的“偽造”威脅提供了一個方案,火車票實名制,使用了身份證作為驗證用戶身份的一個證明,那么我們在網路通訊中是否也可以引入這么個“網站身份證”呢,回答是肯定的,目前也正是這么做的,我們叫他“數字證書”,
3CA
正如我們身份證是由可信任的公安局辦發,數字證書也是由權威機構簽發,我們叫做CA,CA會保證證書的確是發給了應該得到該證書的的人,CA也屬于一個機構,他也有被人偽造的風險,所以CA一般是分級的,頂層的叫做RootCA,由他保證下面的CA的身份,
所以我們的機器里,保存著有限的幾個RootCA的機構的公鑰,打個比方,張三有個數字證書,是由A這個CA機構頒發的,A的身份由RootCA來保證,當瀏覽器與張三的網站進行通訊時,獲取到了張三的數字證書,實際上這個數字證書是個嵌套的證書,里面包含著兩個子證書:RootCA頒發給A的證書,和A頒發給張三網站的證書,在瀏覽器中保存著有限個著RootCA的公鑰,使用RootCa的公鑰對A證書進行驗證,驗證通過,使用A證書里的公鑰對張三網站的證書進行驗證,只有再次驗證通過后,才能說張三網站的證書得到了確認,
整個驗證程序是一個信任鏈,

數字證書里主要包含著兩樣東西:數字證書所有者的身份資訊,數字證書所有者的公鑰,為了保證證書在網路中通信不被篡改,證書里會帶上這些資訊的數字簽名,那么對數字證書的驗證就是對數字簽名的驗證,這就是上圖中每次證書的驗證都要使用到公鑰的原因了,
另外還有一些關于c++ Linux后臺服務器開發的一些知識點分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,協程,DPDK,webrtc,音視頻等等視頻,


需要的朋友可以VX關注零聲學院領取

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/194974.html
標籤:其他
