SHA-1 雜湊生成器

隨輸入即時計算文字、十六進位位元組或檔案的 160 位 SHA-1 摘要,可與公佈的校驗值對比,並一併檢視同一輸入的 SHA-256、SHA-512 和 MD5。

全部演算法

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

使用方法

  1. 輸入文字、切換為十六進位位元組輸入,或開啟檔案。
  2. 演算法預設為 SHA-1,如需對照其他雜湊函式,可在「演算法」中切換。
  3. 選擇小寫十六進位(與 sha1sum 和 Git 的輸出一致)、大寫十六進位或 Base64。
  4. 把預期的 SHA-1 貼上到「對比」框,頁面會顯示「一致」或「不一致」。

什麼是 SHA-1?

SHA-1(Secure Hash Algorithm 1)由美國國家安全域性(NSA)設計,NIST 於 1995 年在 FIPS 180-1 中釋出,取代了很快被撤回的 SHA-0。現行規範是 FIPS 180-4,RFC 3174 還附有 C 語言範例程式碼。SHA-1 以 512 位為一塊、經過 80 輪運算,輸出 160 位摘要,即 40 個十六進位字元或 28 個 Base64 字元。

和所有雜湊一樣,SHA-1 是單向的:摘要無法解密,只能通過逐個計算猜測值的雜湊來匹配。2012 年 LinkedIn 洩露的未加鹽 SHA-1 密碼雜湊就是這樣被大批破解的。儲存密碼應當使用 Argon2、scrypt、bcrypt 或 PBKDF2。

SHAttered:SHA-1 為何被棄用

2017 年 2 月,荷蘭 CWI 與 Google 的研究人員公佈了 SHAttered 攻擊,首次給出真實的 SHA-1 碰撞:兩個內容不同的 PDF 檔案擁有相同的雜湊值,計算量約為 2^63 次 SHA-1 運算。2020 年,Gaëtan Leurent 和 Thomas Peyrin 在論文《SHA-1 is a Shambles》中利用選擇字首碰撞,演示了偽造 PGP 金鑰上的 SHA-1 簽名,所需成本已在資金充足的攻擊者承受範圍之內。

  • 公共 CA 自 2016 年起停止簽發 SHA-1 TLS 證書,主流瀏覽器在 2017 年初不再信任此類證書。
  • NIST 自 2013 年起禁止用 SHA-1 生成新的數字簽名,並計劃在 2030 年底前全面淘汰 SHA-1。
  • 大多數 Git 倉庫仍用 SHA-1 標識物件,計算時採用能檢測碰撞攻擊的加固實現;Git 也已支援建立使用 SHA-256 的倉庫。

碰撞攻擊並不能攻破 HMAC,因此 TOTP 動態碼和一些舊版 Webhook 簽名仍在使用 HMAC-SHA1,可以用 HMAC 生成器計算。新專案請選擇 SHA-256。

Git 物件 ID、Base64 與文字編碼

Git 的 blob ID 並不是檔案本身的 SHA-1。Git 會先寫入一個頭部(blob、一個空格、以位元組計的大小和一個零位元組),再接上檔案內容一起計算。要在本頁復現,把輸入切換為十六進位,並連同這些頭部位元組一起填入即可:以 hello 加一個換行符為例,十六進位輸入為 626c6f6220360068656c6c6f0a。

$ printf 'hello\n' | sha1sum
f572d396fae9206628714fb2ce00f72e94f2258f  -
$ printf 'hello\n' | git hash-object --stdin
ce013625030ba8dba906f756967f9e9ca394464a

SHA-1 一般以小寫十六進位表示。Base64 形式則出現在 WebSocket 握手中(Sec-WebSocket-Accept 是客戶端金鑰加上固定 GUID 後的 SHA-1 的 Base64),以及 LDAP 的 {SHA} 密碼格式中。還要記住,雜湊針對的是位元組:含有帶重音字母的文字,用 UTF-8 和 Windows-1252 編碼會得到不同的 SHA-1。

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

sha1sum file.zip                          # Linux
shasum file.zip                           # macOS(預設演算法即 SHA-1)
certutil -hashfile file.zip SHA1          # Windows
Get-FileHash file.zip -Algorithm SHA1     # PowerShell

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

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

本頁使用瀏覽器內建的 Web Crypto API 計算 SHA-1,輸入內容不會離開你的裝置。「全部演算法」表格還會列出同一輸入的 MD5、SHA-256、SHA-384、SHA-512 和 CRC 校驗值。

編碼範例

輸入 (UTF-8)SHA-1
Hello, World!0a0a9f2a6772942557ab5355d76af442f8f65e01
Base64.is6c667ee2efd2020349eed40efa07c26683f613c8
你好440ee0853ad1e99f962b63e459ef992d7c211722

常見問題

SHA-1 現在還安全嗎?

在攻擊者能夠選擇或影響輸入的場景(如簽名和證書)中不安全,因為 SHA-1 碰撞已經可以人為構造。它仍可用於檢測意外損壞,HMAC-SHA1 也不受碰撞攻擊影響。新專案請使用 SHA-256 或 SHA-512。

SHA-1 可以反向解密嗎?

不能。SHA-1 沒有金鑰,也不存在解密過程。查詢網站只能找到已收錄在常用詞和洩露密碼錶中的輸入,所以長而隨機的內容查不到,簡短的密碼卻很容易被查出。

SHA-1 值有多長?
160 位,即 20 位元組:十六進位為 40 個字元,Base64 為 28 個字元,並以一個 = 結尾。RIPEMD-160 的長度與它相同,MySQL 4.1 及以上版本的密碼雜湊則是一個星號加 40 個十六進位字元。雜湊識別工具可以列出某個字串可能對應的演算法。
如何用公佈的 SHA-1 校驗檔案?

開啟檔案,然後把公佈的值貼上到「對比」框。大小寫十六進位和 Base64 都能識別,頁面會顯示「一致」或「不一致」。

SHA-1 和 SHA-256 有什麼區別?

兩者都由 NIST 釋出,但 SHA-256 屬於更新的 SHA-2 家族,輸出 256 位,目前沒有已知的實用攻擊;SHA-1 的輸出更短,抗碰撞性也已被攻破。