SHA-512 是一種單向加密函式,定義於 NIST FIPS 180-4,可將任意位元組序列壓縮成固定的 512 位元摘要,通常以 128 個字元的全小寫十六進位字串,或加上填補的標準 Base64 表示。當您產生一個 SHA-512 密碼雜湊時,您是在要求演算法將輸入「指紋化」成剛好 64 個位元組,看起來隨機但完全具確定性:相同的輸入永遠會產生相同的摘要,而單一位元組改動就會產生完全不同的摘要。SHA-512 雜湊產生器 在瀏覽器中對精確的 UTF-8 文字或本機檔案位元組執行完整的 FIPS 180-4 運算,回傳全部 64 個位元組(以 128 個小寫十六進位字元加上帶填補的 Base64 表示),且絕不上傳所選的訊息或檔案。空文字是一個有效訊息,其公開的摘要開頭為 cf83e135,因此將欄位留白會產生一個真實的雜湊,而非一個空值。輸出是指紋,而不是加密後的密碼;摘要中沒有任何資訊能讓您還原原始文字。

generate sha512 password hash
以正確的方式產生 SHA-512 密碼雜湊

SHA-512 實際上會產生什麼

SHA-512 中的 512 代表的是輸出摘要的長度(以位元為單位),而非輸入訊息的任何屬性。該演算法使用 64 位元字組,將訊息填補為 1024 位元的區塊,將每個區塊展開為 80 字組排程,並更新八個 64 位元的狀態值,最終將其串接起來即為 512 位元的結果。由於每個輸入位元組都會影響排程與狀態,任何隱形的變更 —— 一個尾端空白字元、一次 Unicode 正規化步驟、檔案開頭的位元組順序標記,或不同的行尾符號 —— 都會產生完全不同的摘要。逐位元組相同的輸入永遠會產生相同的摘要;演算法本身內部並沒有隨機的鹽。

變體輸出位元數十六進位長度定義於初始化常見用途
SHA-512512128FIPS 180-4標準初始向量完整性驗證、大型識別碼
SHA-512/25625664FIPS 180-4不同的初始向量在 64 位元硬體上產生更快的 256 位元摘要
SHA-512/22422456FIPS 180-4不同的初始向量截斷式 SHA-2 變體
SHA-38438496FIPS 180-4不同的初始向量需要 384 位元摘要的通訊協定

這些列展示了以 SHA-512 相同壓縮函式為基礎、經正式定義的 SHA-2 成員。每一列都是一種獨立的演算法,具有各自的初始化值與各自的公開測試向量,因此上方的精確數字來自 FIPS 180-4 規格,而非本頁面上執行的任何運算。

如何在瀏覽器中產生 SHA-512 雜湊

  1. 在瀏覽器中開啟 SHA-512 雜湊產生器。
  2. 選擇輸入模式:UTF-8 文字或本機檔案。貼上精確的字串,或選擇您要指紋化的精確檔案。保留每個位元組,包括尾端空白、行尾符號以及任何位元組順序標記。
  3. 觸發計算。瀏覽器在本機執行 SHA-512 運算,因此訊息與檔案都不會被上傳到應用程式伺服器。
  4. 讀取 128 個字元的全小寫十六進位結果與帶填補的 Base64 結果。兩者代表相同的 64 個摘要位元組。
  5. 複製您下游消費者所預期的表示形式:在大多數檔案與完整性工作流程中使用完整的 128 字元十六進位,或在下一步是 JSON 承載、JWT 區段,或已使用 Base64 的系統時使用帶填補的 Base64。請勿手動將十六進位截斷為 64 或 96 個字元。
  6. 將每個字元與由工件發布者或 NIST/RFC 來源所公布的受信參考值進行比對。將受信參考值視為與工件本身不同的獨立物件,並明確將儲存值標示為完整 SHA-512。

SHA-512 適用於密碼雜湊的時機

「SHA-512 密碼雜湊」這個詞彙本身具有真正的歧義,而這種歧義至關重要。如果您是為了將密碼儲存到資料庫而對其進行雜湊,那麼原始的 SHA-512 是錯誤的工具。SHA-512 的設計刻意求快,而這樣的速度會讓離線猜測在面對任何外洩資料庫時都變得非常便宜:一張現代 GPU 每秒可計算數十億次 SHA-512。真正的密碼儲存機制會結合每個使用者唯一的鹽以及一個記憶體密集、刻意求慢的函式。Argon2id 是目前的預設選擇,scrypt 與 bcrypt 則是廣為接受、同樣需要調整工作參數的替代方案。SHA-512 雜湊產生器明確不加入任何鹽、任何拉伸、任何帳號脈絡,也沒有伺服器端的秘密胡椒值,因此其產生的值無法單獨作為儲存的密碼雜湊使用。

此產生器適合的使用情境是當「密碼」實際上指的是一個共用秘密字串或 passphrase,而您需要對其進行指紋化以進行完整性檢查、組態稽核、與發布的廠商摘要進行比對,或在建置腳本中作為確定性識別碼時。軟體發行說明、套件管理工具、容器註冊中心與組態清單經常會發布工件與秘密的 SHA-512 摘要以供驗證,而這正是本工具所支援的工作流程。該摘要也適合作為 HMAC-SHA-512 的內部雜湊,其中的共用秘密提供了 SHA-512 本身無法提供的認證機制。

解讀 128 字元的十六進位與 Base64 輸出

SHA-512 摘要是 64 個位元組。每個位元組的範圍從 0 到 255,兩個小寫十六進位字元即可涵蓋該範圍,因此正式的十六進位表示恰好是 128 個字元,不含分隔符、前綴或換行。帶填補的 Base64 表示使用 64 字元字母表對相同的 64 個位元組進行編碼,並加入填補使長度為 4 的倍數;對於 64 個位元組,帶填補的 Base64 輸出長度為 88 個字元。前提是您在進行任何位元組層級的比較前,先將 Base64 解碼回原始位元組,否則這兩種字串描述相同的摘要且可互換。將十六進位字串與 Base64 字串逐字元進行比較時,即便它們描述的是相同的摘要,結果看起來也永遠不同。

以一個具體的參考為例:三個位元組的 ASCII 字串 abc 的 SHA-512 摘要,是開頭為 ddaf35a193617aba 並持續至完整 128 字元的十六進位字串。該值是已發布的 FIPS 180-4 測試向量之一,且產生器可獨立重現該結果。在您信任工具用於真實工件之前,重現一個已知的向量是確認該工具已正確實作演算法的最便宜方式。

哪些因素會改變 SHA-512 摘要

輸入的每個位元組都會影響最終摘要,因此最常見的驗證失敗並非來自演算法錯誤,而是來自訊息本身隱形的變更。在雜湊之前新增或移除一個尾端換行字元會改變摘要。在 UTF-8 檔案開頭新增或移除一個位元組順序標記會改變摘要。在雜湊之前透過字元集解碼器將二進位檔案當作文字進行解碼,可能會改寫非文字位元組並改變摘要。在進行 SHA-512 之前將輸入重新編碼為 UTF-16(部分舊版工具預設會這麼做),會改變每一個非 ASCII 位元組,進而改變摘要。當消費者實際預期的是 SHA-512/256 或 SHA-384 時,卻對手動截斷的 SHA-512 十六進位字串進行雜湊,會產生一個與完整長度參考值不符的短值。將新產生的摘要與從螢幕上複製(而該螢幕上的十六進位已自動折行成兩行)的參考值進行比對時,會在比較中悄悄插入一個換行字元,導致檢查失敗。

與受信參考值進行驗證

驗證是兩個獨立工件之間的比較:您剛剛雜湊的檔案或字串,以及透過您所信任的管道取得的參考摘要。只有當雙方在每一個位元組上都達成一致時,SHA-512 才能讓驗證變得容易,這就是為什麼比對是逐字元而非近似比對。產生器中內建八個黃金測試案例,涵蓋空序列、abc、FIPS 多區塊訊息、標點符號變化、UTF-8 輸入、任意二進位位元組以及常見的英文文字;預期值會與 NIST 與 RFC 來源 進行比對,並透過 OpenSSL 獨立重現。如果廠商在下載連結旁公布 SHA-512 摘要,請透過您信任的連線取得該檔案,使用本產生器在本機對其進行雜湊,並在將該檔案視為可信之前,逐字元比對每一個十六進位字元。更長的摘要並無法修補一個不受信任的參考來源;預期值仍必須透過經認證的管道取得,當問題在於「是誰產生了該檔案」而非「其位元組在傳輸過程中是否遭到變更」時,HMAC-SHA-512 或公鑰簽章才是正確的建構方式。

延伸閱讀:如何以正確的方式將文字轉換為二進位。

延伸閱讀:批次密碼產生:安全的本機工作流程。