SHA-512 是一種在 NIST FIPS 180-4 中規範的 512 位元加密雜湊演算法,而「加鹽的 SHA-512 密碼雜湊」是指將含有鹽的密碼字串輸入該演算法,以取得一個確定性的 128 字元十六進位摘要的運算。鹽並非祕密——它是每個密碼專屬的隨機位元組字串,在位元組經由 SHA-512 壓縮函式以 1024 位元區塊進行填補與處理之前,會與密碼串接(或其他方式結合)。您得到的輸出,與對任何其他位元組序列進行雜湊所得到的 512 位元摘要完全相同:64 個位元組,以 128 個小寫十六進位字元或標準填補式 Base64 來表示。這一點很重要,因為許多讀者會誤以為加鹽雜湊會產生更長或格式不同的字串,但 SHA-512 演算法本身並沒有鹼欄位的概念——鹽只會改變輸入的位元組。輸入的每個位元組,包括鹽以及密碼的每個位元組,在演算法執行時都會被完整保留。鹼必須與儲存的摘要一起保存,日後才能透過重建完全相同的位元組序列並再次雜湊,來重新驗證密碼。

鹼如何進入 SHA-512 處理流程
鹼是一個非機密的值,由您為每個密碼產生一次,並與摘要一起儲存。它的作用是讓兩位恰好選擇相同密碼的使用者產生不同的摘要,並抵禦針對未加鹼雜湊所預先計算的彩虹表。在 SHA-512 的工作流程中,鹼只是一段位元組字串,您在呼叫演算法之前將它與密碼位元組串接。常見的兩種順序是 salt || password 和 password || salt;您選擇的協定在驗證時必須以完全相同的方式套用。無論您選擇哪種順序,鹼本身並不會被 SHA-512 單獨轉換——它會作為普通輸入資料被送入,混入經填補後成為一個或多個 1024 位元區塊的訊息中。
無論加鹼後的輸入長度為何,SHA-512 所產生的摘要一律為 64 個位元組。一個 16 位元組的密碼搭配 16 位元組的鹼,雜湊後仍是 64 位元組的輸出。這個特性正是 SHA-512 成為固定長度雜湊的原因:演算法會丟棄輸入的結構資訊,並回傳一個長度完全由演算法(而非訊息)決定的摘要。正如 NIST 規範所述,訊息會被切割成 1024 位元的區塊,每個區塊會展開為 80 個字的排程,然後更新 8 個 64 位元的狀態值;最終狀態會串接起來,形成 512 位元的結果。
Sha512 雜湊產生器的輸出內容
Sha512 雜湊產生器會計算 UTF-8 文字或本機檔案原始位元組的完整、未加鹼 SHA-512 摘要。它會以兩種編碼方式回傳結果:128 個小寫十六進位字元,以及標準的填補式 Base64,兩者皆代表同一組 64 個摘要位元組。運算會在瀏覽器本地端執行,因此無論是訊息或檔案都不會上傳至應用程式伺服器。
這個工具「不做」的事與它「會做」的事一樣重要。它不會加入鹼、不會套用任何金鑰延伸、不會以工作量因子執行多輪運算,也不會儲存任何東西。若您在文字欄位中貼上 password123 並按下產生按鈕,您得到的摘要正好就是 password123 的 UTF-8 編碼經 SHA-512 運算的結果——不多也不少。內部沒有任何加鹼邏輯、沒有帳號上下文,也沒有混入輸出的祕密胡椒值。這是刻意的設計:這個工具是完整性與參考雜湊的工具,而非憑證儲存的基本元件。瀏覽器的輸入上限為 100 MB,因此非常大的檔案需要使用支援串流的命令列實作來進行雜湊。
逐步建立加鹼的 SHA-512 雜湊
由於此工具接受原始位元組與文字,您可以先在工具外部預先組合密碼與鹼,再將組合後的位元組送入,藉此自行計算加鹼的 SHA-512 雜湊。下列步驟會逐步說明標準流程,並在最後提供一個計算位元組數的範例。
- 從密碼學安全的來源,以鹼為一道隨機位元組字串。常見的大小為 16 位元組(128 位元);您可以將它以原始位元組、十六進位或 Base64 形式儲存——任選一種表示方式並保持一致即可。
- 將密碼轉換為其 UTF-8 位元組表示。對 ASCII 密碼而言,這與可見字串一致;若密碼包含重音符號、表情符號或非拉丁字元,則必須確保編碼器為 UTF-8,而非舊式的代碼頁。
- 決定組合規則。常見的選擇包括 salt || password、password || salt,或更複雜的構造,例如固定分隔符。請將規則記錄下來——驗證端必須套用完全相同的規則。
- 依所選順序串接位元組。若您的鹼是以 22 個 Base64 字元儲存,代表 16 個位元組,請先將其解碼回原始位元組,再與 UTF-8 密碼位元組串接。請避免將可見的 Base64 字串直接與密碼字串串接,因為這樣會將不同的位元組序列送入 SHA-512。
- 將組合後的位元組序列貼入 Sha512 雜湊產生器。若鹼剛好是有效的 UTF-8 文字,您可以直接以文字模式貼入。若它是任意的二進位資料,請將串接好的位元組寫入檔案,並在檔案模式下選擇該檔案,以便對原始位元組(而非將其當作文字解讀)進行雜湊。
- 按下產生按鈕,並複製 128 字元的十六進位輸出(或 88 字元的填補式 Base64,視您的儲存系統所需而定)。請將鹼與所選的組合規則一併記錄在摘要旁。
- 若要驗證,請從儲存的鹼與使用者提供的密碼重新計算相同的串接結果,透過相同的工具執行,並逐字元比對輸出與儲存的摘要。
位元組數計算範例:密碼 hunter2 = 7 個 UTF-8 位元組;鹼 = 16 個隨機位元組;串接輸入 = 7 + 16 = 23 個位元組;上述 23 個位元組的 SHA-512 = 64 個摘要位元組;64 位元組 × 2 = 128 個十六進位字元;ceiling(64 ÷ 3) × 4 = 88 個 Base64 字元。這個算式說明了為何無論加鹼後的輸入長度為何,輸出長度始終相同。
SHA-512 與相關雜湊函式的比較
512 位元的 SHA-2 系列包含幾個表面上相似、但即使輸入相同也會產生不同輸出的成員。選擇正確的成員很重要,因為截斷或重新初始化的變體永遠不會與完整的 SHA-512 摘要相符。
| 變體 | 輸出位元數 | 輸出十六進位字元數 | 備註 |
|---|---|---|---|
| SHA-512 | 512 | 128 | 完整的 512 位元 SHA-2 成員;本工具所產生的結果 |
| SHA-512/256 | 256 | 64 | 不同的初始雜湊值;並非 SHA-512 的截斷版本 |
| SHA-512/224 | 224 | 56 | 不同的初始雜湊值;並非 SHA-512 的截斷版本 |
| SHA-384 | 384 | 96 | 使用不同初始向量(IV)的截斷式 SHA-512 |
| SHA-256 | 256 | 64 | 32 位元字版本的變體;完全獨立的演算法 |
位元組數與編碼長度之間的關係是固定的:每個摘要位元組會剛好對應兩個十六進位字元,而每三個摘要位元組會剛好對應四個填補式 Base64 字元。因此 64 個摘要位元組一律會呈現為 128 個十六進位字元,以及 88 個 Base64 字元(末端帶兩個 = padding)。
為何加鹼的 SHA-512 摘要並非密碼雜湊
為 SHA-512 加入鹼可防止預先計算的彩虹表攻擊,並確保兩個相同的密碼產生不同的摘要,但這並不足以讓此構造單獨適用於密碼儲存。SHA-512 是一種通用雜湊,設計上在一般 CPU 上執行極快,在 GPU 與 ASIC 上甚至更快。現代硬體每秒可在單一核心上計算數十億次 SHA-512 雜湊。當攻擊者取得一份含有加鹼 SHA-512 摘要的外洩資料庫時,這種速度會直接轉化為離線猜測吞吐量:每組候選密碼都可以每秒被加鹼並雜湊數百萬次,直到找到相符項。
密碼儲存需要的是刻意變慢的雜湊函式,以抵禦 GPU 平行的方式配置記憶體,並讓操作者能調整工作量參數以跟上硬體進展。建議用於憑證儲存的專用構造為 Argon2id、scrypt 與 bcrypt,它們皆原生接受鹼,並回傳一個內含演算法、成本參數與鹼的自含字串。這些函式會輸出類似 $argon2id$v=19$m=65536,t=3,p=4$<salt>$<digest> 的字串,這與原始 128 字元十六進位的 SHA-512 摘要是截然不同的產物。如需深入了解密碼儲存工作流程,請參閱以正確方式產生 SHA-512 密碼雜湊。
比對加鹼 SHA-512 輸出與參考值
一旦取得摘要,將其與經驗證的參考值逐字元比對的價值,怎麼強調都不為過。SHA-512 是確定性的,並且對每個位元組都極為敏感:變更單一字元、將 \n 換成 \r\n、對 Unicode 進行正規化,或加入位元組順序記號(BOM),都會產生完全不同的 128 字元輸出。空輸入也是有效的訊息,其標準摘要開頭為 cf83e135;若某個工具對空欄位回傳不同的值,則代表有問題。
- 將鹼與密碼視為單一的位元組序列。任何差異——包括空白字元、換行字元或字元編碼——都會產生無法相符的摘要。
- 確認接收端預期的是完整的 512 位元 SHA-512,而非 SHA-512/256、SHA-512/224 或 SHA-384。即使輸入相同,這些變體也不會與完整的 SHA-512 輸出相符。
- 透過經驗證的管道傳遞預期的參考值。更長的摘要無法修補來源不可信的事實。
- 應明確地產生摘要,而不是將空欄位解讀為「不執行運算」。空輸入是有效的,並會產生其自身明確定義的輸出。
針對檔案與大型訊息的通訊協定級完整性檢查,Sha512 雜湊產生器是合適的基本元件,而完整的 512 位元輸出也正是 FIPS 180-4 所規範的內容。然而,就憑證儲存而言,面對「以鹼產生 SHA-512 密碼雜湊」這類搜尋,正確的回應是徹底遠離原始的 SHA-512,並改用具備適當工作量參數的專用密碼雜湊函式。