那些年咱們一塊兒守護的「密」

0×00 前言

「互聯網+」使得各種信息高度數字化,社會生產、人類生活無不與各種信息網絡相關,當愈來愈多的經濟利益與數字信息關聯後,暗地裏便會有「黑手」不惜使用各種方式伸向這些信息,來達到不可告人的目的。加密技術也所以迅猛發展,普遍應用,守護信息安全。本文討論數字加密技術的基本原理、分類、應用以及一些思考,內容較爲樸實,請大牛酌情觀看。算法

0×01 加密技術基礎

Q:爲何要加密?

A:寶寶還不能有點祕密了?信息數字化後便造成數字信息,因爲大部分信息都具備必定的知悉範圍,而不但願面向全部人開放,便會利用一些技術來進行數據保護,加密技術即是一種。根據信息對象的狀態,加密技術大體分爲針對存儲介質中靜態數據的加密,和針對傳輸數據的加密。安全

Q:加密技術有哪些重要元素?

A:算法和密鑰。若是把密文比做一道門,則算法就是開關門的動做,而密鑰就是鑰匙。算法、明文空間、密文空間和密鑰空間組成一個完整的密碼系統。網絡

Q:加密技術的特性

A:保密性 – 只有信息知悉範圍內纔可獲取信息的明文,其餘人沒法知悉。dom

認證性 – 確認信息發送者的身份或信息來源的可靠性。electron

完整性 – 信息傳輸過程當中保持一致,不被篡改。分佈式

不可抵賴性 – 發送者不可否認已發送的信息。ide

Q:怎樣纔算一個合格的加密算法?

A:若是攻擊者不可以從密文中計算出關於明文的任何信息,就說該加密方案是安全的。可是考慮到信息的私密性帶有必定的時效,能夠在此定義中加入時間因素,即在已知算法和密文後,在任何攻擊者所能擔負的最大計算資源的狀況下,仍然在信息有效期內不能計算出關於明文的任何信息,即可認爲該算法是安全的。函數

0×02 加密技術分類

A)按設計理念劃分

現代密碼學和古典密碼學性能

古典密碼歸根結底主要有兩種,即置換和代換。主要依靠人工計算和很是簡單的機械 ,而且是用人的主觀意識設計和使用的,安全性不高但算法簡單而藝術 。測試

現代密碼學主要依賴於計算機,以數學、物理等學科爲基礎理論,構成客觀的密碼形式,安全性高於傳統密碼但算法複雜。

B)按算法的公開性劃分

基於算法保密的加密技術和基於密鑰保密的加密技術

若是密文的保密性是基於保持算法的祕密,這種算法稱爲受限制的算法。例如古典密碼中的代換即是一個典型,這類算法雖然在以前佔據主流,但在現代密碼前,已經不能很好的適應互聯網社會的需求。因爲如今加密場景愈加複雜,用戶規模龐大,人員流動頻繁,這就使得算法的私密性難以控制,一旦有人離開這個組織或者泄露算法,就須要其餘用戶更換算法,這種運行成本很是高。另外,算法的不公開必定程度上也是安全隱患,相反公開算法後通過更多羣體的論證測試以證明算法的安全性。

現代密碼學廣泛採用基於密鑰保護的加密技術,算法徹底公開,這也爲相關標準的制定和大規模的使用奠基基礎。

C)按密鑰類型劃分

對稱加密算法和非對稱加密算法

對稱加密算法在加密和解密過程當中採用相同的密鑰,非對稱加密算法則在加密和解密過程當中採用不一樣的密鑰。

圖片1.png

D)單向加密

通常加密技術是爲了保護信息的祕密性,在解密時須要恢復信息原貌,而單項加密顧名思義就是隻能加密不能解密,只容許單項轉換,又稱散列加密技術。散列加密通常用於摘要信息的造成,即不管原文信息多長,均可以用該算法生成固定長度的摘要信息。一個合格的散列加密算法通常具備以下特性:散列結果不可逆,從結果沒法推出任何部分的原始信息;原始信息的任何差別都會致使散列結果的巨大差別(雪崩效應);找不出具備相同結果的原始信息。單向加密通常用於消息摘要的生成,密鑰加密等。

0×03 對稱加密

對稱加密是指加密和解密過程當中使用相同密鑰的加密算法,因這種加密技術的安全性徹底依賴於密鑰的祕密性,因此也稱爲祕密密鑰算法或單密鑰算法。常見的對稱加密算法有:DES、3DES、TDEA、Blowfish、RC二、RC四、RC五、IDEA、SKIPJACK、AES等。

按照加密單元大小和加密機制,對稱加密可分爲分組密碼和序列密碼。

分組密碼算法以固定的分組長度做爲基本的處理單元,將明文進行分組加密處理。經過閱讀DES算法的相關實現,能夠看到算法經過密鑰的複雜置換後,與分組明文再次進行置換和運算,來實現加密,主要採用混淆原則和擴散原則來提高破解難度、抵抗分析。

分組密碼按照工做模式可分爲:

A)電子密碼本模式ECB(electronic codebook mode)

ECB模式下,明文被劃分爲N份,每份單獨與密鑰進行加密造成對應的N份密文,最後拼接起來造成最終的完整密文。從加密過程可判斷,每份明文在加密過程當中是獨立的,之間沒有任何關聯和影響。

1.png

從ECB的工做原理能夠看出,若是明文數據在等分後,兩塊數據相同則會產生相同的加密數據塊,這會輔助攻擊者快速判斷加密算法的工做模式,而將攻擊資源彙集在破解某一塊數據便可,一旦成功則意味着全文破解,大大提高了攻擊效率。爲了解決這一缺陷,設計者提出了更多的分組密碼工做模式,這些模式下各組數據的加密過程彼此產生關聯,盡最大可能混淆數據。

B)密碼分組連接模式CBC(cipher block chaining Triple)

CBC工做模式下,每塊數據在加密前均須要與前塊數據的加密結果異或,而第一塊數據加密前與初始化向量異或,這樣會使得數據的加密結果受上次加密結果影響,彼此產生關聯,避免相同數據塊加密結果相同的現象。

2.png

C)密碼反饋模式CFB(Cipher FeedBack)

CFB模式與CBC模式相近,密鑰和明文的位置進行顛倒,先讓密鑰與初始化向量進行加密處理,而後與明文異或獲得密文塊,然後密文塊參與下一塊的計算。

3.png

D)輸出反饋模式OFB(Output Feedbaek)

OFB與CFB很是類似,不一樣點在於參與下一組計算的並不是是前一組的密文,而是前一組的密鑰加密結果。

4.png

E)計數器模式CTR(counter mode)

上面的幾種工做模式都存在一個共性:數據塊彼此之間關聯,當前塊的解密依賴前面的密文塊,所以不能隨機訪問任意加密塊。這樣會使得用戶爲了獲取其中一點數據而不得不解密全部數據,當數據量大時效率較低。

CTR模式與OFB類似,OFB中的密鑰流是逐級反饋的,而CRT密鑰流的產生之間是沒有關聯的,而是經過遞增一個加密計數器以產生連續的隨機數流。CRT模式因爲加密和解密能夠並行,因此適合用於多處理器的硬件上。

5.png

與分組密碼相對應的即是序列密碼,又稱流密碼,是指利用密鑰經過複雜的密碼算法產生大量的僞隨機位流,對明文數據流進行加密。在進行解密時,用一樣的密鑰和算法產生相同的僞隨機位流,用以還原明文數據流。目前,公開的序列密碼算法主要有RC四、SEAL等。 

6.png

序列密碼以一個元素(一個字母或一個比特)做爲基本的處理單元,具備轉換速度快、低錯誤傳播的優勢,硬件實現簡單;但加密結果混淆度低、且數據的小幅度變化敏感性低,即插入修改較少的數據,加密結果不會發生大幅變化,這樣會給攻擊者提供較多分析素材。

小結:對稱加密算法的特色是算法公開,計算量小, 加解密速度快、效率高。但加解密雙方都須要知道相同密鑰纔可完成加解密,又因網絡信道一般易被監聽而不可信,因此對稱加密很不適合應用在網絡通訊中。另外,爲了通訊的安全性,密鑰須要確保惟一,每對用戶需使用其餘人均不知的密鑰, 這會使得整個通訊網絡擁有的密鑰數量呈幾何級數增加,密鑰管理成爲用戶的負擔。 假設一個通訊網絡中有N個用戶,用戶A發送信息給B和用戶B發送信息給A使用的密鑰不一樣,則整個網絡構成N階徹底圖,整個網絡的密鑰總數爲N(N-1),每個用戶持有密鑰數爲2(N-1),因爲成本較高, 對稱加密算法難以在分佈式網絡系統上使用。

0×04 非對稱加密

因爲對稱加密的密鑰管理壓力,難以適應大規模、高頻率的網絡通訊加密,網絡通訊更須要一種「按需申請」的動態管理加密方案,即須要時再申請密鑰,而非事前預製全部密鑰,這樣會大大減輕密鑰過多的管理壓力,非對稱加密即是一種很好的解決方案。正是這種解決方案較好解決了分佈式網絡傳輸的加密問題,才使得互聯網金融、電商、支付等迅猛發展。

非對稱加密的密鑰系統由公鑰和私鑰組成,其中一個是對外公開的,全部人均可以得到,稱爲公鑰;而與之相對應的稱爲私鑰,只有密鑰的生成者才能擁有。信息使用公鑰加密後,只有對應的私鑰才能進行解密,且從公鑰不能推出私鑰,因此能確保在不安全鏈路上傳輸的安全性。

以著名的RSA非對稱算法爲例,其用到了數論中的三個基本定理:費馬小定理、歐拉定理和中國剩餘定理,和一個古典難題:大整數分解問題, 而RSA的安全性也正是基於大整數的分解極其困難。

算數基本定理:任何大於1的整數均可以分解成素數乘積的形式,而且,若是不計分解式中素數的次序,該分解式是惟一的。

下圖是分解大素數的時間參考表

7.png

從這個表中即可以看出破解RSA的難度之大。

非對稱加密技術還有一個重要的應用場景,即是身份或信息的認證。在這種場景中,各個用戶的身份信息都廣爲人知,且各自的公鑰也面向全部用戶公佈,私鑰只有本身掌握,用戶將本身的身份信息用本身的私鑰加密,這樣接收者在收到相關信息後只須要使用對應用戶的公鑰進行解密對比便可肯定對方身份。這種方法一樣能夠用來肯定消息的來源認證。

Q:若是傳輸鏈路遭受MITM攻擊,僞造了公鑰怎麼辦?

A:上面的方案確實存在僞造公鑰的風險。這則須要第三方保證公鑰的合法性,這即是CA(Certificate Authority)證書中心。CA用本身的私鑰對用戶發佈的公鑰和身份信息進行加密,得出數字證書。用戶在發佈信息時,須要帶上數字證書。接收者先用CA給的公鑰解出信息全部者的公鑰,這樣能夠保證信息全部者的公鑰是真正的公鑰,而後就能經過該公鑰證實身份信息是否真實了。

Q:如何確保CA公鑰的真實性?

A:CA公鑰的真實性由PKI來確保。X.509標準中,爲了區別於權限管理基礎設施(Privilege Management Infrastructure,簡稱PMI),將PKI定義爲支持公開密鑰管理並能支持認證、加密、完整性和可追究性服務的基礎設施。PKI 中證書的信用是一級一級背書的,即講究「血脈」繼承。企業或開發者須要擁有本身的證書時,須要向相關證書機構提出申請,讓其頒發屬於該認證機構證書信任鏈上的證書。Windows 系統會內置世界上幾個大的根證書機構的證書,這就意味着證書一級一級往上查,即可以找到這幾家根證書機構,從而確保證書的合法性。下圖是google的證書鏈。

8.png

0×05 摘要算法

摘要算法主要使用單向加密函數,能夠將任意長度的數據,經過運算 獲得一個固定長度的結果,可用於實現數據簽名、數據完整性校驗等功能,因爲其不可逆性,也可用作敏感信息的加密。數據摘要算法也被稱爲哈希(Hash)算法、散列算法。

摘要算法具備兩大特性:

一、惟一性:輸入不一樣時,輸出結果必然不一樣;

二、不可逆性:沒法經過摘要算法從結果推導出原文。

A)利用摘要算法確保信息一致性

在網絡中傳輸時,可能會遇到遭受攻擊的數據篡改、部分數據信息丟失等問題,爲對傳輸的數據進行真實性、完整性校驗,可在發送前利用摘要算法計算出原文的摘要,將其與原文一同發送,接受者在收到信息後,再次計算摘要進行比對,便可知道數據有沒有被篡改或者是豆完整接收。其實這一解決方案早就應用在各類協議的校驗中,例如IP校驗和、UDP/TCP校驗和等。

著名的MD5和SHA等均屬於摘要算法,這類算法的核心即是其中的HASH函數,這類函數通常需具有如下幾個屬性:

a.輸入的數據沒有長度限制;

b.輸出的摘要信息均爲固定長度;

c.算法方便高效;

d.難以從指定摘要推出一個原文;

e.難以找到兩個不一樣的報文具備相同摘要。

B)利用摘要算法進行加密存儲

密碼這類重要數據做爲用戶認證的重要憑證,一般不以明文形式存儲,不然一旦被脫庫則「盡收眼底」。開發者一般會選擇摘要算法對密碼進行單項加密後存儲,這樣即便脫庫也不會使明文密碼泄露。

Q:明文密碼HASH後再存儲真的安全嗎?

A

9.png

理論上,單向加密算法是不可逆的,可是隨着存儲成本的下降,例如上圖網站所示的雲破解型網站曾出不窮,你們能夠發現一些長度較長的複雜密碼並不能還原,這也說明這類網站背後的運行機制實際是查表,後臺存儲了諸多經常使用字串的HASH結果,即預先計算好結果,當收到用戶的查詢請求時只須要查表便可完成。

除了這種雲字典的方式外,彩虹表攻擊也一樣有效。彩虹表是一個用於加密散列函數逆運算的預先計算好的表, 經常使用於破解加密過的密碼散列,屬於以空間換時間的典型實踐, 與字典攻擊相比,使用更少的儲存空間和更多的計算性能。

Q:如何應對「雲破解」?

A:爲了加固MD5的安全性,應對此類事先準備好的龐大hash值字典,可在hash計算過程當中加入鹽值(salt),從而大大削弱字典的影響。鹽值是一組隨機生成的字符串,根據要求長度均不固定,相同的明文加入不一樣鹽值產生的密文也不同。

原有的md5:密文 = md5(明文)

加鹽的md5:密文 = md5(明文 + 鹽值)

根據算法咱們可知,若是原始MD5表爲300 G,則沒增長一種鹽值,表就增長300G,假設加鹽值的 可能性有1萬個,則要想對加鹽後的md5進行有效破解,就須要準備10000*300G(約3PB) ,這已經大大提高了表攻擊的難度。

Q:如何選擇鹽值?

A:在選擇鹽值時,應該避免下面的情形。

a)重複使用鹽值

一些開發者爲了圖省事,程序中使用固定鹽值,這會使得加鹽失去意義,由於相同的密碼在使用相同鹽值進行hash後,結果依舊相等。攻擊者在準備預計算的字典時,將這個固定鹽值帶入則可造成新的有效字典。因此在加鹽時,每次計算都應從新生成新的鹽值。

b)鹽值長度太短

鹽值長度太短意味着鹽值的全部可能取得值較少,攻擊者即可以針對全部可能性的鹽值進行預計算,造成常見密碼在各個鹽值下的字典。因此通常建議鹽值的長度等於hash輸出的結果長度。

c)屢次進行hash

許多人認爲,屢次進行hash會加強安全性,會提高時間成本。其實這種嘗試本身設計加密算法的行爲並不見得會更加安全。例以下列這些算法,安全性均基於算法的保密性,其實這些本身設計的簡易多重hash算法很容易經過各類手段分析出來,從而按照該算法制做字典。

md5(sha1(password))

sha1(sha1(password))

md5(sha1(md5(md5(password) + sha1(password)) + md5(password)))

0×06 混合加密

前面介紹的對稱加密因密鑰管理問題,而不能直接用在分佈式網絡中,那咱們能夠直接使用非對稱算法來解決這一問題嗎?答案是否認的。咱們先來看一下非對稱算法RSA在密鑰初始化階段的耗時。

10.png

注:該圖並不是連續曲線,只是爲了便於觀察趨勢而繪製爲連續曲線。

從時間上看,當密鑰長度爲1六、3二、6四、128比特時,初始化時間均<1s,而其後的增加便成指數倍增加,當長度達到2048bit時,耗時更是長達近6分鐘。

通過測試,咱們更是能夠看出非對稱加密算法在加解密過程當中的時間效率也不如對稱加密。對稱加密算法在加解密過程當中均表現優異,儘管非對稱加密算法在加密時速度也很是快,可是在解密時便顯得十分耗時,例如RSA加密1M大小的文件只須要數秒,而解密時耗時高達5分鐘之久。這種解密效率顯然不能勝任網絡傳輸中的高實時性要求。

在結合對稱加密和非對稱加密算法的優點後,可以使用二者混合使用的方案來解決這一問題,即便用對稱加密算法加密傳輸的數據,使用非對稱算法加密傳輸對稱加密的密鑰。

具體過程以下:

①發送者和接收者相互進行身份的認證;

②接收者:使用非對稱加密算法生成一對密鑰,將公鑰發送給發送者;

③發送者:生成對稱加密密鑰,使用該密鑰對數據進行對稱加密;

④發送者:接收②發送的公鑰,使用該公鑰對③中的對稱密鑰進行加密;

⑤發送者:發送③④的加密結果給接收者;

⑥接收者:接收⑤發送的數據,使用私鑰解密出對稱密鑰,而後利用該對稱密鑰對數據進行解密。

0×07 編碼OR加密

常常會聽到小夥伴這樣說:使用base64加密一下。嚴格來講,base64並不是是一種加密算法而是一種編碼算法。

Q:編碼和加密有何區別?

A:加密是使用特殊的算法對原始數據進行改變造成密文,使得非法用戶即便得到密文也沒法推出原文。而編碼是但願別人解碼的,是爲了適應某種特定場景,而轉換數據格式。Base64主要應用在網絡傳輸中,由於1個字節的取值範圍爲0-255,可是並不是這256個值都是可見字符,因此base64是爲了解決網絡傳輸中將不可見字符轉換爲可見字符的問題,具體算法請自行谷歌。

Q:base64編碼後的結果已經看不懂了,難道不算加密?

A:的確,base64編碼後的結果與原文有較大差異,可是這並不意味着就是安全的。看不懂只意味着數據可讀性變差,畢竟base64算法是一種公開的標準算法,因此只要使用該算法對結果進行解碼便可恢復原文,因此根本不具有加密算法的特性。因爲base64在編碼時是依據特定的編碼表對字符進行映射編碼,有小夥伴說,能夠本身更改一下置換表就能夠實現加密效果了。確實如此,自定義的置換表只有受權用戶知曉,則非受權者沒法對內容進行解密,能夠達到加密效果,可是這種加密相似與古典加密的代換算法,安全性並不高,不建議使用。

0×08加密技術的脆弱點

看了這麼多加密算法,最後咱們一塊兒來看看加密技術在各類使用場景下的脆弱點。

A)脆弱的密鑰

密鑰就至關與鑰匙,一旦丟失,無論你的門修的如何結實,也會功虧一簣。一樣在加密算法中,密鑰的保存也一樣重要。在一些大片中,會看到一些公司將私鑰存放在重重鐵門背後,將其安防等級設爲最高級別。在平時曝光的一些安全事件中,也不乏能夠看到因爲開發者的錯誤,致使私鑰泄露,而給公司形成重大損失的案例。

一樣,在不少本地加密軟件中,不巧當的邏輯設計也給攻擊者給予可趁之機。一些加密軟件會將密鑰存儲下載,以便驗證輸入的密碼是否正確,這樣的作法很容易經過逆向的方法來獲取到真實的密鑰。而更多的軟件則是採起筆者第一篇文章中所逆向的加密軟件的方法,將一段特殊標記進行加密追加在加密文件中,當輸入密碼後先解密這段特殊標記,經過對比這段標記來斷定密碼是否正確,以此決定要不要繼續解密原文。其實這種作法依舊沒法抵抗暴破。

當時有一位讀者就給出了很好的建議,能夠不適用這個標記來判斷密碼是否正確,徹底不在加密文件中存儲任何有關密鑰的信息,只要用戶輸入密鑰就拿這個密鑰進行解密,這樣只有正確的密鑰才能解密出正確的結果。這確實是一個安全性很是高的方案,可是用戶體驗有些差,對於一個健忘症來講簡直是個災難;另外若是文件很是大,解密耗時很長,結果解密了1個多小時後,一看番號不對,想死的心都有了。

B)僞隨機數

上面是密鑰的安全保管問題,若是密鑰是可計算或可預測的,那麼同樣不安全。通常開發者均使用random函數來生成隨機數,嚴格來講這是「僞隨機數」,在種子固定的狀況下,輸出的數值序列均相同,由於這是經過軟件方法使用算法產生隨機數,通常使用線形同餘法:隨機數列符合X[n+1] = (A*X[n] + B) mod N, X[0] = seed,其中seed爲種子,A、B、N爲整數。

由公式能夠看出係數A和B的公因數越大,該數列的週期越小,並且最大週期 = N。

在對c語言rand()函數週期進行測試後,得出以下結果:

當對比數目爲1時,即第一個數重複出現的位置爲96113;當對比數目爲2時,重複出現位置爲745064332;當對比數目爲3和大於3時,重複位置爲2147483648。也就是從第2147483648個數開始數列開始重複,即週期爲2147483647,N=2147483647,而該值爲int型的最大值2的31次方-1。由此看來在已知語言平臺,已知種子的狀況下,是能夠獲取僞隨機數的。開發者通常均習慣使用時間做爲種子,這更是把種子的範圍進一步縮小,爲攻擊者帶來便利。在一些安全性較高的應用場景中,會引入硬件來產生隨機數,例如採集噪聲、光照等來生成真正的隨機數。

寫在最後

本文僅是從宏觀層面大致介紹了加密技術的目的、算法分類和應用場景等,而加密技術所涉及的密碼學、認證技術等知識更是龐雜,有興趣的小夥伴能夠深刻研究。

相關文章
相關標籤/搜索