開發者工具 · SHA 雜湊計算器
長度擴充攻擊:為什麼 SHA-256(secret + message) 不是 MAC
· 為什麼它很重要
sha-256 密碼學 安全
在訊息中新增秘密並對其進行雜湊處理看起來像是身份驗證,但 SHA-256 的結構允許攻擊者在不知道秘密的情況下擴展訊息。這篇文章解釋了攻擊和修復。
自製請求簽章 — hash(secret + body) 以及為什麼它感覺安全
開發人員需要訊息身份驗證,但缺乏 HMAC 知識,因此他們將秘密與訊息連接起來並對結果進行雜湊處理。這種方法乍看之下很安全:輸出是固定大小的指紋,如果有人修改訊息,指紋就會改變。然而,SHA-256 有一個稱為長度擴展的架構缺陷,攻擊者可以將資料附加到訊息中並在不知道秘密的情況下計算有效的摘要。 ToolAcre SHA 雜湊計算器僅計算普通摘要,而不計算金鑰身份驗證,因為這種差異對於真正的安全性很重要。
在雜湊之前預先新增一個秘密在直覺上很有吸引力,因為只有秘密持有者才能重新計算雜湊。如果訊息發生變化,雜湊值也會發生變化,因此它看起來像是真實性的證明。 API 可以透過連接共用金鑰和請求正文來對請求進行簽名,然後對結果進行雜湊處理並將該雜湊值包含在請求中。伺服器接收正文,用其密鑰副本重新計算雜湊值,並檢查其是否匹配。如果攻擊者更改主體,雜湊值將不匹配——至少開發人員是這麼認為的。
Merkle–Damgård 洩漏其狀態 — 最終摘要是內部狀態,因此攻擊者可以從您停止的位置繼續進行散列
SHA-256 屬於 Merkle–Damgård 雜湊函數家族。這些函數處理固定大小區塊中的輸入,連結一個壓縮函數,該函數採用先前狀態和當前區塊並輸出新狀態。壓縮函數是內部唯一的加密原語;連結策略和填充方案使整個建置工作正常進行。最終摘要只是以十六進位列印的最終狀態。這並非偶然:輸出是內部状態。任何看到摘要的人都擁有從該點繼續散列所需的確切狀態。
為了擴展訊息,攻擊者從觀察到的 Secret + Original_message 摘要開始,並將其視為新壓縮函數呼叫的狀態變數。他們附加想要新增的資料,正確填充完整的新訊息長度,然後計算摘要。當伺服器透過預先考慮自己的秘密和雜湊來驗證此偽造的摘要時,在吸收初始秘密後,計算的進行與攻擊者的計算相同。伺服器計算相同的摘要,並在攻擊者完全不知道秘密的情況下接受偽造的訊息。
擴展的工作原理 — 附加填充和額外資料來為更長的訊息偽造有效的雜湊值
不同的演演算法受長度擴展的影響不同。 SHA-1 存在漏洞:攻擊者可以觀察 SHA-1 摘要並擴充訊息。 SHA-256 也同樣容易受到攻擊。 SHA-512 也容易受到擴充攻擊。 SHA-384 抵抗長度擴展,因為它被建構為 SHA-512 截斷為 384 位元。壓縮函數輸出比發布的摘要長,因此攻擊者沒有足夠的資訊來繼續散列。 SHA-3 中使用的海綿結構也具有抵抗力,因為它不會洩漏內部狀態。
要了解哪些演演算法容易受到攻擊,需要了解壓縮函數大小與發佈的摘要大小之間的關係。 SHA-256 發佈 256 位,壓縮函數狀態也是 256 位,因此摘要是整個狀態。攻击者擁有继續攻击所需的一切。 SHA-384 發佈 384 位,但底層壓縮函數狀態是 512 位,因為 SHA-384 建構在 SHA-512 之上。摘要只顯示 512 位元中的 384 位,而攻擊者不知道 128 位。這是 SHA-384 的有意設計屬性,提供了這種阻力。
支援的 SHA-1、SHA-256 和 SHA-512 結構公開完整狀態; SHA-384 截斷變更擴展邊界
使用共用金鑰對訊息進行驗證的修復方法是 HMAC,即金鑰雜湊訊息驗證碼。 HMAC 不會預先添加秘密和雜湊值;相反,它使用稱為內部填充和外部填充的特定填充方案在兩個嵌套哈希運算中應用秘密。建構為 HMAC(secret, message) = SHA256(secret_XOR_outer_pad, SHA256(secret_XOR_inner_pad, message))。這種嵌套方法縮小了長度擴展差距,因為即使攻擊者擁有內部哈希的摘要,他們也無法在沒有秘密的情況下繼續進行哈希處理。
將摘要和 HMAC 操作分開的原因是為了避免將兩者互換對待的常見錯誤。透過兼具這兩種功能的工具來學習哈希的開發人員可能會忘記在編寫程式碼時使用的是哪一種。保持摘要計算分離使得選擇更加明確,並強化了身份驗證需要 HMAC 或簽名的知識。 ToolAcre SHA 哈希計算器清楚地標記了普通摘要,並檔案解釋了 HMAC 是完全不同的操作。
HMAC 作為修復 - 縮小間隙的嵌套結構以及為什麼它是標準答案
長度擴展的概念範例適用於熟悉的測試向量 abc。對 ASCII 文字 abc 計算 SHA-256 會產生摘要 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad。假設此摘要是 Secret + abc 使用 5 位元組秘密進行雜湊處理的結果,總共給出 8 位元組的輸入。 SHA-256 處理 64 位元組區塊中的輸入,因此第一個也是唯一的區塊用訊息長度和其他填充位元組填充。攻擊者看到摘要並想要偽造一條以 abc 開頭、後面跟著額外資料的訊息。
它們無法直接附加到 abc,因為它們不知道在雜湊中新增的確切填充。但是,他們可以計算完整填充的訊息必須是什麼:abc 加上 8 位元組輸入到 64 位元組區塊所需的填充。然後,他們附加額外的資料,計算新總長度的填充,並透過將觀察到的摘要視為起始狀態來對組合進行雜湊處理。結果是伺服器將接受的有效 SHA-256 摘要,因為它預先考慮了機密併計算相同的雜湊值。
工作範例 — 在沒有即時目標的情況下擴展簽署訊息的概念演練
為了在真實系統中防止這種攻擊,開發人員不應嘗試從純雜湊建立身分驗證。 HMAC 是標準答案,而 ToolAcre SHA 雜湊計算器是一種計算簡單摘要的工具,用於完整性檢查、內容雜湊和類似的非身份驗證目的。安全使用普通 SHA-256 摘要的範例包括檔案校驗和,其中攻擊者無法同時控製檔案和摘要;內容可尋址存儲,其中哈希是查找鍵;數位簽章與簽章相結合,其中簽章提供身分驗證。
此問題的全部範圍包括瀏覽器提供的其他演演算法。 SHA-1 很容易受到長度擴展的影響,並在變得相關之前就已經被加密破解。 ToolAcre 計算器將 SHA-1 標記為僅舊版,並解釋了使其不適合新應用程式的衝突攻擊。對於新應用程序,SHA-256 是普通摘要的明智選擇,如果需要身份驗證,帶有 SHA-256 的 HMAC 就是答案。 SHA-384 和 SHA-512 都容易受到攻擊,但 SHA-384 受到截斷保護。
這不包括什麼 - ToolAcre 計算器計算簡單的摘要,而不是 HMAC;這篇文章解釋了為什麼這種區別很重要
在建構雜湊函數的心智模型時,Merkle–Damgård 構造和長度擴展成為關鍵概念。雜湊函數必須處理任意輸入長度並產生固定輸出。它的實作方式是逐塊連結壓縮函數,最終狀態轉換為輸出的方式非常重要。如果完全輸出最終狀態,則該輸出包含繼續散列所需的所有資訊。如果最終狀態被截斷,則部分被隱藏。
對於第一次閱讀長度擴展攻擊的開發人員來說,問題是如何知道它是否會影響他們的用例。如果雜湊的輸入是公共常數且雜湊用作查找密鑰或指紋,則長度擴展無關緊要。如果當雙方共用秘密時使用雜湊來驗證訊息,則長度擴展是一個嚴重的漏洞,而 HMAC 就是修復方案。 ToolAcre SHA 雜湊計算器顯示摘要和位元組計數,清楚地表明這些是計算輸出,而不是身份驗證機制。
重點:使用 MAC 進行驗證 — ToolAcre SHA 雜湊計算器用於完整性摘要;驗證需要 HMAC 或簽名
將其應用於生產系統,原理很簡單:當涉及機密時,切勿使用裸雜湊進行身份驗證。 HMAC 是完全封閉長度擴展攻擊向量的標準結構。如果正確使用,SHA-256 和 SHA-384 都可以安全地實現其預期目的。了解三個關鍵點(Merkle–Damgård 在摘要中顯示其狀態、SHA-384 截斷以隱藏部分狀態以及 HMAC 使用嵌套結構來防止擴展)為開發人員提供了做出正確選擇的工具。
ToolAcre SHA 雜湊計算器體現了這一教學:它提供了用於學習和合法的非身份驗證用途的簡單摘要,它將 SHA-1 標記為遺留,並它不實現 HMAC,因為該操作屬於不同的上下文。當開發人員使用簡單的雜湊計算器來驗證請求時,該工具的定位和檔案會引導他們將 HMAC 和簽章作為正確的工具。 ToolAcre 工具包專注於瀏覽器的 Web Crypto 直接提供的內容,並解釋每個原語適用的邊界。