什麼是雜湊值,為什麼它在科技中無處不在?
你可能見過這樣的字串:
e3b0c44298fc1c149afbf4c8996fb924
27ae41e4649b934ca495991b7852b855
它們出現在軟體下載中(「驗證 SHA-256 雜湊值」)、在區塊鏈討論中、在密碼安全討論中,以及在無數的開發者工具中。但雜湊值究竟是什麼,為什麼它對現代科技如此基本?
用簡單語言解釋這個概念
雜湊函數接受任何輸入——一個詞、一個句子、整個檔案——並產生固定長度的輸出,稱為雜湊值(也稱為摘要、校驗和或指紋)。關鍵特性是:
- 確定性。 相同的輸入始終產生相同的輸出。
- 固定長度。 無論輸入多大,輸出始終是相同的大小。
- 單向性。 你無法從雜湊輸出重建原始輸入。
- 雪崩效應。 輸入中的微小改變會產生完全不同的雜湊值。
把它想成資料的指紋。就像你的指紋唯一地識別你,但無法用來重建你的臉一樣,雜湊值唯一地識別一段資料,但無法用來重建原始內容。
一個簡單的範例
以下是 SHA-256 雜湊函數對兩個非常相似的輸入的處理:
| 輸入 | SHA-256 雜湊值(前 16 個字元) |
|---|---|
| "Hello" | 185f8db32271fe25... |
| "hello" | 2cf24dba5fb0a30e... |
| "hello!" | ce06092fb948d9ff... |
改變一個字元(大寫 H 變為小寫 h)或添加一個驚嘆號會產生完全不同的雜湊值。沒有規律,沒有可預測的關係。這就是雪崩效應的實際展示。
你知道嗎? 空輸入(文字上什麼都沒有)的 SHA-256 雜湊值是 e3b0c44298fc1c14...。這是一個眾所周知的常數。世界上每個 SHA-256 實作對空輸入都會產生這個確切的相同輸出。
常見的雜湊演算法
MD5
- 輸出: 128 位元(32 個十六進位字元)
- 現狀: 對安全目的而言已被破解。碰撞(不同的輸入產生相同的雜湊值)可以在幾秒鐘內生成。
- 仍用於: 安全性不是顧慮的檔案完整性檢查(例如,驗證下載沒有損壞)。
SHA-1
- 輸出: 160 位元(40 個十六進位字元)
- 現狀: 安全方面已棄用。碰撞已被證明存在。
- 仍用於: 舊版系統、Git 提交識別碼。
SHA-256
- 輸出: 256 位元(64 個十六進位字元)
- 現狀: 當前標準。沒有已知的實際攻擊。
- 用於: 密碼儲存、數位簽名、區塊鏈、檔案驗證、TLS 憑證。
SHA-512
- 輸出: 512 位元(128 個十六進位字元)
- 現狀: 當前標準。比 SHA-256 更大的安全餘量。
- 用於: 高安全性應用、某些密碼雜湊方案。
警告 MD5 和 SHA-1 絕不應該用於安全目的(密碼、數位簽名、憑證)。它們在密碼學上已被破解。對任何與安全相關的事情,請使用 SHA-256 或 SHA-512。
雜湊值的應用場景
密碼儲存
當你建立帳號時,網站不會(也不應該)儲存你的實際密碼。相反,它儲存你密碼的雜湊值。當你登入時,系統對你輸入的密碼進行雜湊,並與儲存的雜湊值進行比較。如果它們匹配,你就可以進入。
這意味著即使資料庫遭到入侵,攻擊者得到的是雜湊值,而不是密碼。他們無法逆向雜湊找到你的密碼(但他們可以通過雜湊常見密碼並比較來嘗試猜測)。
現代密碼雜湊通過 bcrypt、scrypt 和 Argon2 等演算法進一步提高安全性,這些演算法添加鹽值(隨機資料)並且刻意設計得很慢,使暴力猜測不切實際。
檔案驗證
當你下載軟體時,網站通常會提供檔案的 SHA-256 雜湊值。下載後,你自己對檔案進行雜湊並比較。如果雜湊值匹配,檔案正是發布者所期望的。如果它們不同,檔案在下載過程中被損壞或篡改了。
預期: a1b2c3d4e5f6...
你的檔案:a1b2c3d4e5f6... ✓ 匹配——檔案是真實的
區塊鏈和加密貨幣
區塊鏈中的每個區塊都包含前一個區塊的雜湊值,形成一條牢不可破的鏈。如果有人試圖修改過去的交易,那個區塊的雜湊值就會改變,從那一點開始破壞鏈,使篡改立即可被偵測到。
比特幣挖礦本質上是一場競賽,尋找能產生以特定數量零開頭的 SHA-256 雜湊值的輸入。
數位簽名
當你在數位上簽署文件時,你實際上並不是用你的私鑰加密整個文件。相反,文件被雜湊,然後雜湊值被加密。這更快,並產生一個緊湊的簽名。
資料去重複
雲端儲存服務使用雜湊來偵測重複的檔案。如果兩個使用者上傳相同的檔案,它有相同的雜湊值,服務只需儲存一個副本。
Git 版本控制
Git 中的每個提交、檔案和樹都由其 SHA-1 雜湊值識別。這是 Git 知道檔案是否已更改以及如何追蹤專案整個歷史的方式。
你知道嗎? Git 正在逐漸從 SHA-1 遷移到 SHA-256。過渡開始是因為 2017 年 SHA-1 碰撞被證明存在,理論上允許有人建立兩個具有相同識別碼的不同提交。
不可逆性問題(以及為什麼它重要)
雜湊的單向性質既是它最大的優點,也是常見的困惑來源。
你不能「解密」雜湊值。 雜湊不是加密。加密是雙向的:用密鑰加密,用密鑰解密。雜湊是單向的:你可以從輸入計算雜湊,但你無法從雜湊計算輸入。
「逆向」雜湊的唯一方法是猜測原始輸入,對你的猜測進行雜湊,並檢查它是否匹配。對於短的、簡單的輸入(如常見密碼),這是可行的。對於長的、隨機的輸入,這在計算上是不可能的。
這就是為什麼密碼長度如此重要。「password123」的雜湊值可以通過嘗試常見密碼找到。「j8#kL9$mN2@pQ5&」的雜湊值則需要比宇宙年齡更長的時間來猜測。
親自嘗試
了解雜湊最好的方法是親自實驗。對一個詞進行雜湊,然後改變一個字元,看看輸出如何完全改變。在修改前後對檔案進行雜湊,看看差異。
提示 為任何文字或檔案生成並驗證雜湊值:如何生成和驗證雜湊值。嘗試 SHA-256、MD5、SHA-512 等——即時、免費,在你的瀏覽器中。
動手探索雜湊:
免費、即時,且不需要註冊。