使用方法
- 輸入文字、切換為十六進位位元組輸入,或開啟檔案。
- 演算法預設為 SHA-1,如需對照其他雜湊函式,可在「演算法」中切換。
- 選擇小寫十六進位(與 sha1sum 和 Git 的輸出一致)、大寫十六進位或 Base64。
- 把預期的 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.is | 6c667ee2efd2020349eed40efa07c26683f613c8 |
你好 | 440ee0853ad1e99f962b63e459ef992d7c211722 |
常見問題
SHA-1 現在還安全嗎?
在攻擊者能夠選擇或影響輸入的場景(如簽名和證書)中不安全,因為 SHA-1 碰撞已經可以人為構造。它仍可用於檢測意外損壞,HMAC-SHA1 也不受碰撞攻擊影響。新專案請使用 SHA-256 或 SHA-512。
SHA-1 可以反向解密嗎?
不能。SHA-1 沒有金鑰,也不存在解密過程。查詢網站只能找到已收錄在常用詞和洩露密碼錶中的輸入,所以長而隨機的內容查不到,簡短的密碼卻很容易被查出。
SHA-1 值有多長?
= 結尾。RIPEMD-160 的長度與它相同,MySQL 4.1 及以上版本的密碼雜湊則是一個星號加 40 個十六進位字元。雜湊識別工具可以列出某個字串可能對應的演算法。如何用公佈的 SHA-1 校驗檔案?
開啟檔案,然後把公佈的值貼上到「對比」框。大小寫十六進位和 Base64 都能識別,頁面會顯示「一致」或「不一致」。
SHA-1 和 SHA-256 有什麼區別?
兩者都由 NIST 釋出,但 SHA-256 屬於更新的 SHA-2 家族,輸出 256 位,目前沒有已知的實用攻擊;SHA-1 的輸出更短,抗碰撞性也已被攻破。