繁體中文

開發者工具 · SHA 雜湊計算器

SHA-256 與 SHA-512:字大小、輪數以及為什麼 512 可以更快

· 工作原理

sha-256 密碼學 效能 瀏覽器 API

32 位元和 64 位元字、64 與 80 輪次以及 256、384 和 512 輸出位元的並排比較
原始 ToolAcre 向量圖

SHA-512 產生較長的摘要,但通常在 64 位元硬體上執行得更快。這篇文章解釋了兩者之間的結構差異以及 SHA-384 如何適應,以便您可以根據事實進行選擇。

哈希值越長,執行速度越快? — 開始比較的反直覺觀察

SHA-512 產生更長的摘要,但在 64 位元硬體上通常比 SHA-256 運行得更快。與直覺相反的觀察結果來自 CPU 設計:針對 64 位元算術最佳化的處理器在相同資料上執行 64 位元運算的速度比執行 32 位元運算的速度更快。 SHA-256 對 32 位元字進行操作,而 SHA-512 則對 64 位元字進行操作。在 64 位元 CPU 上,後者更自然地適合硬件,並且在字大小轉換和填充上花費更少的時間。

這並不會使 SHA-512 本質上更適合每個用例。較長的摘要需要更多的儲存和頻寬。應根據您的輸出大小要求和平台來選擇它們,而不是模糊地「更新」或「更強」。

32 位元與 64 位元字 — 核心結構差異及其適合現代 CPU 的原因

在整個演演算法中,SHA-256 會對 32 位元字進行操作。訊息調度將 16 32 位元字擴展為 64 32 位元字。每輪更新八個 32 位元工作變數。訊息區塊為 512 位元(十六個 32 位元字)。輸出為 256 位元(八個 32 位元字)。所有算術均在 32 位值上完成,並在 2^32 處進行溢出包裝。

SHA-512 對 64 位元字進行操作。訊息調度將 16 64 位元字擴展為 80 64 位元字(不是 64,如 SHA-256 中)。每輪更新八個 64 位元工作變數。訊息區塊為 1024 位元(十六個 64 位元字)。輸出為 512 位元(八個 64 位元字)。所有算術均在 64 位元值上完成,並在 2^64 處進行溢出包裝。

64 輪與 80、512 位元與 1024 位元區塊 — 每個區塊和每個位元組有何變化

SHA-256 每個區塊執行 64 輪; SHA-512 每個區塊執行 80 輪。這意味著 SHA-512 每個區塊會進行更多混合。乍一看,這聽起來比較慢。但較大的字大小和區塊大小意味著 SHA-512 每輪處理更多位元。對於 1 MB 檔案,SHA-256 處理 1048576 / 512 = 2048 個區塊,每個區塊有 64 輪,總共 131072 輪。 SHA-512 處理 1048576 / 1024 = 1024 個區塊,每個區塊有 80 輪,總共 81920 輪。 SHA-512 總共執行的輪次較少,儘管它每個區塊執行的輪次較多。

掛鐘時間的差異取決於 CPU 對字大小的最佳化。具有 64 位元 ALU(算術邏輯單元)的 CPU 將有效執行 64 位元運算。如果同一個 CPU 必須將 32 位元 SHA-256 操作分解為多個微操作或在較小的執行單元上執行它們,則每個操作的成本會更高。現代處理器針對 64 位元操作進行了最佳化,使得 SHA-512 通常更快,儘管每個區塊有額外的輪數。

區塊大小和輪數解釋了每個位元組的工作量;實際吞吐量需要平台基準

區塊算術解釋了為什麼較長的輸出不一定意味著每個位元組需要更多的工作。 SHA-256 對每個 512 位元區塊執行六十四輪,而 SHA-512 對每個 1,024 位元區塊執行八十輪。第二種設計在每個區塊上執行更多輪次,但每次處理一個區塊時都會消耗兩倍的輸入量。

這種結構比較並不能預測特定的瀏覽器基準。 Web Crypto 可以使用本機指令、作業系統庫或其他最佳化程式碼,並輸入長度會改變設定所花費的份額。當吞吐量很重要時測量實際目標環境;此儲存庫僅支援定性宣告,即更寬的字可以適合 64 位元硬體。

輸出長度會影響表示和安全屬性,而無需進行被動攻擊工作估計

SHA-384 不是單獨的演演算法;它是 SHA-512,有兩個變化:初始雜湊常數不同,輸出被截斷為 384 位元(48 位元組),而不是完整的 512 位元。這種截斷有利於抵禦長度擴展攻擊:攻擊者無法透過將資料附加到原始訊息來擴展摘要,因為完整的 512 位元狀態未知(僅揭露了 384 位元)。

SHA-256 容易受到長度擴展攻擊:如果您知道訊息的摘要並知道訊息長度,則可以將資料附加到訊息併計算擴展訊息的摘要,而無需知道原始訊息的內容。這在特定的安全環境中很重要,例如使用弱結構的 HMAC 實作。 SHA-384 儘管基於 SHA-512,但不易受到攻擊,因為完整狀態未公開。這使得 SHA-384 在 SHA-256 被認為有風險的情況下很有用。

工作範例 - 將一個輸入與所有三個輸入進行雜湊並並排比較摘要長度

輸出大小是最直接的差異。 SHA-256 產生 32 個位元組(64 個十六進位字元);SHA-384 產生 48 個位元組(96 個十六進位字元);SHA-512 產生 64 個位元組(128 個十六進位字元)。對於 URL 或 JSON 中的存儲,較長的摘要會佔用更多空間。對於碰撞抵抗,較長的輸出使得碰撞的發現變得更加困難。更寬的輸出提供了更大的結果空間,而它們的直接結果更容易測量:儲存、URL 和協定欄位中的位元組數更多。本文沒有附加攻擊工作估計,因為沒有任何估計是從儲存庫證據中得出的。

一些系統和標準明確指定 SHA-256 ;其他人使用 SHA-512 或允許選擇。 SSH 指紋預設為 SHA-256;容器映像摘要可以是 SHA-256 或 SHA-512。像 npm 這樣的套件管理器使用 SHA-512 來確保子資源的完整性。選擇通常是為您做出的,但了解差異可以讓您在有發言權時做出明智的選擇。

這不包括——吞吐量資料,這取決於 CPU、編譯器和輸入大小;帖子保持品質

ToolAcre SHA 哈希計算器提供 SHA-256、SHA-384 和 SHA-512。使用所有三個哈希相同的輸入並觀察輸出長度。這些摘要將彼此完全不同,這是預期的:演演算法使用不同的輪常數、不同的訊息調度和不同的混合操作。摘要旁邊顯示的位元組數僅反映輸入大小,而不反映輸出大小;所有三種演演算法透過各自的輪序列以相同的方式處理相同的輸入位元組。

在您自己的硬體上進行測試可以揭示效能差異。使用每種演演算法對一個大檔案(一個多兆位元組的測試案例)進行雜湊處理並對結果進行計時。在現代 64 位元系統上,SHA-512 通常會在更短的掛鐘時間內完成,即使位元組計數可能表示情況並非如此。在 32 位元系統或嵌入式處理器上,SHA-256 可能會更快,因為 CPU 的 ALU 針對 32 位元操作進行了最佳化。

重點:按輸出大小和平台進行選擇 - ToolAcre SHA 雜湊計算器提供 SHA-256、SHA-384 和 SHA-512,因此您可以在相同輸入上查看所有三個

加密強度與性能是分開的。儲存庫不會將 SHA-256 標記為已損壞,並選擇它作為通用預設值。產品證據並不能證明任何原始產品都是普遍安全的。適用性仍然取決於構建和威脅模型。從 SHA-256 切換到 SHA-512 不是安全升級;這是儲存和效能的權衡。如果您的系統指定 SHA-256 並您需要該精確演演算法,請使用它。如果您有選擇並想要更長的摘要,或者您知道您的平台是 64 位,則 SHA-512 是一個有效的選擇。

瀏覽器的 Web Crypto 實作透過 crypto.subtle.digest 計算所有三個。您的裝置、瀏覽器版本和後台系統負載都會影響觀察到的效能。但關鍵點仍然是:SHA-256 和 SHA-512 並不是在爭奪「最佳雜湊函數」的頭銜。它們是為不同的輸出要求而設計的工具,它們之間的選擇是根據您的系統需求而不是一般的性能要求進行的。