哈希運算是從可變大小的輸入生成固定大小的輸出的過程。該過程通過稱爲“哈希函數”(以哈希運算算法實現)的數學公式完成。
並非所有哈希函數都涉及到運用密碼學,但“加密哈希函數”卻是加密貨幣的核心。得益於加密哈希函數,區塊鏈和其他分佈式系統的數據完整性和安全性才能達到較高水平。
傳統哈希函數與加密哈希函數均具有確定性。確定性指的是隻要輸入不更改,哈希運算算法將始終生成相同的輸出(也稱爲“摘要”或“哈希值”)。
通常情況下,加密貨幣的哈希運算算法均設計爲單向函數,這意味着如果沒有大量計算時間和資源,這些函數無法輕易恢復。換言之,從輸入創建輸出極爲容易,但反向從輸出生成輸入則相對困難。總體而言,越難找到輸入,哈希運算算法就越安全。
哈希函數如何運作?
不同的哈希函數生成大小不一的輸出,但每個哈希運算算法的輸出大小始終不變。例如,SHA-256算法只能生成256位的輸出,而SHA-1始終生成160位的摘要。
爲說明這一點,我們通過SHA-256哈希運算算法(比特幣中使用的算法)運行“Binance”和“binance”這兩個詞。
SHA-256 | |
輸入 | 輸出(256位) |
Binance | f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191 |
binance | 59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2 |
請注意,首字母大小寫的微小改動都會生成完全不同的哈希值。不論輸入數值的長短,使用SHA-256的輸出始終保持256位(或64個字符)的固定長度。此外,無論算法運行這兩個詞多少次,二者的輸出都保持不變。
相反,如果通過SHA-1哈希運算算法運行同樣的輸入,得到的結果如下:
SHA-1 | |
輸入 | 輸出(160位) |
Binance | 7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1 |
binance | e58605c14a76ff98679322cca0eae7b3c4e08936 |
請注意,“SHA”是安全哈希算法(Secure Hash Algorithms)的首字母縮寫。該算法指的是一組加密哈希函數,其中包括SHA-0和SHA-1算法,以及SHA-2和SHA-3組。SHA-256與SHA-512及其他變體均爲SHA-2組的一部分。目前只有SHA-2和SHA-3組被認爲是安全的。
哈希函數的重要性何在?
傳統哈希函數擁有豐富用例,包括數據庫查找、大文件分析以及數據管理。加密哈希函數則廣泛用於信息安全應用,例如消息驗證和數字指紋。就比特幣而言,加密哈希函數是挖礦過程中不可或缺的一部分,同時影響新地址和密鑰生成。
哈希運算在處理海量信息時才發揮真正威力。例如,通過哈希函數運行大文件或數據集,然後利用其輸出即可快速驗證數據的準確性和完整性。哈希函數具有確定性,因此行之有效:輸入始終能生成壓縮過的簡化輸出(即哈希值)。這種技術消除了存儲和“記憶”大量數據的必要。
哈希運算在區塊鏈技術領域尤爲實用。比特幣區塊鏈有多處涉及哈希運算的操作,其中大多數都在挖礦過程中。事實上,幾乎所有加密貨幣協議都依靠哈希運算來連接交易組並壓縮至區塊中,同時在各個區塊間生成加密鏈接,有效創建區塊鏈。
加密哈希函數
同樣,部署加密技術的哈希函數可以定義爲加密哈希函數。一般來說,破解加密哈希函數需要無數次蠻力嘗試。如需“還原”加密哈希函數,就要反覆試錯猜測輸入,直至生成相應的輸出。但是,不同的輸入也有可能生成完全相同的輸出,這樣就會發生“衝突”。
從技術上講,加密哈希函數需具備三種屬性,纔算有效保障安全。三大屬性分別爲抗衝突性、抗原像性和抗第二原像性。
在分別討論每種屬性之前,先簡要總結一下各屬性的邏輯。
抗衝突性:任意兩個不同的輸入不可能生成相同的哈希值輸出。
抗原像性:不可能“還原”哈希函數(即無法從給定輸出找到輸入)。
抗第二原像性:不可能找到與特定輸入發生衝突的另一個輸入。
抗衝突性
如前所述,不同的輸入生成完全相同的哈希值時就會發生衝突。因此,只要沒人發現衝突,哈希函數就視爲具有抗衝突性。請注意,由於可能的輸入無限,而可能的輸出有限,因此哈希函數始終存在衝突。
假設發現衝突的可能性低至需以數百萬年計算,則可以說,哈希函數具有抗衝突性。因此,現實中雖然沒有不衝突的哈希函數,但只要其中一些(例如SHA-256)足夠強大,就視爲具有抗衝突性。
在各種SHA算法中,SHA-0和SHA-1組出現過沖突,所以不再安全。目前SHA-2和SHA-3組被認爲具有抗衝突性。
抗原像性
抗原像性屬性與單向函數概念有關。假設找出生成特定輸出的輸入概率極低,則可認爲哈希函數具有抗原像性。
請注意,攻擊者會查看給定輸出來猜測輸入,因此該屬性與抗衝突性有所不同。而且,兩個不同的輸入生成相同的輸出就會產生衝突,但是使用哪個輸入其實並不重要。
抗原像性屬性對保護數據很有價值,其原因是無需披露信息,消息的簡單哈希值即可證明其真實性。在實際運用中,許多服務供應商和網絡應用存儲和使用由密碼生成的哈希值,而非明文形式的密碼。
抗第二原像性
簡言之,抗第二原像性介於上述兩種屬性之間。假設有人能找出特定的輸入,該輸入生成的輸出與已知的另一輸入的輸出相同,則會發生第二原像攻擊。
換言之,第二原像攻擊與找出衝突相關,但並非搜索生成相同哈希值的兩個隨機輸入,而是在已知特定輸入的情況下,搜索生成相同哈希值的另一個輸入。
第二原像攻擊通常意味着存在衝突。因此,任何抗衝突的哈希函數同樣能抵抗第二原像攻擊。但是,函數具有抗衝突性意味着能從單一輸出中找出單一輸入,因此攻擊者仍可向抗衝突性的函數發起原像攻擊。
加密貨幣挖礦
比特幣挖礦中多個步驟用到哈希函數,例如查看餘額、連接交易輸入和輸出,以及哈希運算同個區塊內的交易以形成默克爾樹。但是,比特幣區塊鏈安全的主要原因之一是,礦工需要執行無數哈希運算操作,才能最終找出下一個區塊的有效解決方案。
具體而言,礦工在創建候選區塊哈希值時必須嘗試若干不同的輸入。從本質上講,只有生成的輸出哈希值以一定數量的零開頭,礦工才能驗證區塊。零的數量決定挖礦難度,並隨着專用於網絡的哈希率變化而變化。
在這種情況下,哈希率代表投入比特幣挖礦的算力大小。如果網絡的哈希率增加,比特幣協議將自動調整挖礦難度,使得出塊所需的平均時間保持在近10分鐘。相反,若多名礦工決定停止挖礦,導致哈希率大幅下降,則挖礦難度調低,直至平均出塊時間恢復到10分鐘。
請注意,礦工能生成多個哈希值作爲有效輸出(以一定數量的零開頭),因此他們無需查找衝突。一個區塊有多種可能的解決方案,但取決於挖礦難度閾值,礦工只須找到其中一種解決方案。
比特幣挖礦是一項高成本任務,礦工沒有必要欺騙系統,那樣反而會造成重大經濟損失。加入區塊鏈的礦工越多,區塊鏈規模越大,也越強大。
總結
毫無疑問,哈希函數是計算機科學中必不可少的工具,其處理海量數據的能力尤爲出衆。與密碼學相結合,哈希運算算法能發揮廣泛用途,以各種方式保障安全和提供身份驗證。對於幾乎所有加密貨幣網絡而言,加密哈希函數至關重要。因此,若對區塊鏈技術感興趣,瞭解加密哈希函數屬性與運行機制必將大有裨益。
