Hash (哈希或散列)算法它能將任意長度的二進制明文串映射爲較短的(一般是固定長度的)二進制串(Hash值),而且不一樣的明文很難映射爲相同的Hash值。算法
Hash (哈希或散列): 能將任意長度的二進制明文串映射爲較短的(一般是固定長度的)二進制串(Hash值),而且不一樣的明文很難映射爲相同的 Hash 值。
Hash 值在應用中又常被稱爲指紋或摘要(digest)。Hash 算法的核心思想也常常被應用到基於內容的編址或命名算法中數據庫
一個優秀的Hash算法將能實現以下功能:數組
衝突避免:有時候又稱爲「抗碰撞性」,分爲:安全
目前常見的 Hash 算法包括 MD5 和 SHA系列算法,MD5算法和SHA1已經被破解,通常推薦使用SHA2-256或更安全的算法網絡
Hash算法分爲:框架
數字摘要:對數字內容進行Hash運算,獲取惟一的摘要值來指代原始完整的數字內容。數字摘要是 Hash算法最重要的一個用途。利用Hash函數的抗碰撞性特色,數字摘要能夠解決確保內容未被篡改過的問題。函數
Hash 算法並非一種加密算法,不能用於對信息的保護。但Hash算法經常使用於對口令的保存上。例如用戶登陸網站,網站後臺保存口令的Hash值,每次登陸進行比對便可,即使數據庫泄露,也沒法從 Hash值還原口令,只能進行窮舉。性能
Hash攻擊: 因爲有時用戶設置口令的強度不夠,只是一些常見的簡單字符串,如password,123456等。有人專門蒐集了這些常見口令,計算對應的Hash值,製做成字典。這樣經過Hash值能夠快速反查到原始口令。這一類以空間換時間的攻擊方法包括字典攻擊和彩虹表攻擊(只保存一條Hash鏈的首尾值,相對字典攻擊能夠節省存儲空間)等。學習
Hash攻擊防範方法:爲了防範這一類攻擊,通常採用加鹽(salt)的方法。保存的不是口令明文的 Hash值,而是口令明文再加上一段隨機字符串(即「鹽」)以後的Hash值。Hash結果和「鹽」分別存放在不一樣的地方,這樣只要不是二者同時泄露,攻擊者就很難破解了。區塊鏈
加解密算法是密碼學的核心技術,可分爲兩大基本類型:
現代加解密系統的典型組件通常包括: 加解密算法、加密密鑰、解密密鑰。其中,加解密算法自身是固定不變的,而且通常是公開可見的。密鑰則是關鍵的信息,須要安全地保存起來,甚至經過特殊硬件進行保護。對同一種算法,密鑰須要按照特定算法每次加密前隨機生成,長度越長,則加密強度越大。加解密基本過程以下:
根據加解密過程當中使用的密鑰是否相同,算法能夠分爲對稱加密和非對稱加密,兩種模式適用於不一樣的需求,剛好造成互補,某些時候能夠組合使用,造成混合加密機制。
密碼學實現的安全每每是經過算法所依賴的數學問題來提供,而並不是經過對算法的實現過程進行保密。
對稱加密算法,加密和解密過程的密鑰是相同的。
對稱密碼從實現原理上能夠分爲兩種:
對稱加密算法適用於大量數據的加解密過程;不能用於簽名場景;而且每每須要提早分發好密鑰;
非對稱加密能夠很好的解決對稱加密中提早分發密鑰的問題。非對稱加密中,私鑰通常須要經過隨機數算法生成,公鑰能夠根據私鑰生成。公鑰通常公開,他人可獲取的;私鑰通常是我的持有,他人不能獲取
非對稱加密算法:
非對稱加密算法的安全性每每須要基於數學問題來保障,目前主要有基於大數質因子分解、離散對數、橢圓曲線等經典數學難題進行保護。表明算法包括: RSA、ElGamal、橢圓曲線(ECC)、SM2等系列算法。目前廣泛認爲RSA類算法可能在不遠的未來被破解,通常推薦可採用安全強度更高的橢圓曲線系列算法。
在非對稱加密中,因爲公鑰是公開能夠獲取的,所以任何人均可以給定明文,獲取對應的密文,這就帶來選擇明文攻擊的風險。 在已知明文攻擊、已知密文攻擊、選擇明文攻擊中,最有威脅的爲選擇明文攻擊。
爲了規避選擇明文攻擊這種風險,現有的非對稱加密算法都引入了必定的保護機制。對一樣的明文使用一樣密鑰進行屢次加密,獲得的結果徹底不一樣,這就避免了選擇明文攻擊的破壞。實現上有多種思路:
混合加密機制同時結合了對稱加密和非對稱加密的優勢。先用計算複雜度高的非對稱加密協商出一個臨時的對稱加密密鑰(也稱爲會話密鑰)而後雙方經過對稱加密算法傳遞的大量數據進行快速的加解密處理。
HTTPS 在傳統的HTTP層和TCP層之間經過引入 Transport Layer Security/Secure Socket Layer(TLS/SSL)加密層來實現可靠的傳輸
HTTPS 爲典型應用案例:
該過程的主要功能:在防止中間人竊聽和篡改的前提下完成會話密鑰的協商。
Diffie-Hellman(DH)密鑰交換協議是一個經典協議,使用該協議能夠在不安全信道完成對稱密鑰的協商,以便後續通訊採用對稱加密。
DH的缺點:
消息認證碼和數字簽名技術經過對消息的摘要進行加密,可用於消息放篡改和身份證實問題。
消息認證碼: 全稱是「基於Hash的消息認證碼」。消息認證碼基於對稱加密,能夠用於對消息完整性進行保護。
基本過程: 對某個消息利用提早共享的對稱密鑰和Hash算法進行加密處理,獲得HMAC值。該HMAC值持有方能夠證實本身擁有共享的對稱密鑰,而且也能夠利用HMAC確保消息內容未被篡改。
消息認證碼通常用於證實身份的場景, 主要問題是須要共享密鑰
數字簽名基於非對稱加密,既能夠用於證明某數字內容的完整性,又同時能夠確認來源。
典型的場景: A經過信道發給B一個文件(一份信息),B如何獲知收到的文件即爲A發出的原始版本?A能夠先對文件內容進行摘要,而後用本身的私鑰對摘要進行加密(簽名),以後同時將文件和簽名發給B。B收到文件和簽名後,用A的公鑰來解密簽名,獲得數字摘要,與收到文件進行摘要後的結果進行比對。若是一致,說明該文件確實是A發的(別人沒法擁有A的私鑰),而且文件內容沒有被修改過(摘要結果一致)
知名的數字簽名算法包括DSA 和 安全強度更高的ECSDA等。
除普通的數字簽名應用場景外,針對一些特定的安全需求,產生了一些特殊數字簽名技術:
數字簽名算法自身的安全性由數學問題進行保障,但在使用上,系統的安全性也十分關鍵。目前常見的數字簽名算法每每須要選取合適的隨機數做爲配置參數,配置參數不合理的使用或泄露都會形成安全漏洞,須要進行安全保護。
對於非對稱加密算法和數字簽名來講,很重要的一點就是公鑰的分發。但在傳輸過程當中,公鑰有沒有多是僞造的呢?傳輸過程當中有沒有可能被篡改?一旦公鑰出了問題,則整個創建在其上的安全體系的安全性將不復存在。
數字證書機制: 能夠證實所記錄信息的合法性,好比證實某個公鑰是某個實體(如組織或我的)的,而且確保一旦內容被篡改能被探測出來,從而實現對用戶公鑰的安全分發。
根據保護公鑰的用途,能夠分爲:
通常狀況下,證書須要由證書認證機構來進行簽發和背書
通常來講,一個數字證書內容可能包括基本數據(版本、序列號)、所簽名對象信息(簽名算法類型、簽發者信息、有效期、被簽發人、簽發的公開密鑰)、CA的數字簽名,等等。目前使用最普遍的標準爲ITU和ISO聯合制定的X.509的 v3 版本規範
證書的頒發者還須要對證書內容利用本身的私鑰添加簽名,以防止別人對證書內容進行篡改。
X.509規範中通常推薦使用PEM格式來存儲證書相關的文件。證書文件的文件名後綴通常爲.crt或.cer,對應私鑰文件的文件名後綴通常爲.key,證書請求文件的文件名後綴爲.csr。有的時候也統一用.pem做爲文件名後綴。此外還有DER格式,是採用二進制對證書進行保存,能夠與PEM格式互相轉換。
證書中記錄了大量信息,其中最重要的包括「簽發的公開密鑰」和「CA數字簽名」兩個信息。所以,只要使用CA的公鑰再次對着個證書進行簽名比對,就能證實某個實體的公鑰是不是合法的。
那麼怎麼證實用來驗證對實體證書進行簽名的CA公鑰自身是否合法呢?
證書做爲公鑰信任的基礎,對其生命週期進行安全管理十分關鍵。
在非對稱加密中,公鑰能夠經過證書機制來進行保護,但證書的生成、分發、撤銷等過程並無在X.509規範中進行定義。安全地管理和分發證書能夠遵循PKI(Public Key Infrastructure)體系來完成。PKI體系核心解決的是證書生命週期相關的認證和管理問題。PKI是創建在公私鑰基礎上實現安全可靠傳遞消息和身份確認的一個通用框架,並不表明某個特定的密碼學技術和流程。
PKI至少包括以下核心組件:
操做流程: 用戶經過RA登記申請證書,提供身份和認證信息等;CA審覈後完成證書的製造,頒發給用戶。用戶若是須要撤銷證書則須要再次向CA發出申請。
CA對用戶簽發證書其實是對某個用戶公鑰,使用CA的私鑰對其進行簽名。這樣任何人均可以用CA的公鑰對該證書進行合法性驗證。驗證成功則承認該證書中所提供的用戶公鑰內容,實現用戶公鑰的安全分發。
用戶證書的簽發能夠有兩種方式:
證書超過有效期後會做廢,用戶也能夠主動向CA申請撤銷某證書文件。
CA 沒法強制收回已經頒發出去的數字證書,所以爲了實現證書的做廢,每每還須要維護一個撤銷證書列表,用於記錄已經撤銷的證書序號。(因此第三方驗證某個證書時,第一步就是檢查該證書是否在撤銷列表中,若是存在則沒法驗證經過。若是不在則繼續後續驗證)
Merkle(默克爾)樹:又叫哈希樹,是一種典型的二叉樹結構,由一個根節點、一組中間節點和一組葉節點組成。區塊鏈出現以前,普遍用於文件系統和P2P系統中。
主要特色:
默克爾樹逐層記錄哈希值的特色,讓它具備了一些獨特的性質。例如,底層數據的任何變更,都會傳遞到其父節點,一層層沿着路徑一直到樹根。這意味着樹根的值實際上表明瞭對底層全部數據的「數字摘要」
默克爾樹的應用場景有以下:
布隆過濾器: 是一種基於Hash的高效查找結構,可以快速(常數時間內)回答「某個原始是否在一個集合內」的問題。
應用場景:布隆過濾器由於其高效性大量應用於網絡和安全領域,例如信息檢索、垃圾郵件規則、註冊管理等
基於Hash的快速查找算法: Hash能夠將任意內容映射到一個固定長度的字符串,並且不一樣內容映射到相同串的機率很小。所以,可構成以個很好的「內容——》索引」的生成關係。(內容Hash後爲索引經過索引可在數組中快速的查找當前內容)
基於Hash的快速查找算法的缺點:當映射後的值限制在必定範圍(如總數組的大小)內時,會發現 Hash 衝突的機率會變高,並且範 圍越小,衝突機率越大。不少時候,存儲系統的大小又不能無限擴展,這就形成算法效率的降低。爲了提升空間利用率,後來人們基於Hash算法思想設計出了布隆過濾器結構。
布隆過濾器: 採用多個Hash函數來提升空間利用率。對於同一個給定輸入來講,多個Hash函數計算出多個地址,分別在位串的這些地址上標記爲1。進行查找時,進行一樣的計算過程,並查看對應原始,若是都爲1,則說明較大機率是存在該輸入。
優勢:大大提升了空間利用率,可使用較少的空間來表示較大集合的存在關係。
總結: 不管是Hash算法,仍是布隆過濾器,基本思想都是基於內容的編址。Hash函數存在衝突,布隆過濾器也存在衝突。這就形成了兩種方法都存在誤報的狀況,但絕對不會漏報。
同態加密: 是一種特殊的加密方法,容許對密文進行處理獲得任然是加密的結果。即對密文直接進行處理,跟對明文進行處理後再對處理結果加密,獲得的結果相同。
優勢:同態加密能夠保證明現處理者沒法訪問到數據自身的信息
同態加密的兩個應用場景:
目前全同態的加密方案主要包括「基於理想個的方案」、「基於整數上近似GCD問題的方案」、「基於帶擾動學習問題的方案」。已知的同態加密技術每每須要較高的計算時間或存儲成本,相比傳統加密算法的性能和強度還有差距。
同態加密保護的是數據自己,而函數加密保護的是處理函數自己,即讓第三方看不處處理過程的前提下,對數據進行處理。
零知識證實: 證實者在不想驗證者提供任何額外信息的前提下,使驗證者相信某個論斷是正確的。
零知識證實至少要知足三個條件:
量子密碼學:隨着量子計算和量子通訊的研究而受到愈來愈多的關注,將會對已有的密碼學安全機制產生較大的影響。
即使存在理論上完美的技術,也不存在完美的系統!
我的理解:系統中有人的組成部分並非堅不可破的,由於人帶有社會屬性,經過社會學攻擊能夠輕易的攻破理論上完美的系統。