密碼學相關安全技術在整個信息技術領域的重要地位無需多言。若是沒有現代密碼學和信息安全的研究成果,人類社會根本沒法進入信息時代。git
實際上,密碼學和安全領域所涉及的知識體系十分繁雜,下邊將介紹密碼學中的部分基礎知識,包括:Hash算法和數字摘要、加密算法等理論知識。算法
Hash(稱爲哈希或散列)算法是很是基礎也很是重要的計算機算法,它能將任意長度的二進制明文串映射爲較短的(一般爲固定長度的)二進制串(Hash值),而且不一樣的明文很難映射爲相同的Hash值。數據庫
對於一個優秀的Hash算法應當實現如下四點特性:正向快速、逆向困難、輸入敏感及衝突避免。同時在更多的場景下,也每每會要求算法對於任意長度的輸入內容,能夠輸出定長的Hash值結果。數組
Hash算法在性能方面通常都是計算敏感型。這意味着計算是瓶頸,主頻越高的CPUHash算法運行速度就越快。所以能夠經過硬件加速來提升Hash計算的吞吐量,如採用FPGA來計算MD5值。也有一些Hash算法不是計算敏感型的。如scrypt算法,計算過程須要大量的內存資源,不能經過簡單的增長CPU來得到Hash性能的提升。瀏覽器
顧名思義,數字摘要是對數字內容進行Hash運算,獲取惟一的摘要值來指代原始完整的數字內容。數字摘要是Hash算法的最重要的一個用途。利用Hash函數的抗碰撞性特色,數字摘要能夠解決確保內容未被篡改過的問題。安全
在實際應用中咱們能夠在提供下載服務的網站上附上源文件的MD5值等Hash結果,用戶下載文件後能夠經過計算文件的MD5值來驗證文件的完整性。服務器
Hash算法並非一種加密算法,不能用於對信息的保護。但Hash算法經常使用於對口令的保存上。例如用戶登陸網站須要經過用戶名和密碼來進行驗證。若是網站後臺直接保存用戶的口令明文,一旦數據庫發生泄漏後果不堪設想。大量用戶傾向與在多個網站選用相同或相關聯的口令。網絡
利用Hash的特性,後臺能夠僅保存口令的Hash值,這樣每次比對Hash值一致,則說明輸入的口令正確。即使數據庫泄漏了,也沒法從Hash值還原口令,只能經過窮舉測試。ide
固然,咱們同時也要意識到這種方法的缺陷,並在實際項目中儘可能避免。若用戶設置的口令強度不夠,只是一些常見的簡單字符串,例如password,123456等。有人專門蒐集了這些常見口令,計算對應的Hash值,製做成字典。這樣經過Hash值能夠快速反查到原始口令。這一類型以空間換時間的攻擊方式包括字典攻擊和彩虹表攻擊(只保存一條Hash鏈的首尾值,相對字典攻擊節省存儲空間)等。函數
爲了防範這一類攻擊,通常採用加鹽(salt)的方法。保存的不是口令明文的Hash值而是口令明文再加上一段隨機字符串(即「鹽」)以後的Hash值。Hash結果和「鹽」分別存放在不一樣的地方,這樣只要不是二者同時泄漏,攻擊者就很難破解了。
加解密算法是密碼學的核心技術,從設計理念上能夠分爲量大基本類型,即對稱加密與非對稱加密。對稱加密是一種加解密的密鑰相同,計算效率高,加密強度高的加密算法。須要提早共享密鑰,所以相對容易泄漏(好比:傳輸過程當中被竊聽)。所以對於對稱加密在分發密鑰時,須要藉助Diffie-Hellman協議或非對稱加密方式來實現。其表明算法有:DES、3DES、AES、IDEA等;非對稱加密是一種加解密的密鑰不相關,無需提早共享密鑰的加密算法,可是相對來講其計算效率低,同時仍然存在中間人攻擊可能,典型表明算法有:RSA、ElGamal和橢圓曲線系列算法(表明應用:比特幣)。
對稱加密從實現原理上能夠分爲兩種:分組密碼和序列密碼。前者將明文切分爲定長數據做爲基本加密單位,應用最爲普遍。後者則每次只對一個字節或字符進行加密處理,且密碼不斷變化,只用在一些特定領域如數字媒介的加密等。
對稱加密算法適用於大量數據的加解密過程;不能用於簽名場景;而且每每須要提早分發好密鑰。
非對稱加密是現代密碼學歷史上一項偉大的發明,能夠很好地解決對稱加密中提早分發密鑰的問題。在非對稱加密算法中,加密密鑰和解密密鑰是不一樣的,分爲公鑰和私鑰。私鑰通常須要經過隨機數算法生成,公鑰能夠根據私鑰生成。公鑰通常是公開的,他人能夠獲取的;私鑰通常是我的持有,他人不能獲取。
非對稱加密算法的優勢是公私鑰分開,不安全的通道也可使用。可是在處理速度(特別是生成密鑰和解密過程)每每比較慢,通常比對稱加解密算法慢2~3個數量級;同時加密強度也每每不如對稱加密算法。
現代加解密系統的典型組件通常包括:加解密算法、加密密鑰、解密密鑰。其中,加解密算法自生是固定不變的,而且通常是公開可見的;密鑰則是最關鍵的信息,須要安全地保存起來,甚至經過特殊硬件進行保護。通常來講,對同一種算法,密鑰須要按照特定算法每次加密前隨機生成,長度越長,則加密強度越大。其基本過程如圖1.3.1所示:
圖1.3.1 加解密過程圖解
加密過程當中,經過加密算法和加密密鑰,對明文進行加密,得到密文。
解密過程當中,經過解密算法和解密密鑰,對密文進行解密,得到明文。
根據加解密過程當中所使用的密鑰是否相同,算法能夠分爲對稱加密(又稱公共密鑰加密)和非對稱加密(又稱公鑰加密)。兩種模式適用於不一樣的需求,剛好造成互補。某些時候能夠組合使用,造成混合加密機制。
並不是全部加密算法的安全性均可以從數學上獲得證實。公認的高強度的加密算法和實現每每通過長時間各方面充分實踐論證後,才被你們所承認,但也不表明其絕對不存在漏洞。自行設計和發明未通過大規模驗證的加密算法是一種不太明智的行爲。即便不公開算法加密過程,也很容易被攻破,沒法在安全性上獲得保障。
實際上,密碼學實現的安全每每是經過算法所依賴的數學問題來提供,而並不是經過對算法的實現過程進行保密。
咱們已經詳細的瞭解了加密算法中的兩大分類:對稱加密算法與非對稱加密算法。同時對其加解密的過程有了詳細的瞭解。下面咱們開始討論加密算法在實際操做中可能碰見的問題及其在現實中已經成熟應用的產品。
在非對稱加密中,因爲公鑰是公開能夠獲取的,所以任何人均可以給定明文,獲取對應的密文,這就帶來選擇明文攻擊的風險(判斷加密內容是否爲準備好的明文)。
爲了規避這種風險,現有的非對稱加密算法(如RSA、ECC)都引入了必定的保護機制。對一樣的明文使用一樣的密鑰進行屢次加密,獲得的結果徹底不一樣,這就避免了選擇明文攻擊的破壞。
在實現上能夠有多種思路。一種是對明文先進行變形,添加隨機的字符串或標記,再對添加後結果進行處理。另外一種是先用隨機生成的臨時密鑰對明文進行對稱加密,而後再對對稱密鑰進行加密,即混合利用多種加密機制。
混合加密機制同時結合了對稱加密和非對稱加密的優勢。
先用計算複雜度高的非對稱加密協商出一個臨時的對稱加密密鑰(也成爲會話密鑰,通常相對所加密內容來講要短得多),而後雙方再經過對稱加密算法傳遞大量的數據進行快速的加解密處理。
典型的應用案例是如今經常使用的HTTPS協議。HTTPS協議正在替換掉傳統的不安全的HTTP協議成爲最廣泛的Web通訊協議。
HTTPS在傳統的HTTP層和TCP層之間經過引入Transport Layer Security/Secure SocketLayer(TLS/SSL)加密層來實現可靠的傳輸。
採用HTTPS創建安全鏈接(TLS握手協商過程)的基本步驟如圖2.1所示:
圖2.1 HTTPS創建鏈接過程圖例
1)客戶端瀏覽器發送信息到服務器,包括隨機數R一、支持的加密算法類型、協議版本、壓縮算法等。注意該過程爲明文。
2)服務端返回信息,包括隨機數R二、選定加密算法類型、協議版本以及服務器證書。注意該過程爲明文。
3)瀏覽器檢查帶有該網站公鑰的證書。該證書須要由第三方CA來簽發,瀏覽器和操做系統會預置權威CA的根證書。若是證書被篡改做假(中間人攻擊),很容易經過CA的證書驗證出來。
4)若是證書沒問題,則客戶端用服務端證書中的公鑰加密隨機數R3(又叫PreMasterSecret),發送給服務器。此時,只有客戶端和服務器都擁有R一、R2和R3信息,基於隨機數R一、R2和R3,雙方經過僞隨機數函數來生成共同的對稱會話密鑰MasterSecret。
5)後續客戶端和服務端的通訊都經過對稱加密算法(如ASE)進行保護。
能夠看出,該過程主要功能是在防止中間人竊聽和篡改的前提下完成會話密鑰的協商。爲了保障前向安全性,TLS對每一個會話鏈接均可以生成不一樣的密鑰,避免某次會話密鑰泄漏以後影響了其餘會話鏈接的安全性。須要注意,TLS協商過程支持加密算法方案較多,要合理地選擇安全強度高的算法,如DHE-RSA、ECDHE-RSA和ECDHE-ECDSA。
Diffie-Hellman(DH)密鑰交換協議是一個經典的協議。使用該協議能夠在不安全信道完成對密鑰的協商,以便後續通訊採用對稱加密。
DH協議的設計基於離散對數問題。離散對數問題是指對於一個很大的素數p,已知g爲p的模循環羣的原根,給定任意x,求解X=g^x mod p是能夠很快獲取的。但在p、g和X已知的前提下,逆向求解x目前沒有多項式時間實現的算法。該問題同時也是ECC類加密算法的基礎。
DH協議的基本交換過程以下:
1) Alice和Bod兩人協商密鑰,先公開商定p,g;
2) Alice自行選取私密的整數x,計算X=g^x mod p,發送X給Bob;
3) Bob自行選取私密的整數y,計算Y=g^y mod p,發送Y給Alice;
4) Alice根據x和Y,求解共同密鑰Z_A=Y^x mod p;
5) Bob根據X和y,求解共同密鑰Z_B=X^Y mod p;
實際上,Alice和Bob計算出來的結果將徹底相同,由於在mod p的前提下,Y^x=(g^y)^x=g^(xy)=(g^x)^y=X^y。而信道監聽者在已知p、g、X、Y的前提下,沒法求得Z。
消息認證碼和數字簽名技術經過對消息的摘要進行加密,可用於消息防篡改和身份證實問題。
消息認證碼全稱是「基於Hash的消息認證碼」。消息驗證碼基於對稱加密,能夠用於對消息完整性進行保護。
基本過程爲:對某個消息利用提早共享的對稱密鑰和Hash算法進行加密處理,獲得HMAC值。該HMAC值持有方可證實本身擁有共享的對稱密鑰,而且也能夠利用HMAC確保消息內容未被篡改。
典型的HMAC(K,H,Message)算法包括三個因素,K爲提早共享的對稱密鑰,H爲提早商定的Hash算法(通常爲公認的經典算法如SHA-256),Message爲要處理的消息內容。若是不知道K或H的任何一個,則沒法根據Message獲得正確的HMAC值。
消息認證碼通常用於證實身份的場景。假定信道是安全的,只要對方可以將本身加密後的消息正確的解密而且發送過來,就能夠證實對方的身份。
消息認證碼使用過程當中主要問題是須要共享密鑰。當密鑰可能被多方擁有的場景下,沒法證實消息來自某個確切的身份。反之,若是採用非對稱加密方式,則能夠追溯到來源身份,即數字簽名。
與在紙質合同上簽名確認合同內容和身份證實相似,數字簽名基於非對稱加密,既能夠用於證明某數字內容的完整性,又同時能夠確認來源(或不可抵賴)。
一個典型的場景是,Alice經過信道發給Bob一個文件(一份信息),Bob如何獲知所收到的的文件即爲Alice發出的原始版本?Alice能夠先對文件內容進行摘要,而後用本身的私鑰對摘要進行加密(簽名),以後同時將文件和簽名都發給Bob。Bob收到文件和簽名後,用Alice的公鑰來解密簽名獲得數字摘要,與收到文件進行摘要後的結果進行比對。若是一致,說明文件確實是Alice發過來的(別人沒法擁有Alice的私鑰,不然解密後的結果會有不一樣),而且文件內容沒有被修改過(摘要結果一致)。若比對不一致,則多是文件被篡改或者文件不是Alice發送過來的。
知名的數字簽名算法包括DSA和安全強度更高的ECSDA等。
除普通的數字簽名應用場景外,針對一些特定的安全需求,產生了一些特殊數字簽名技術,包括盲簽名、多重簽名、羣簽名與環簽名等。
盲簽名中,簽名者須要在沒法看到原始內容的前提下對信息進行簽名。能夠實現對所簽名內容的保護,防止簽名者看到原始內容;另外一方面,盲簽名還能夠實現防止追蹤,簽名者沒法將簽名內容和簽名結果進行對應。典型的實現包括RSA盲簽名算法等。
多重簽名即n個簽名者中,收集到至少m個的簽名,即認爲合法。其中n是提供的公鑰個數,m是須要匹配公鑰的最少簽名個數。多重簽名能夠有效地被應用在多人投票共同決策的場景中。例如雙方進行協商,第三方做爲審覈方。三方中任何兩方達成一致便可完成協商。
羣簽名即某個羣組內一個成員能夠表明羣組進行匿名簽名。簽名能夠驗證來自於該羣組,卻沒法準確追蹤到簽名的是哪一個成員。其中須要存在一個羣管理員來添加新的羣成員,所以存在羣管理員可能追蹤到簽名羣成員身份的風險。
環簽名屬於一種簡化的羣簽名。簽名者首先選定一個臨時的簽名者集合,集合中包括簽名者自生。而後簽名者利用本身的私鑰和簽名集合中其餘人的公鑰就能夠獨立的產生簽名,而無需他人的幫助。簽名者集合中的其餘成員可能並不知道本身被包含在簽名中。環簽名在保護匿名性方面有不少的用途。
對於非對稱加密算法和數字簽名來講,很重要的一點就是公鑰的分發。理論上任何人能夠公開獲取到對方的公鑰。然而這個公鑰有沒有多是僞造的呢?傳輸過程當中有沒有可能被篡改掉呢?一旦公鑰自生出了問題,則整個創建在其上的安全體系的安全性將不復存在。
數字證書機制正是爲了解決這個問題,它像平常生活中的一個證書同樣,能夠證實所記錄信息的合法性。好比證實某個公鑰是某個實體(如組織或我的)的,而且確保一旦內容被篡改能被探測出來,從而實現對用戶公鑰的安全分發。
根據所保護公鑰的用途,能夠分爲加密數字證書和簽名驗證數字證書。前者每每用於保護用於加密信息的公鑰;後者則保護用於進行解密簽名進行省份驗證的公鑰。兩種類型的公鑰也能夠同時放在同一證書中。
通常狀況下,證書須要由證書認證機構來進行簽發和背書。用戶也能夠自行搭建本地CA系統,在私有網絡中進行使用。
Merkle(默克爾)樹,又叫哈希樹,是一種典型的二叉樹結構,由一個根節點、一組中間節點和一組葉節點組成。普遍運用於P2P系統中,以下圖2.2所示:
圖2.2 Merkle樹結構圖
其主要特色以下:
1)最下面的葉子節點包含儲存數據或其哈希值;
2)非葉子節點(包括中間節點和根節點)都是它兩個孩子節點內容的哈希值;
進一步地,默克爾樹能夠推廣到多叉樹的情形,此時非葉子節點的內容爲它全部的孩子節點內容的哈希值。
分層次的哈希值記錄的特色,讓默克爾樹具備了一些獨特的性質。例如底層任何數據的變更都會傳遞到根節點。這意味着樹根實際上表明瞭對底層全部數據的「數字摘要」。其主要應用場景有:
一、 快速比較大量數據
對每組數據排序後構建默克爾樹結構。當兩個默克爾樹根相同時,則意味着兩組數據必然相同。不然必然存在不一樣。
二、 快速定位修改
一旦發現某個節點如Root的數值發生變化,沿着根節點出發向着差別路徑尋找,最多經過O(lgn)時間便可快速定位到實際發生改變的數據塊
三、 零知識證實
以上圖爲例,如何向他人證實擁有的某組數據(D0……D3)中包括給定某個內容D0而不暴露其餘任何內容。
很簡單,構造如圖所示的一個默克爾樹,公佈N一、N五、Root。D0擁有者經過驗證生成的Root是否跟提供的值一致,便可很容易檢測D0存在。整個驗證過程當中驗證者沒法獲知其餘內容。
布隆過濾器是一種基於Hash的高效查找結構,可以快速(常數時間內)回答「某個元素是否在一個集合內」的問題。
布隆過濾器由於其高效性大量應用於網絡和安全領域,例如信息檢索(BigTable和HBase)、垃圾郵件規則、註冊管理等。
在布隆過濾器值錢,先來看基於Hash的快速查找算法。在簽名的講解中咱們提到,Hash能夠將任意內容映射到一個固定長度字符串,並且不一樣內容映射到相同串的機率很低。所以,這就構成了一個很好的「內容—>索引」的生成關係。
試想,若是給定一個內容和儲存數組,經過構造Hash函數,讓映射後的Hash值總不超過數組的大小,則能夠實現快速的基於內容的查找。可是使人遺憾的是,當映射後的值限制在必定範圍(如總數組的大小)內時,會發現Hash衝突的機率會變高,並且範圍越小,衝突機率越大。不少時候,存儲系統的大小又不能無限擴張,這就形成算法效率的降低。爲了提升空間利用率,後來人們基於Hash算法的思想設計出布隆過濾器結構。
布隆過濾器採用多個Hash函數來提升空間利用率。對同一個給定輸入來講,多個Hash函數計算出多個地址,分別在位串的這些地址上標記爲1.進行查找時,進行一樣的計算過程,並查看對應元素,若是都爲1,則說明較大機率是存在該輸入,如圖2.3所示。
圖2.3 布隆過濾器示例圖
布隆過濾器相對單個Hash算法查找,大大提升了空間利用率,可使用較少的空間來表示較大集合的存在關係。
實際上,不管是Hash算法,仍是布隆過濾器,基本思想是一致的,都是基於內容的編址。Hash函數存在衝突,布隆過濾器也存在衝突。這就形成了兩種方法都存在着誤報的狀況,但絕對不會漏報。
布隆過濾器在應用中誤報率每每很低,例如,在使用七個不一樣Hash函數的狀況下,記錄100萬個數據,採用2M大小的位串,總體的誤判率將低於1%,而傳統的Hash查找算法誤報率接近10%。
同態加密是一種特殊的加密算法,運行對密文進行處理獲得仍然是加密的結果。即對密文直接進行處理,跟對明文進行處理後再對處理結果加密,獲得的結果相同。從抽象代數的角度講,保存了同態性。
同態加密能夠保證明現處理者沒法訪問到數據自身的信息。若是定義一個運算符π,對加密算法E和解密算法D,知足:
E(XπY)=E(X)πE(Y)
則意味着對於該運算知足同態性。
同態性來自代數領域,通常包括四種類型:加法同態、乘法同態、減法同態和除法同態,則意味着是代數同態,稱爲全同態,同時知足四種同態性,則稱爲算數同態。
對於計算機操做來說,實現了全同態意味着對於全部處理均可以實現同態性。只能實現部分特定操做的同態性,成爲特定同態。
同態加密在雲計算和大數據的時代意義十分重大。目前雖然雲計算帶來了包括低成本、高性能和便捷性等優點,但從安全角度講,用戶還不敢將敏感信息直接放到第三方雲上進行處理。若是有了比較實用的同態加密技術,則你們就能夠放心地使用各類雲服務了,同時各類數據分析過程也不會泄漏用戶隱私。加密後的數據在第三方服務處理後獲得加密後的結果,這個結果只有用戶自身能夠進行解密,這個過程第三方平臺沒法獲知任何有效的數據信息。
另外一方面,對於區塊鏈技術,同態加密也是很好的互補。使用同態加密技術,運行在區塊鏈上的智能合約能夠處理密文,而沒法獲知真實數據,極大地提升了隱私安全性。
目前全同態加密方案主要包括三種類型:基於理想格的方案、基於整數上近似GCD問題的方案、基於帶擾動學習問題的方案(接近實時多方安全計算需求)。
零知識證實是這樣一個過程,證實者在不向驗證者提供任何額外信息的前提下,使驗證者相信某個論斷是正確的。
目前認爲零知識證實通常至少應當知足三個條件:
完整性:真實的證實可讓驗證者成功驗證;
可靠性:虛假的證實沒法讓驗證者保證經過驗證,但容許存在小几率的例外;
零知識:若是獲得證實,沒法從證實過程當中獲知除了所證實信息以外的任何信息。
[1]區塊鏈技術指南[EB/OL]. https://www.gitbook.com/book/yeasy/blockchain_guide/details.
[2]陳暄.雲計算下的一種數據加密存儲算法的研究[J].電腦知識與技術,2017,13(14):56-58+69.
[3] 吳文玲.認證加密算法研究進展[J].密碼學報,2018,5(01):70-82.
[4] 韓芳.雲計算環境下混合加密算法研究[J].網絡安全技術與應用,2015(05):140-141.