雜湊演算法簡介
這是一篇英文部落格,點選原文連結可以訪問英文版,不過好像需要工具。
新手在學習區塊鏈時,常常聽到的詞彙就是
雜湊和雜湊演算法
,這些演算法似乎無處不在。在執行分散式網路和共識機器時(比如比特幣和以太坊網路),透過點對點的方式連線數萬個結點,需要同時具備“無信任”和高效率驗證。也就是說,這些系統需要以緊湊的格式對資訊進行編碼,允許其參與者進行安全而快速的驗證。
比特幣和以太坊處理的主要原語是 塊 的概念,塊是包含事務、時間戳和其他重要後設資料的資料結構。能夠將關於網路全域性狀態的大量資訊壓縮成一個簡短的訊息標準,是其安全性的重要保障,如果有需要可以有效地驗證訊息標準,稱之為雜湊。
即使只改變輸入中的一個字元也會產生完全不同的雜湊值,從密碼儲存到檔案驗證系統,到處都在使用 Hash 演算法。其基本思想就是使用 確定 的演算法,給演算法接受一個輸入併產生一個 固定長度 的輸出,也就是說,相同的輸入將**始終產生相同的輸出。
不僅僅是確定性對 Hash 演算法很重要,在輸入中改變單個的位也將產生完全不同的 Hash 值。
Hash 演算法的一個問題就是 碰撞 的必然性。也就是說,對於任何我們能想象的輸入,都產生一個固定長度的字串,那就有其他可能的輸入將導致輸出相同的字串。碰撞是很糟糕的事情,這意味著攻擊者可以按需求去建立碰撞,然後將惡意的檔案或資料作為正確的 Hash 與合法的偽裝。好的 Hash 函式的目標是增加攻擊者找到產生相同 Hash 值的輸入的難度。
計算 Hash 不應該太有效,因為這會使攻擊者更容易認為的計算碰撞。Hash 演算法需要抵抗“預成像攻擊”。也就是說,給定 Hash 值,應該很難計算出建立這個 Hash 值的確定性步驟。
總結一下,好的 Hash 演算法應該有以下三個特性:
-
改變輸入中的一位會導致雪崩效應併產生完全不同的結果;
-
應該具有非常低的碰撞率;
-
某種程度的效率不會犧牲碰撞阻力。
攻擊雜湊
最初的 Hash 演算法標準之一是 MD5 雜湊,它廣泛用於檔案完整性驗證(校驗和),並在 web 應用程式資料庫中儲存密碼(常見於
password = MD5(salt + prePassword)
),它的功能非常簡單,為每個輸入都輸出一個固定的 128 位字串,並在幾輪之間使用簡單的單向操作來計算它的確定性輸出。短輸出以及操作的簡單性使得 MD5 非常容易被破壞,容易受到所謂的
生日攻擊
。
什麼是生日攻擊
你聽說過把23個人放在一個房間裡,有 50% 的可能兩個人生日是同一天嗎?如果將人數提高到70人,那麼將會有 99.9% 的可能有兩人生日是同一天。這源於我們所謂的
鴿巢理論
,該理論粗略的指出,給出 100 個鴿子和 99 個盒子,要把盒子裝滿,那麼有一個盒子裡面會有兩隻鴿子。也就是說,固定的輸出意味著存在固定的排列程度,在此基礎上就能找到碰撞。
實際上 MD5 的抗碰撞非常弱,一個簡單的家用 2.4GHz 奔騰處理器就可以在幾秒內計算出人工雜湊碰撞。此外,在當前 web 的早期,它的廣泛使用已經在網上建立了大量洩露的 MD5 預映像,只需要對她們的雜湊進行簡單的 Google 搜尋就能找到這些映像。
雜湊演算法的多樣性與演進
NSA(美國國家安全域性)一直是雜湊演算法標準的先驅,他們最初提出了 安全雜湊演算法 SHA1,建立了160位固定長度輸出。很不幸,SHA1 僅僅透過增加輸出長度、單向操作的步驟、單向操作的複雜度來改進 MD5,但是沒有針對使用不同攻擊向量的強大機器進行改進。
那麼我們怎樣才能做得更好呢?
在2006年,NIST(美國國家標準技術研究所)發起了一個比賽,旨在找到一個從根本上區別於 SHA2 的方案作為新的標準。因此,SHA3 因為 KECCAK 演算法的誕生而廣為人知。
儘管叫這個名字,但是 SHA3 內部有很大的差異,它採用了 海綿結構 機制,使用隨機排列來吸收和輸出資料,同時作為雜湊演算法未來輸入的隨機性來源。
SHA3 維護一個內部狀態,它包含更多與輸出相關的資訊,使得它能夠克服以前演算法的侷限性。NIST 在2015年把它列為標準。
雜湊的工作證明
當把雜湊演算法整合到區塊鏈協議中時,比特幣選擇了 SHA256 而以太坊使用修改後的 SHA3(KECCAK256) 作為其工作證明。使用工作證明為區塊鏈選擇雜湊函式的一個重要質量是計算前面所說的雜湊效率。
比特幣 SHA256 的實現可以透過專用積體電路的專用硬體進行額外的高效計算。關於在採礦池中使用專用積體電路使協議趨向於集中計算已經寫了很多了。也就是說,工作證明可以激勵計算機效率高的計算機組合聚合到採礦池中,並增加我們所說的“雜湊能力”,或者來衡量機器每個時間間隔可以計算的雜湊值。
以太坊選擇了一種名為 KECCAK256 的改良 SHA3。此外,以太坊的工作證明演算法 Dagger-Hashimoto 意味著記憶體難以計算硬體(就是對計算機效能要求很高的意思)。
為什麼比特幣使用雙向 SHA256?
比特幣使用了一種有趣的方法透過 SHA256 來雜湊資料,它在協議中執行演算法的
兩次
迭代。注意,這不是生日攻擊的對策,很明顯,如果
hash(x) = hsah(y)
則
hash(hash(x)) = hash(hash(y))
。替而代之,雙向 SHA256 用於緩解長度擴充套件攻擊。
本質上,這種攻擊涉及攻擊者知道雜湊輸入的長度,該輸入可用於透過向雜湊值附加秘密字串來欺騙雜湊函式以啟動其內部狀態的某個部分。 SHA2 演算法系列中的 SHA256 遭受了這個陷阱,比特幣透過計算兩次雜湊來減輕它的負擔。
以太坊2.0和BLAKE
SHA3 不是美國國家標準技術研究所所發起比賽中的唯一突破,雖然 ShA3 勝出了,緊隨其後的 BLAKE 也同樣出名。對於以太坊2.0的分塊實現,更高效的雜湊演算法是剛需,也是研究團隊非常注重的問題。BLAKE2b 演算法是在競賽中對 BLAKE 演算法的改進,與 KECCAK256 相比,它在保持安全性的同時,其效率得到了極大的探索。
在現代 CPU 上計算 BLAKE2b 實際上比 KECCAK 快 3 倍。
展望未來:雜湊演算法的未來
似乎無論我們怎麼做,無非就是增加內部雜湊操作的複雜性,或者增加雜湊輸出的長度,希望攻擊者的計算機不能足夠快地有效地計算碰撞。
為了保證網路的安全性,我們依賴於單向操作前映像的模糊性。也就是說,雜湊演算法的安全目標是儘可能的使任意兩個人都不能找到兩個不同的輸入使得它們的雜湊值相同,儘管可能存在無數次的碰撞。
量子計算的未來呢?雜湊演算法安全嗎?
基於現在的理解,雜湊演算法是經得起時間和量子計算的考驗的。量子計算能夠打破的是那些由基於嚴格的基礎數學結構技巧和理論所構建的演算法,比如 RSA。在另一方面,雜湊演算法的內部結構都不那麼正式。
量子計算機的確提高了非結構化問題(比如雜湊)的計算速度,但最終,它們還是會像今天的計算機一樣,強行發起攻擊。
不管我們為協議選擇什麼演算法,很明顯我們正走向一個計算效率更高的未來,我們必須用我們最好的判斷力來選擇適合這項工作的工具,以及那些有望經得起時間考驗的工具。
原文連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555494/viewspace-2215173/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 3.1 雜湊演算法演算法
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- 淺析雜湊演算法演算法
- 雜湊查詢演算法演算法
- 超酷演算法:同型雜湊演算法
- 演算法學習-雜湊表演算法
- 22 | 雜湊演算法(下):雜湊演算法在分散式系統中有哪些應用?演算法分散式
- 【六褘-Java】雜湊演算法記憶體圖;set集合低層採用雜湊表儲存元素;雜湊演算法的流程Java演算法記憶體
- js 雜湊雜湊值的模組JS
- 雜湊表(雜湊表)詳解
- 你知道雜湊演算法,但你知道一致性雜湊嗎?演算法
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- 查詢演算法及雜湊表演算法
- MD5雜湊加密演算法加密演算法
- 雜湊
- 什麼是雜湊演算法?雜湊競猜遊戲開發原理詳解演算法遊戲開發
- 雜湊表(雜湊表)原理詳解
- 【尋跡#3】 雜湊與雜湊表
- 一致性雜湊演算法演算法
- 雜湊演算法生存狀況報告演算法
- 【演算法】9 雜湊表【待補充】演算法
- 查詢(3)--雜湊表(雜湊查詢)
- 樹雜湊
- 雜湊碰撞
- 字串雜湊字串
- 雜湊表
- 雜湊對映用法及演算法例題演算法
- 資料結構與演算法分析 (雜湊)資料結構演算法
- javascript資料結構與演算法--雜湊JavaScript資料結構演算法
- 演算法與資料結構——雜湊表演算法資料結構
- RIPEMD演算法:多功能雜湊演算法的瑰寶演算法
- 資料結構與演算法——雜湊表類的C++實現(探測雜湊表)資料結構演算法C++
- 雜湊函式函式
- 字串雜湊表字串
- redis之雜湊Redis
- 雜湊連線
- 6.7雜湊表
- 安全的雜湊