關於哈希算法,必須了解這三點

2020-12-22 布比區塊鏈

安全性是實現區塊鏈系統功能的基礎,也是目前阻礙區塊鏈應用推廣的因素之一。

密碼學是信息安全的基石,以很小的代價給信息提供一種強有力的安全保護,廣泛應用於政治、經濟、軍事、外交和情報等重要領域。

1 定義

哈希算法(Hash Algorithms)也稱為散列算法、雜湊算法或數字指紋,是可以將任意長度的消息壓縮為一個固定長度的消息的算法。

哈希算法是區塊鏈技術體系的重要組成部分,也是現代密碼學領域的重要分支,在身份認證、數字籤名等諸多領域有著廣泛的應用。

深刻理解哈希算法原理,對於區塊鏈系統的設計與實現有著至關重要的作用。

哈希算法可以在極短的時間內,將任意長度的二進位字符串映射為固定長度的二進位字符串,輸出值稱為哈希值(Hash Value)或者數字摘要(Digital Digest)。

一般而言,哈希函數的數學表達形式如下:

h=Hash(m)

式中,h為固定長度的輸出值;m為任意長度的輸入值。任意輸入值(Message)的二進位編碼經過哈希函數計算後,可以得出n比特的一個0、1字符串的哈希值,在不同算法中n的取值可能不同,例如128、160、192、256、384或512等。

哈希算法在區塊鏈技術中得到了廣泛的應用,各個區塊之間通過哈希指針連接形成區塊鏈,每個區塊的完整性檢驗將以哈希運算的方式進行。

密碼學哈希算法的主要特性就是單向性,即在算法上,只能從輸入值計算得到輸出值,而從輸出值計算得到輸入值是不可行的。

因為哈希算法的輸出值是固定長度的,所以哈希算法存在一個碰撞的問題,即哈希算法的輸出值的長度為n比特,那麼,任取2n+1個不同的輸入值,就一定存在兩個不同的輸入值會得到相同的輸出值。因此,在一定數量的輸入值情況下,輸出值越長的哈希算法,其碰撞的概率會越小。

2 常用的哈希算法

常用的哈希算法包括MD系列算法和SHA系列算法,其中MD系列算法有MD2、MD4、MD5、RIPEMD算法等,SHA系列算法有SHA0、SHA1、SHA2、SHA3算法等。

在哈希算法中,MD5算法和SHA1算法是應用最廣泛的,兩者的原理相差不大,但MD5算法加密後的輸出值的長度為128比特,SHA1算法加密後的輸出值的長度為160比特。

在2004年的國際密碼學大會上,王小雲教授介紹了對一系列哈希算法尋找實際碰撞的方法,並當場破解了包括MD4、MD5、HAVAL128算法在內的多種哈希算法。2005年,王小雲教授進一步優化了方案,對SHA0、SHA1算法也成功地給出了碰撞攻擊。

這些攻擊技術對當時哈希算法的安全性造成了很大威脅,但同時也促進了新的哈希算法的設計與研究。

1. MD系列算法

MD系列算法是一個應用非常廣泛的算法集,最出名的MD5算法由RSA公司的羅納德·林·李維斯特(Ronald L. Rivest)在1992年提出,目前被廣泛應用於數據完整性校驗、消息摘要、消息認證等。MD2算法的運算速度較慢但相對安全,MD4算法的運算速度很快,但安全性下降,MD5算法比MD4算法更安全、運算速度更快。

雖然這些算法的安全性逐漸提高,但均被王小雲教授證明是不夠安全的。MD5算法被破解後,Ronald L. Rivest在2008年提出了更完善的MD6算法,但MD6算法並未得到廣泛使用。

MD5算法的設計採用了密碼學領域的Merkle-Damgard構造法,這是一類採用抗碰撞的單向壓縮函數來構造哈希函數的通用方法。

MD5算法的基本原理是將數據信息壓縮成128比特來作為信息摘要,首先將數據填充至512比特的整數倍,並將填充後的數據進行分組,然後將每一分組劃分為16個32比特的子分組,該子分組經過特定算法計算後,輸出結果是4個32比特的分組數據,最後將這4個32比特的分組數據級聯,生成一個128比特的散列值,即最終計算的結果。

2. SHA系列算法

SHA(Secure Hash Algorithm,安全哈希算法)是美國國家標準技術研究所發布的國家標準,規定了SHA1、SHA224、SHA256、SHA384和SHA512單向哈希算法。

SHA1、SHA224和SHA256算法適用於長度不超過264比特的消息。SHA384和SHA512算法適用於長度不超過2128比特的消息。SHA系列算法主要適用於數字籤名標準(Digital Signature Standard,DSS)裡面定義的數字籤名算法(Digital Signature Algorithm,DSA)。

對於長度小於264比特的消息,SHA1算法會產生一個160比特的消息摘要。然而,SHA1算法已被證明不具備「強抗碰撞性」。

2005年,王小雲教授破解了SHA1算法,證明了160比特的SHA1算法只需要大約269次計算就可以找到碰撞。

為了提高安全性,美國國家標準與技術研究院(National Institute of Standards and Technology,NIST)陸續發布了SHA256、SHA384、SHA512以及SHA224算法,統稱為SHA2算法。

這些算法都是按照輸出哈希值的長度命名的,例如SHA256算法可將數據轉換成長度為256比特的哈希值。雖然這些算法的設計原理與SHA1算法相似,但是至今尚未出現針對SHA2算法的有效攻擊。

因此,比特幣在設計之初即選擇採用了當時被公認為最安全和最先進的SHA256算法,除了在生成比特幣地址的流程中有一個環節採用了RIPEMD160算法,其他需要做哈希運算的地方均採用了SHA256算法或雙重SHA256算法,例如計算區塊ID、計算交易ID、創建地址、PoW共識過程等。

3.SHA256算法

在比特幣和以太坊的區塊鏈系統中,SHA256算法是工作量證明算法的基礎,具體的工作量證明算法在後面的章節中詳細闡述。在比特幣系統中,工作量證明算法只計算一次SHA256算法,而在以太坊系統中,工作量證明算法則嵌套計算兩次SHA256算法。

常用的哈希算法的過程參數見下表:

內部狀態值的長度直接影響最終的輸出值的長度,隨著哈希算法不斷演進,內部狀態值的長度不斷增加,對應的輸出值的長度也在不斷增加。只有不斷增加輸出值的長度,才能在算法上增加破解的難度。

隨著對哈希算法不斷深入地研究,慢慢會找到一些更加低廉的破解方案,這也促使我們不斷改進哈希算法的內部細節。

我們已經發現了降低破解MD5、SHA1算法難度的方案,所以目前MD5算法與SHA1算法的安全性大大降低了,已經不再推薦使用,現在更多的是用在文件的校驗方面。

目前,SHA256算法還是比較安全的,但是也不排除在不遠的將來,我們會發現新的破解方案。

相關焦點

  • 什麼是哈希算法
    根據維基百科的定義,哈希函數要做的事情是給一個任意大小的數據生成出一個固定長度的數據,作為它的映射。所謂映射就是一一對應。一個可靠的哈希算法要滿足三點。例如朋友給我傳遞一份數據,傳完之後,我有一份,他手裡也有一份,如果兩份數據的哈希值是一樣的,那麼這兩份數據的內容就是一樣的,或者說可以認為傳遞過程中數據沒有損壞,我手裡拿到的數據是完整的。
  • 五分鐘帶你了解哈希算法
    這意味著如果有攻擊者能夠根據需求創建這種collisions,那麼他就可以讓欺詐文件或者數據看起來像正確的,合適的哈希,並且冒充合法。優質哈希功能的目標是讓攻擊者很難找到,獲得輸入數據的方法。計算哈希不應該太簡單,因為這會讓對於攻擊者來說,計算collisions也變得很容易。哈希算法需要對「預攻擊」有抵抗性。
  • 10分鐘了解一致性哈希算法,全網(小區區域網)(建議收藏)
    什麼是哈希數據結構中我們學習過哈希表也稱為散列表,我們來回顧下散列表的定義。散列表,是根據鍵直接訪問在指定儲存位置數據的數據結構。通過計算一個關於鍵的函數也稱為哈希函數,將所需查詢的數據映射到表中一個位置來訪問記錄,加快查找速度。
  • 哈希算法現狀——原因、方法及未來
    新手在了解區塊鏈的時候經常會接觸到哈希(hash)和哈希算法(hashing algorithm)這樣的概念,它們在安全方面可以說是無處不在。通過P2P運行像比特幣,以太坊之類有眾多節點的去中心化網絡需要去信任機制和驗證的高效性。這就是說,這些系統需要想辦法將信息以一種高效而簡潔的方式編碼,並允許其參與者能夠安全而快速的進行驗證。
  • 和你聊聊哈希算法
    和你聊聊哈希算法1.1 引言哈希算法又稱散列函數算法,是一種查找算法,應該說哈希算法是最快的查找算法,沒有之一。對於查找問題,哈希算法一直是首選算法。那麼,為什麼名字起的這麼「嘻哈」的算法會如此強大,本文將為你揭開謎底。
  • 圖解什麼是一致性哈希算法
    昨晚在B站看了幾個長視頻,導致2點才睡覺,早上一覺醒來已經10點了。在這裡溫馨提示各位盆友們,雖然我們都是年輕人,但還是要規律作息,早睡早起。一致性,咱懂哈希算法,咱也懂一致性+哈希算法  什麼鬼?一致性哈希修正了CARP使用的簡單哈希算法帶來的問題,使得DHT可以在P2P環境中真正得到應用。一起看看Karger的一致性哈希算法的基本原理以及如何應對擴縮容問題的。
  • 理解數字籤名、加密通信的關鍵:哈希算法
    根據維基百科的定義,哈希函數要做的事情是給一個任意大小的數據生成出一個固定長度的數據,作為它的映射。所謂映射就是一一對應。一個可靠的哈希算法要滿足三點。  例如朋友給我傳遞一份數據,傳完之後,我有一份,他手裡也有一份,如果兩份數據的哈希值是一樣的,那麼這兩份數據的內容就是一樣的,或者說可以認為傳遞過程中數據沒有損壞,我手裡拿到的數據是完整的。  所以說,哈希函數的基本作用就是給大數據算出一個摘要性的長度固定的字符串,也就是所謂的哈希。哈希的作用主要是進行完整性校驗。
  • 理解一致性哈希算法(consistent hashing)
    一致性哈希算法在1997年由麻省理工學院提出的一種分布式哈希(DHT)實現算法,設計目標是為了解決網際網路中的熱點(Hot spot)問題,初衷和
  • 什麼是一致性哈希算法
    這裡主要記錄一致性Hash算法如何將數據分配到各個機器中去。2,衡量一致性哈希算法好處的四個標準①平衡性。平衡性是指哈希的結果能夠儘可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。②單調性。
  • 一文搞懂負載均衡中的一致性哈希算法
    友情提示:閱讀本文前,最好對一致性哈希算法有所了解,例如你最好聽過一致性哈希環這個概念,我會在基本概念上縮短篇幅。一致性哈希負載均衡介紹負載均衡這個概念可以抽象為:從 n 個候選伺服器中選擇一個進行通信的過程。負載均衡算法有多種多樣的實現方式:隨機、輪詢、最小負載優先等,其中也包括了今天的主角:一致性哈希負載均衡。
  • Comunion 區塊鏈深度學習系列|哈希算法的應用
    1.版本號和前一個區塊哈希是固定的,以比特幣為例,假設當前比特幣區塊高度為N,如果某人想挖接下來N+1區塊的話,那麼這個時候版本號必須是固定的,前一個區塊的哈希必須也是固定的。因為在不存在分叉的情況下,當前區塊包含上一個區塊的哈希值;也就是N-1區塊的哈希值加上N區塊數據算出N區塊哈希值,然後將N區塊哈希值當成N+1區塊的的前一區塊哈希值。
  • 哈希算法、愛因斯坦求和約定,這是2020年的注意力機制
    哈希算法、Head 之間的信息交流都需要考慮,顯存佔用、表徵能力都不能忽視。注意力機制是非常優美而神奇的機制,在神經網絡「信息過載」的今天,讓 NN 學會只關注特定的部分,無疑會大幅度提升任務的效果與效率。藉助注意力機制,神經機器翻譯、預訓練語言模型等任務獲得了前所未有的提升。
  • 關於哈希(散列)函數你應該知道的東西 | Linux 中國
    這聽起來很神秘、很專業,甚至可能有點乏味,但是, 在這裡,關於什麼是哈希函數以及它們為什麼對你很重要,我會作出一個簡潔的解釋。加密哈希函數,比如 SHA-256 或者 MD5,接受一組二進位數據(通常是字節)作為輸入,並且對每個可能的輸入集給出一個希望唯一(hopefully unique)的輸出。
  • 是哈希不是嘻哈,你真的了解散列嗎?理解Python中可哈希對象概念
    可哈希對象我們看一下對於hash的解釋:把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。
  • Hash(哈希)算法科普
    單向散列函數算法也稱Hash(哈希)算法,是一種將任意長度的消息壓縮到某一固定長度(消息摘要)的函數(該過程不可逆)。
  • 面試時遇到一致性哈希算法這樣回答會讓面試官眼前一亮
    面試中一致性哈希算法被問到的概率非常大,本文將從如下三個方面探探一致性哈希算法,讓大家輕鬆應對面試,並且說出與眾不同的答案。在分布緩存領域,對數據存在新增與查詢,即數據通過路由算法存儲在某一個節點後,查詢時需要儘量路由到同一個節點,否則會出現查詢未命中緩存的情況,這也是與分布式服務調用領域的負載算法一個不同點。
  • Ceph殺手鐧CRUSH和主流分布式存儲一致性哈希算法
    在中心化的分布式存儲架構中,一般採用Master節點來存儲數據的具體位置信息,這樣會有單點故障(SPOF)。而Ceph採用CRUSH算法來高效的計算關於數據位置的信息,節點都是對稱結構。Crush 核心作用:1)可以均衡數據到集群中的各個OSD節點。2)當增加或減少機器數量,可以大大減少Ceph集群數據遷移量。
  • .NET 6 中哈希算法的簡化用法
    .NET 6 中哈希算法的簡化用法Intro微軟在 .NET 6 中引入一些更簡單的 API 來使用 HMAC 哈希算法(MD5/SHA1/SHA256/SHA384/SHA512)微軟的叫法叫做 HMAC One-Shoot method, HMAC 算法在普通的哈希算法基礎上增加了一個
  • AITD小課堂第十二課:哈希算法是什麼?非對稱加密是什麼?
    哈希算法是什麼? 區塊鏈的四大核心技術分別是密碼學、分布式帳本、共識機制以及智能合約。而密碼學作為其中最重要的一部分,可以說是區塊鏈的基石,而其他技術是以密碼學為地基,才能搭建出區塊鏈這座高樓大廈。
  • 哈希函數和哈希表
    其核心就是哈希函數和哈希表的應用!哈希函數哈希函數又稱為散列函數,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。