哈希算法現狀——原因、方法及未來

2021-02-13 藍狐筆記

前言:哈希算法對於保證區塊鏈網絡安全很重要。為了減少哈希衝突可能性,要麼提高哈希內部操作的複雜性,要麼提高哈希輸出的長度,寄希望於攻擊者計算速度不夠快。本文分析了哈希算法的歷史,原理和未來,對於我們理解區塊鏈的安全問題很有幫助。本文作者是Raul Jordan,文章來源於medium.com,由藍狐筆記社群「李熙和」翻譯。

 

新手在了解區塊鏈的時候經常會接觸到哈希(hash)和哈希算法(hashing algorithm)這樣的概念,它們在安全方面可以說是無處不在。通過P2P運行像比特幣,以太坊之類有眾多節點的去中心化網絡需要去信任機制和驗證的高效性。

這就是說,這些系統需要想辦法將信息以一種高效而簡潔的方式編碼,並允許其參與者能夠安全而快速的進行驗證。

 

比特幣和以太坊所涉及的主要概念是「區塊」,這是一種包含交易記錄,時間戳以及其他元數據的數據結構。這種數據結構安全性的關鍵在於:它能夠將大量關於全球網絡狀態的信息壓縮成一小段信息標準,並使這一小段信息能被高效的驗證,這一小段信息被稱為哈希。

 

即使僅僅改變輸入信息的一個字符也會產生一個完全不同的哈希值!

 

加密學上的哈希被用於各行各業,從密碼儲存到文件驗證系統。基本思想是使用一種確定性的算法(deterministicalgorithm),這種算法能夠接受一個輸入並每次都產生一個長度固定的字符串。也就是說,一個相同的輸入得到的永遠都是相同的輸出。

 

除了這種確定性,哈希算法還有一個特性:輸入中的任何一點點的改變都會導致輸出變得完全不同。

 

哈希算法有一個問題,就是衝突必然性(inevitability of collisions)。它的意思是:由於哈希函數輸出的字符串長度一定,不同的輸入有可能會產生相同的哈希值。衝突是不好的,如果一個攻擊者能夠故意產生衝突,他便能夠把惡意的文件或者數據偽裝成正確的哈希值並將其傳遞下去。一個好的哈希函數的目標是讓衝突的發生變得幾乎不可能。

 

計算一個哈希值不應該太過高效,因為這會讓衝突的實現變得太過容易。哈希算法應該能夠抵禦「原像攻擊(pre-image attack)」。也就是說,根據已知的哈希值找到輸入值應該是極其困難的(輸入值被稱作原像,比如s = hash(x),根據s找到x應該是幾乎不可能的)。

 

總結起來,一個好的哈希算法應該具備以下特徵:

 

·  改變輸入的任意一點都會產生一個完全不同的輸出

·  發生衝突的可能性非常低

·  在不犧牲抵禦衝突的情況下有一定的效率

 

攻擊哈希

 

最初的哈希算法標準之一是MD5哈希,它被廣泛的應用於文件完整性驗證(校驗和),同時在網絡應用的資料庫中用於儲存哈希密碼。那時它的功能還十分簡單,因為不論輸入如何,輸出是一個固定的128位的字符串,並且它使用並不有效的多輪單向操作(one-wayoperations across several rounds)來計算確定性輸出。

由於輸出字符串長度較短以及操作較為簡單,MD5很容易被破解並易受生日攻擊(Birthday Attack)的侵擾。

 

什麼是「生日攻擊」?

 

你可能聽說過:如果一個房間裡有23個人,那麼兩兩生日重疊的可能性就有50%,而在一個房間內如果提高到70人,那麼這個概率就變成了99.9%。這就是鴿子洞原則(pigeonhole principle),如果有100隻鴿子只有99個洞,那麼必然有一個洞中有兩隻鴿子。

放在哈希算法的案例中就變成了,一個固定長度的字符串意味著一個固定的排列組合數量,因此當輸入值達到一定的數量時,衝突必然會發生。

太多鴿子了!至少有一隻鴿子會與另一隻共用一個洞

 

MD5抵禦衝突的能力如此之弱,以至於一個2.4GHz的奔騰處理器都能在數秒之內製造一次哈希衝突。事實上,由於MD5在較早年代的廣泛應用,已經有大量的原像在線上洩漏,你甚至可以用簡單的谷歌搜索來找到它們。

 

多樣性和哈希算法的進化

 

開端:SHA1 & SHA2

 

美國國家安全局(NSA)一直都是哈希算法標準方面的先驅,他們最早提出安全哈希算法,也就是SHA1,這個算法輸出的是160位固定長度的字符串。

然而,SHA1僅僅在MD5的基礎上提高了輸出的長度,單向操作的數量以及單向操作的複雜性,但未做任何根本改進來使其能夠抵禦更強大的機器,這些機器嘗試不同的攻擊向量。

 

那麼我們該如何提高呢?

 

SHA3

 

在2006年,美國國家標準與技術研究所(NIST)發起了一場尋找一個與SHA2從根本上不同的替代品,讓它成為新的算法標準。因此,SHA3的誕生是哈希算法偉大機制的一部分,它被稱為KECCAK。

 

雖然名字看上去差不多,SHA3內部與之前的算法完全不同,因為它擁有海綿結構(Sponge Construct)機制。這種結構使用隨機的排列組合來吸收和輸出數據,同時還能為未來輸入值提供隨機源。

KECCAK256海綿結構作用於輸入值

 

SHA3維持一個內部狀態,使得輸出信息比字符串長度長(依然能夠做到對於信息的壓縮),這使它克服了先前算法的局限性。它也在2015年成為了NIST的標準算法。

 

哈希和PoW

 

當哈希算法被集成到區塊鏈協議中的時候,更老一些的比特幣選擇了SHA256算法,而以太坊選擇了改良版的SHA3(KECCAK256)作為PoW的算法。一個在區塊鏈PoW協議中選擇哈希函數的重要標準是計算哈希值的效率。

 

對比特幣SHA256算法的執行效率可以通過製造諸如ASICs礦機之類的專門硬體來進一步提高。這表現在礦池中ASICs的使用,並使協議趨向於計算中心化。

也就是說,PoW鼓勵高效的計算群體聚合成更大的群體(礦池)從而提高我們所說的哈希算力(也就是一個機器在固定的時間間隔能夠計算的哈希數量)。

 

以太坊,選擇了改良後的SHA3,也被稱作KECCAK256。此外,以太坊的PoW算法(Dagger-Hashimoto)設計成硬體內存難以計算,這從一定程度上避免了ASICs礦機的使用。

 

為什麼比特幣要使用雙重SHA256?

 

比特幣使用SHA256來轉換數據的方式很有趣,它將算法在協議中連續執行了兩次。注意,這並不是為了抵禦生日攻擊,顯然如果hash(x) = hash(y) 那麼也有hash(hash(x)) = hash(hash(y)),而是為了緩解長度擴展(length-extension)攻擊。

 

從本質上說,這種攻擊需要惡意攻擊者知道哈希輸入值的長度,在這個已知的長度上再加上一個秘密的字符串,就可以發動哈希函數內部的一部分,從而擾亂哈希函數。由於SHA256是SHA2算法家族的成員,它有這一類的短板,而比特幣通過將哈希函數連續運行兩次來緩解這個缺陷。

 

以太坊2.0和BLAKE

 

SHA3並不是NIST在2006年發起的那場競賽中唯一的突破。雖然SHA3最終獲勝,一個叫做BLAKE的算法緊隨其後位居第二。對於以太坊2.0分片的執行,更高效的哈希算法可以說是必不可少的。

BLAKE2b哈希算法是一個在競賽之後被高度升級優化過的版本,由於在保持高度安全性的同時擁有極高的效率(跟KECCAK256相比),這個算法也經歷了較為徹底的測試。

 

在一個現代CPU上計算BLAKE2b實際上比KECCAK要快3倍。

 

哈希算法的未來

 

看起來無論我們做什麼,要麼是在(1)提高哈希函數內部操作的複雜性,要麼是在(2)提高哈希輸出的長度,寄希望於攻擊者的計算機由於速度不夠快而無法有效產生計算衝突。

 

我們網絡的安全性目前依賴著單向操作原像的模糊性。也就是說一個哈希算法的安全目標是讓任何人找到具有兩個相同輸出的值變得越難越好,從而使得哈希衝突的可能性儘可能的小,雖然依舊存在無限數量的可能的衝突。

 

那麼量子計算呢?在量子計算面前哈希算法足夠安全嗎?

 

根據目前的理解,簡單的回答是:安全。哈希算法將能夠經受量子計算的挑戰。量子計算能夠破解那些諸如RSA加密問題,這些問題具有嚴格的底層數學結構,它們由巧妙的技巧和理論構建。而哈希算法內部構造中並沒有那么正式的結構。

 

量子計算機確實可以加快計算非結構化問題(如哈希)的速度,但是到最後,量子計算機發起攻擊的方式依然是暴力破解,和傳統的計算機並沒有什麼不同。

 

不論我們選擇什麼算法,顯然我們都在駛向一個計算更高效的未來,我們必須盡全力挑選最好的工具並經得起時間的考驗。

 

-

風險警示:藍狐筆記所有文章都不構成投資推薦,投資有風險,投資應該考慮個人風險承受能力,建議對項目進行深入考察,慎重做好自己的投資決策。

本文已加入「POB.Network腦力挖礦」內容天使合伙人計劃。

通往區塊鏈的新世界:關注「藍狐筆記」區塊鏈公眾號:lanhubiji 

或加入藍狐筆記的知識星球:https://t.zsxq.com/iaQNnIq

相關焦點

  • 和你聊聊哈希算法
    和你聊聊哈希算法1.1 引言哈希算法又稱散列函數算法,是一種查找算法,應該說哈希算法是最快的查找算法,沒有之一。對於查找問題,哈希算法一直是首選算法。那麼,為什麼名字起的這麼「嘻哈」的算法會如此強大,本文將為你揭開謎底。
  • 什麼是哈希算法
    這些算法可以分成普通哈希和加密哈希算法,兩種算法之間沒有特別明顯的區別。例如本來 MD5 就是設計出來做加密哈希的,但是後來由於計算機的發展 MD5 出現碰撞的可能性就很大了,所以目前 MD5 只能當普通哈希用,用來做數據校驗。
  • 五分鐘帶你了解哈希算法
    優質哈希功能的目標是讓攻擊者很難找到,獲得輸入數據的方法。計算哈希不應該太簡單,因為這會讓對於攻擊者來說,計算collisions也變得很容易。哈希算法需要對「預攻擊」有抵抗性。也就是說,給定哈希,應該很難計算追溯確定性的步驟來重新產生由哈希創建的數值。Given s= hash(x), finding x should be near impossible.
  • 圖解什麼是一致性哈希算法
    一致性,咱懂哈希算法,咱也懂一致性+哈希算法  什麼鬼?如果存儲集群中有5臺機器,如果這時有讀寫請求,就需要考慮從哪臺機器操作數據,一般有幾種方法:各種方法都有各自的優缺點:輪詢策略請求均勻分配,但當伺服器有性能差異,無法按性能分發;哈希取模如果機器動態變化會導致路由產生變化,數據產生大量遷移。
  • 科普 | 哈希函數的過去、現在與未來
    以下文章來源於以太坊愛好者 翻譯&校對: 閔敏 & 阿劍科普 | 哈希函數的過去、現在與未來哈希值和哈希函數的概念是初次入門區塊鏈的人常聽到的兩個關鍵詞
  • 什麼是一致性哈希算法
    這裡主要記錄一致性Hash算法如何將數據分配到各個機器中去。2,衡量一致性哈希算法好處的四個標準①平衡性。平衡性是指哈希的結果能夠儘可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。②單調性。
  • 關於哈希算法,必須了解這三點
    任意輸入值(Message)的二進位編碼經過哈希函數計算後,可以得出n比特的一個0、1字符串的哈希值,在不同算法中n的取值可能不同,例如128、160、192、256、384或512等。哈希算法在區塊鏈技術中得到了廣泛的應用,各個區塊之間通過哈希指針連接形成區塊鏈,每個區塊的完整性檢驗將以哈希運算的方式進行。
  • 理解數字籤名、加密通信的關鍵:哈希算法
    首先說哈希算法有很多種,例如 md5 ,SHA256 等等,但是它們總體上可以分為兩大類,一類是普通哈希,另外一類是加密哈希,cryptographic hash function 。  業界可以找到的哈希算法是有很多種的。我們可以大致按照輸出的哈希的長度來聊,雖然哈希算法的安全性也不單單是跟哈希長度有關,但是一般哈希值越長也就是越安全。
  • 10分鐘了解一致性哈希算法,全網(小區區域網)(建議收藏)
    散列函數能使對一個數據序列的訪問過程更加迅速有效,是一種空間換時間的算法,通過散列函數數據元素將被更快定位。下圖示意了字符串經過哈希函數映射到哈希表的過程。沒錯,輸入字符串是用臉滾鍵盤打出來的:)常見的哈希算法有MD5、CRC 、MurmurHash 等算法。
  • Hash(哈希)算法科普
    單向散列函數算法也稱Hash(哈希)算法,是一種將任意長度的消息壓縮到某一固定長度(消息摘要)的函數(該過程不可逆)。
  • 哈希表(散列表)詳解(包含哈希表處理衝突的方法)
    前面介紹了靜態查找表以及動態查找表中的一些查找方法,其查找的過程都無法避免同查找表中的數據進行比較,查找算法的效率很大程度取決於同表中數據的查找次數
  • 哈希函數和哈希表
    其核心就是哈希函數和哈希表的應用!哈希函數哈希函數又稱為散列函數,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
  • 一文搞懂負載均衡中的一致性哈希算法
    不同領域場景不同,需要顧及的因素也有所差異,本文主要討論在負載均衡中一致性哈希算法的設計。在介紹一致性哈希算法之前,我將會介紹一些哈希算法,討論它們的區別和使用場景。也會給出一致性哈希算法的 Java 通用實現,可以直接引用,文末會給出 github 地址。
  • 面試時遇到一致性哈希算法這樣回答會讓面試官眼前一亮
    面試中一致性哈希算法被問到的概率非常大,本文將從如下三個方面探探一致性哈希算法,讓大家輕鬆應對面試,並且說出與眾不同的答案。將原來的3個節點數量翻倍倍,新增加的第一臺數據來源於第一臺,以此類推,第6臺的數據來源於第3臺,這樣k6經過新的負載均衡算法會落到第6臺,數據原本存在於第3臺,而第6臺的數據來源於第3臺,這樣避免了緩存穿透。成倍擴容能有效解決擴容後帶來的緩存穿透問題,但這樣做會造成資源的浪費,有沒有其他更好的方法呢?
  • Comunion 區塊鏈深度學習系列|哈希算法的應用
    此時可以把這7個數據看成一個整體,前面6個數據是X,把X放在哈希函數裡面,會出來一個值,比如說Y值。由於比特幣網絡裡使用的哈希算法是SHA-256,當Y值出來之後,就會得到一個256個由0和1組成的字符串。這個字符串出來之後,它會和X裡面的難度值比較大小。
  • 哈希函數
    如果能預先建立表中關鍵字Key與其存儲位置之間的函數,即元素的存儲位置是其關鍵字的函數f(key)的值,那麼查找過程就可以實現。,b是常數) 直接定址所得的地址集合與關鍵字的集合大小相同,是一一對應關係。
  • 哈希算法、愛因斯坦求和約定,這是2020年的注意力機制
    哈希算法、Head 之間的信息交流都需要考慮,顯存佔用、表徵能力都不能忽視。注意力機制是非常優美而神奇的機制,在神經網絡「信息過載」的今天,讓 NN 學會只關注特定的部分,無疑會大幅度提升任務的效果與效率。藉助注意力機制,神經機器翻譯、預訓練語言模型等任務獲得了前所未有的提升。
  • AITD小課堂第十二課:哈希算法是什麼?非對稱加密是什麼?
    哈希算法是什麼? 區塊鏈的四大核心技術分別是密碼學、分布式帳本、共識機制以及智能合約。而密碼學作為其中最重要的一部分,可以說是區塊鏈的基石,而其他技術是以密碼學為地基,才能搭建出區塊鏈這座高樓大廈。
  • 生日攻擊與哈希碰撞
    哈希(hash)是在計算機領域常用的一種信息處理方法。(常見的哈希計算方法有MD5、SHA-1、SHA-256等)很顯然,由於哈希計算的結果是固定信息量的數據,而原信息卻可以是各種各樣的數據,所以哈希計算並不像許多函數那樣輸出與輸入一一對應。這就可能導致某兩個完全不同的輸入數據經過哈希計算後得到了同一個「代號」,這種情況就被稱作「哈希碰撞」。同學:感覺腦袋有點暈……好吧,我們還是用簡單的例子來說明。
  • Ceph殺手鐧CRUSH和主流分布式存儲一致性哈希算法
    PG:相當於一致性哈希算法裡的虛擬節點,做為Object的歸置組。OSD:真正的存儲組件,OSD一般和磁碟一一對應,處理存儲磁碟上的讀/寫操作。一致性哈希算法(Consistent Hashing)先簡單了解下一致性哈希算法(ConsistentHashing),和CRUSH算法有共同之處。