SHA-256 雜湊生成器

在瀏覽器中通過 Web Crypto API 計算文字、十六進位位元組或任意檔案的 SHA-256 摘要。把官方公佈的校驗值貼上到「對比」框,即可驗證下載的檔案。

全部演算法

完全在瀏覽器中執行,不會上傳任何資料。

使用方法

  1. 輸入或貼上文字,切換為十六進位位元組輸入,或開啟要校驗的檔案。
  2. 保持 SHA-256 演算法,選擇小寫十六進位、大寫十六進位或 Base64 輸出。
  3. 把下載頁面上的校驗值貼上到「對比」框,顯示「一致」即說明檔案完全相同。
  4. 複製結果,或在「全部演算法」表格中複製 SHA-384、SHA-512 等其他摘要。

什麼是 SHA-256?

SHA-256 是 SHA-2 家族中使用最廣泛的成員,由 NSA 設計,NIST 於 2002 年在 FIPS 180-2 中將其標準化。現行規範是 FIPS 180-4,RFC 6234 則給出了同一組演算法的參考程式碼。SHA-256 以 512 位為一塊,經過 64 輪 32 位運算,輸出 256 位摘要,即 64 個十六進位字元或 44 個 Base64 字元。目前沒有已知的實用碰撞攻擊或原像攻擊,它是以下場景的預設選擇:

  • TLS 證書與握手,以及程式碼簽名;
  • 比特幣:區塊雜湊、工作量證明和交易 ID 都使用兩次 SHA-256(Base58Check 地址中的校驗和也來自這一雙重雜湊);
  • SHA256SUMS 等校驗檔案、容器映象摘要(sha256:...)以及子資源完整性(SRI)。

校驗下載的檔案

開啟下載好的檔案,把釋出者提供的校驗值貼上到「對比」框。字母大小寫無關緊要,Base64 形式的值也可以。顯示「一致」說明檔案與生成校驗值時的檔案逐位元組相同,但這並不能證明檔案出自誰手,所以校驗值應取自發布者的 HTTPS 網站或經過簽名的 SHA256SUMS 檔案,而不是提供下載的那個映象站。

對文字而言,雜湊針對的是位元組而不是字元。Windows 換行符(CRLF)、位元組順序標記(BOM),或者用 UTF-16 代替 UTF-8,都會得到完全不同的 SHA-256。可以通過「文字編碼」或十六進位輸入,準確還原其他系統所雜湊的位元組。

長度擴充套件攻擊與密碼儲存

與 MD5、SHA-1 和 SHA-512 一樣,SHA-256 存在長度擴充套件問題:已知 SHA-256(secret + message) 和金鑰的長度,攻擊者無需知道金鑰本身,就能為原訊息加上填充和任意追加資料後的內容算出有效的雜湊。需要用金鑰簽名或認證資料時,請使用 HMAC 生成器中的 HMAC-SHA256,而不是把金鑰和訊息拼在一起雜湊。

正因為速度快,直接用 SHA-256 儲存密碼並不合適:拿到雜湊的人可以用顯示卡全速嘗試猜測,而且相同的密碼會得到相同的雜湊。請使用 Argon2id、scrypt、bcrypt,或迭代次數足夠高的 PBKDF2-HMAC-SHA256,它們都會加鹽。

在命令列和程式碼中計算 SHA-256

$ printf 'abc' | sha256sum
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad  -

sha256sum -c SHA256SUMS                  # Linux:校驗列表中的所有檔案
shasum -a 256 file.iso                   # macOS
certutil -hashfile file.iso SHA256       # Windows
Get-FileHash file.iso                    # PowerShell(預設演算法即 SHA256)

# Python
hashlib.sha256(data).hexdigest()

// Node.js
crypto.createHash('sha256').update(data).digest('hex')

abc 的結果是標準中的測試向量,在上方輸入 abc 即可看到相同的值。「全部演算法」表格還會列出你輸入內容的 SHA-384、SHA-512、SHA-1、MD5 和 CRC 值。

編碼範例

輸入 (UTF-8)SHA-256
Hello, World!dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
Base64.is63f2f446bc11a1f96175c0f77bdac08ca1b184ba42c3a42c34ddcbce00b1b800
你好670d9743542cae3ea7ebe36af56bd53648b0a1126162e78d81a32934a711302e

常見問題

SHA-256 可以解密嗎?

不能。SHA-256 是單向雜湊,不是加密。網上的「解密」工具只是在已知輸入的雜湊表裡查詢,能查到常見密碼和短字串,卻查不到任何較長或隨機的內容。

為什麼我算出的 SHA-256 與官方公佈的不一致?

最常見的原因是下載不完整或版本不同,或者雜湊的是檔名而不是檔案本身。請用「開啟檔案」載入檔案。另外要確認兩者是同一種演算法:128 個字元的十六進位值來自 SHA-512 等 512 位雜湊,而不是 SHA-256。

如何得到 Base64 格式的 SHA-256?
把輸出格式設為 Base64。子資源完整性(sha256- 開頭的值,不過 sha384- 更常見)和 HTTP Content-Digest 頭使用的都是這種格式。十六進位和 Base64 表示的是同樣的 32 個位元組,可以用 Base64 轉十六進位互相轉換。
SHA-256 和 SHA-2 是一回事嗎?

SHA-2 是一個家族,包括 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256,SHA-256 是其中最常用的一個。SHA-3(FIPS 202)則是基於 Keccak 的另一套設計,結果完全不同。

SHA-256 值有多長?
32 位元組:十六進位為 64 個字元,Base64 為 44 個字元,並以 = 結尾。SHA3-256 和 BLAKE2s 的長度相同,遇到未知雜湊時可以用雜湊識別工具列出可能的演算法。