Utilo

MD5 與 SHA-256:區別,安全性和使用時機

比較MD5,SHA-1,SHA-256和SHA-3:雜湊函式是如何工作的,為什麼MD5被破壞,速度,檢查總和,HMAC以及雜湊密碼的正確方法。

· 7 分鐘閱讀

雜湊函式是軟體中使用最廣泛的構建塊之一。它們驗證下載,刪除複製檔案,簽署API請求,支援Git和區塊鏈,並保護儲存的密碼。開發人員最常遇到的兩個名稱是MD5和SHA-256,。簡單的答案是:對於任何涉及安全的東西,。長的答案解釋了為什麼,

密碼雜湊函式的作用

一個雜湊函式可以輸入任何長度的輸入,併產生一個稱為消化的固定長度輸出。MD5 產生 128 位 (32 個六進位制字元);SHA-256 產生 256 位 (64 個六進位制字元)。

MD5("hello world")     = 5eb63bbbe01eeed093cb22bb8f5acdc3
SHA-256("hello world") = b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

一個好的密碼雜湊具有三個安全性質:

  1. 前影象阻力: 鑑於消化,不可能找到任何產生它的輸入。
  2. 第二次預影阻力: 鑑於輸入,無法在相同的摘要中找到不同的輸入。
  3. 碰撞阻力: 找不到任何兩種不同的輸入與相同的消化。

它還應該顯示雪崩效應:改變一個單個的輸入位改變了大約一半的輸出位,所以類似的輸入具有完全不相關的消化。試試在一個雜湊生成器中:"你好,世界"和"你好,世界!"

MD5 的簡短歷史

羅恩·裡維斯特在1991年設計了MD5。它是快速的,並且變得無處不在:檔案檢查總和,密碼儲存,數字證書。2004年研究人員證明了實際的碰撞。到2008年,一個團隊透過利用MD5碰撞建立了一個流證書授權證書,而2012年,Flame惡意軟體使用MD5碰撞偽造微軟程式碼簽名證書。如今,在膝上型電腦上生成MD5碰撞需要幾秒鐘。

對於MD5的預影象攻擊仍然是理論性的,但碰撞阻力完全破損,這足以排除攻擊者可能參與的簽名,證書和完整性檢查。

SHA-1:也已退休

透過SHA-1進行了類似的測試。2005年發表了理論上的弱點,而在2017年,谷歌和阿姆斯特丹CWI產生了第一個真正的碰撞 ("SHAttered"):兩個具有相同SHA-1雜湊的不同PDF檔案。瀏覽器停止接受SHA-1證書,Git正在遷移到SHA-256。處理SHA-1就像MD5一樣。

SHA-256 和 SHA-2 系列

2001年由NIST出版的SHA-2,包括SHA-224,SHA-256,SHA-384和SHA-512。SHA-256是最廣泛使用的:TLS證書,程式碼簽名,比特幣,包管理器,子資源完整性,JWT簽名 (HS256和RS256) 和更多。經過20多年的分析,

SHA-512使用64位操作,並且在沒有硬體加速的64位CPU上通常比SHA-256快。SHA-384是一個縮短的SHA-512,它也能夠抵禦長度擴充套件攻擊。

其他

2015年標準化的SHA-3 (Keccak) 使用了完全不同的內部設計海綿結構,因此對SHA-2的突破不會自動影響它。它不是SHA-2的替代品,而是具有不同的特性的備份。在規範要求使用時使用它;否則SHA-256仍然是實用預設。

一對一的比較

演算法 輸出大小 碰撞阻力 情況
其他 128位 破碎 (秒) 不是為了安全。
其他資料 160位 破碎 (2017) 不是為了安全。
其他型別 256位 在安全狀態下 建議預設
它們的位置: 512位 在安全狀態下 建議
它們的位置是: 256 / 512位 在安全狀態下 建議的替代方案
黑色3 256位 (可擴充套件) 在安全狀態下 非常快速,增長的採用

速度

在純軟體中,MD5比SHA-256快,。現代x86和ARM處理器包括SHA-256硬體指令,使SHA-256以每秒千兆位元組執行。在實踐中,從磁碟或網路讀取檔案通常是瓶,而不是雜湊。如果原始速度對於非安全用途至關重要,BLAKE3或非加密雜湊如xxHash可以擊敗兩者。

當MD5仍然是可以接受的

只有當有人能故意製造輸入時,。它仍然可以接受:

  • 在沒有攻擊者參與的情況下檢測轉移或儲存中的意外腐敗。
  • 快取金鑰和可信資料的重複,例如把自己的檔案放在桶中。
  • 遺留相容性,例如只發布MD5檢查總和的系統或需要它的協議。

即使在這些情況下,選擇SHA-256成本也很低,。許多事件始於一個"只用於腐敗"的檢查總和,

正確檢查下載

當一個專案釋出SHA-256檢查總和時,計算下載的雜湊值,並比較每個字元:

sha256sum ubuntu.iso          # Linux
shasum -a 256 ubuntu.iso      # macOS
Get-FileHash ubuntu.iso       # Windows PowerShell

匹配的檢查總和證明檔案與出版商的雜湊結果相匹配。它並不能證明發行者是合法的:如果攻擊者控制了網站,他們可以替換檔案和檢查總和。簽名的檢查總數 (GPG或Sigstore) 填補了這一差距。

HMAC:使用金鑰進行雜湊

簡單的雜湊證明了完整性,但不是真實性。HMAC將金鑰與訊息結合起來,因此只有擁有金鑰的方才能生成或驗證結果。基於Stripe,GitHub和Slack的Webhook使用HMAC-SHA256簽名,而JWT使用HS256簽名 (http://blog/how-jwt-works) 則使用HMAC-SHA256簽名。

不要透過連線secret + message並對其進行雜湊來構建自己的金鑰雜湊。在MD5,SHA-1和SHA-256中,它容易受到長度擴充套件攻擊。使用每個語言提供的標準HMAC結構。在比較簽名時,使用常量時間比較函式以避免時間攻擊。

密碼需要一個完全不同的工具

不應直接使用MD5或SHA-256來儲存密碼。快速雜湊是缺點:現代GPU每秒計算出數十億個SHA-256雜湊,。沒有鹽的雜湊更糟,因為預先計算的表可以立即破解常見的密碼。

使用密碼雜湊函式,設計為緩慢且難以儲存:

  • 是密碼雜湊競賽的獲勝者,也是當前的首選。
  • 硬記憶和廣泛可用。
  • bcrypt 較老,但仍然可以接受,輸入限制為72位元組。
  • PBKDF2具有高代數,當合規性需要NIST批准的原始。

這些功能增加了每個密碼的獨特鹽和可配置的成本因素,。圖書館處理細節:你打電話給hash(password)和verify(password, stored)。

編碼摘要

摘要是原始位元組,通常顯示為十六進位制 (每位元組兩個字元) 或Base64 (更緊)。同樣的SHA-256摘要是64個六進位制字元或44個Base64字元。副資源完整性屬性使用Base64 (sha384-...),而檢查總和檔案使用hex。更多關於編碼方面的資訊,請參閱[Base64解釋] (http://blog/base64-explained)。

決策指南

  • 完整性檢查,簽名,證書,任何與安全相關的東西: SHA-256 (或SHA-512,SHA-3,BLAKE3)。
  • 使用共享密碼驗證訊息: HMAC-SHA256。
  • 儲存密碼: Argon2id,scrypt 或 bcrypt 永遠不是一個簡單的雜湊。
  • 非對抗性檢查總和或快取金鑰: MD5 有效,但SHA-256是更安全的習慣。
  • 非常高速的非安全雜湊 (雜湊表,碎片): xx雜湊或類似的非加密雜湊。

總結

MD5 和 SHA-1 是為了抗碰撞而破解的,並且不能在攻擊者可以從製作輸入中獲益的情況下使用。SHA-256是安全的,快速的硬體支援和完整性和簽名的正確預設。使用HMAC進行金鑰身份驗證,以及用於密碼的Argon2id等專用緩慢函式。如果懷疑,選擇SHA-256 它永遠不是完整性的錯誤答案,而MD5越來越多。

本頁內容由英文自動翻譯而來,如發現錯誤,歡迎告訴我們。

相關指南