一個 SHA-1 雜湊值,是一個 160 位元(20 位元組)的數值,顯示為恰好 40 個小寫十六進位字元,是從文字或檔案的確切位元組計算出來的。它是由 NIST 設計,做為安全雜湊標準(FIPS 180-4)的一部分,如今只用於舊系統的檢查碼,例如驗證下載檔案,或符合舊系統的要求。雖然 SHA-1 能偵測意外的資料損毀,但由於碰撞攻擊——攻擊者可以刻意打造出不同的輸入、產生相同的雜湊值——它在密碼學用途上已經不再安全。因此,現代系統應該改用 SHA-256 或 SHA-512,但當你必須符合一個舊有的 SHA-1 檢查碼時——例如一個舊的下載頁面、封存目錄,或整合系統——你就需要一種可靠的方式,在本機產生出同樣的摘要值。
在 Linux 上,傳統的做法是使用像 sha1sum 這樣的命令列工具,它會讀取一個檔案或管線輸入,並輸出雜湊值。不過,這需要終端機存取權限、熟悉 shell 指令,並小心處理文字編碼(尤其是 Unicode 或換行符號)。如果你是在一個受限的環境中工作、沒有終端機存取權限,或單純比較喜歡圖形介面,Sha1 雜湊產生器能提供同樣的結果,而完全不必離開你的瀏覽器。這個工具會完全在用戶端,處理 UTF-8 文字或最大 100 MB 的本機檔案,代表沒有任何資料會被上傳到伺服器。當你需要對照一個已公布的 SHA-1 檢查碼,驗證某個檔案的完整性,卻不想安裝額外軟體、也不想冒著外洩敏感資料的風險時,這特別有用。這個產生器也支援 Base64 輸出,某些舊系統要求的是這種格式,而不是十六進位。
有一個關鍵細節是:SHA-1 會完全按照輸入被提供的樣子,逐位元組進行雜湊運算。多一個空格、一個換行,甚至是不同的 Unicode 編碼方式(例如 UTF-8 對比 UTF-16),都會產生完全不同的雜湊值。舉例來說,空字串眾所周知的 SHA-1 值是 da39a3ee5e6b4b0d3255bfef95601890afd80709,但只要加上一個換行,這個值就會完全改變。同樣地,帶重音符號的字母,或表情符號,在 UTF-8 中會佔用多個位元組,所以它們的表示方式會影響雜湊結果。Sha1 雜湊產生器把文字當成 UTF-8 處理、把檔案當成原始位元組處理,藉此與 sha1sum 這類命令列工具的行為保持一致。這確保了在對照舊有檢查碼時的一致性,但也代表你必須提供完全一致的輸入——不能修剪、重新編碼,或正規化空白字元。

什麼時候該用 SHA-1(以及什麼時候該避免使用它)
SHA-1 只適合用在不需要考慮抗碰撞性的特定、有限情境中。下表整理了什麼時候使用 SHA-1 是安全的,以及什麼時候你應該改用更強的演算法,例如 SHA-256 或 SHA-512。
| 使用情境 | SHA-1 是否適用? | 建議的替代方案 | 原因 |
|---|---|---|---|
| 驗證一個舊有的下載檔(例如舊版 ISO、韌體) | 可以,如果公布的檢查碼就是 SHA-1 | 新的下載檔請用 SHA-256 或 SHA-512 | 只能偵測意外損毀,無法偵測惡意竄改 |
| 對照一個舊整合系統中的檢查碼(例如 API、資料庫) | 可以,如果該系統要求使用 SHA-1 | 遷移到 SHA-256 或 SHA-512 | 僅為了相容舊系統;能升級就盡快升級 |
| 數位簽章或憑證 | 不行 | SHA-256 或 SHA-3 | 碰撞攻擊讓 SHA-1 不適合用於簽章 |
| 密碼儲存或金鑰衍生 | 不行 | Argon2id、scrypt,或 bcrypt | SHA-1 對密碼雜湊來說速度太快;請使用一種慢速、加鹽的演算法 |
| 防竄改保護(例如在對抗性環境中的檔案完整性) | 不行 | SHA-256 或 HMAC-SHA-256 | 攻擊者能偽造碰撞;請使用抗碰撞的雜湊演算法 |
如果你正在使用一個仍然要求 SHA-1 的系統,例如一個舊版 Android 應用程式簽章流程,或一個舊有的封存工具,Sha1 雜湊產生器能幫你對出預期的檢查碼。不過,如果這個消費雜湊值的系統是你能掌控的,請盡快把它遷移到 SHA-256 或 SHA-512。舉例來說,Android 現在的應用程式簽章已經要求使用 SHA-256,而現代的 Linux 發行版,也會為它們的 ISO 檔案公布 SHA-256 或 SHA-512 檢查碼。務必透過受信任的管道驗證雜湊值——絕不要只依賴單一來源,尤其是當那個雜湊值和檔案發布在同一個地方時(例如同一個網站)。
如何在瀏覽器中產生一個 SHA-1 雜湊值
照著以下步驟,用 Sha1 雜湊產生器,從文字或檔案計算出一個 SHA-1 雜湊值,完全不必安裝任何軟體,也不必使用命令列:
- 打開這個工具:在你的瀏覽器中前往 Sha1 雜湊產生器。這個頁面完全在用戶端載入,所以不會有任何資料傳送到伺服器。
- 選擇你的輸入類型:選擇「文字」或「檔案」模式。文字模式會把輸入當成 UTF-8 處理,而檔案模式則會完全按照從磁碟讀取到的原始位元組來做雜湊運算。
-
提供確切的輸入內容:
- 針對文字:貼上或輸入確切的字串,包括空格、換行,與 Unicode 字元(例如表情符號,或帶重音符號的字母)。不要正規化或修剪空白字元。
- 針對檔案:按一下「選擇檔案」,選取一個最大 100 MB 的檔案。檔名、修改時間,與瀏覽器的 MIME 標籤,都不會被納入雜湊運算——只有原始位元組會被納入。
- 產生雜湊值:按一下「產生 SHA-1」按鈕。這個工具會在本機處理輸入內容,並同時顯示小寫十六進位(40 個字元)與 Base64(28 個字元,含補位)兩種格式的摘要值。
- 選擇所需的格式:依照舊系統所預期的格式,複製十六進位或 Base64 輸出。有些系統使用大寫十六進位,但這個產生器輸出的是小寫——如有需要,請自行轉換(例如用文字編輯器)。
- 逐字元比對:手動或用程式,把產生出來的雜湊值,與預期的數值做比對。只要有一個字元不相符,就代表輸入內容並不完全一致。如果雜湊值相符,輸入內容很可能完好無損(但請記住,就安全性目的而言,SHA-1 無法保證這一點)。
舉例來說,如果你正在對照一份已公布的 SHA-1 檢查碼,驗證一個下載下來的檔案,就產生本機檔案的雜湊值,再和下載頁面上提供的檢查碼做比對。如果相符,這個檔案很可能沒有發生意外損毀。不過,如果這個檔案很敏感或攸關安全,請改用像 SHA-256 這樣更強的雜湊演算法。Sha1 雜湊產生器內建了一則關於碰撞攻擊的警告,提醒你這項限制。
文字模式 vs. 檔案模式:關鍵差異
Sha1 雜湊產生器提供兩種輸入模式:文字與檔案。雖然兩者都會產生一個 SHA-1 摘要值,但它們處理輸入的方式不同,即使內容看起來一模一樣,也可能導致不同的結果。下表整理了這些關鍵差異:
| 功能 | 文字模式 | 檔案模式 |
|---|---|---|
| 輸入處理方式 | 把輸入當成 UTF-8 文字處理 | 完全按照從檔案讀取到的原始位元組做雜湊運算 |
| Unicode 支援 | 把像表情符號或帶重音符號字母這類字元,編碼成 UTF-8 位元組 | 直接對檔案的位元組做雜湊運算,與編碼方式無關 |
| 換行符號 | 會影響雜湊值(例如 LF 對比 CRLF) | 會影響雜湊值(取決於檔案的位元組內容) |
| 空白字元 | 每一個空格或定位字元都會納入雜湊運算 | 每一個位元組,包括空白字元,都會被納入 |
| 空白輸入 | 對空字串做雜湊運算(數值:da39a3ee5e6b4b0d3255bfef95601890afd80709) | 對一個空檔案做雜湊運算(與空白文字的數值相同) |
| 使用情境 | 對照一個舊有的文字檢查碼(例如 API 承載內容) | 驗證一個下載下來的檔案或二進位資料 |
舉例來說,如果你在文字模式下對字串 abc 做雜湊運算,這個產生器會先把它編碼成 UTF-8 位元組(61 62 63),再計算 SHA-1 摘要值。結果會是 a9993e364706816aba3e25717850c26c9cd0d89d,這與 NIST 的測試向量相符。不過,如果你對一個包含同樣這三個字元的檔案做雜湊運算,結果就取決於這個檔案確切的位元組內容——包括任何隱藏字元或編碼方式。當你處理非 ASCII 文字時,例如各國語言字元或表情符號,這種在 UTF-8 中會佔用多個位元組的內容,這個區別就至關重要。
常見的陷阱以及如何避免它們
產生一個 SHA-1 雜湊值看起來很直接,但小小的失誤,可能導致檢查碼對不上,或對安全性做出錯誤的假設。以下是最常見的幾個陷阱,以及如何避免它們:
- 正規化空白字元:修剪空格、把定位字元轉成空格,或改變換行方式(例如把 LF 改成 CRLF),都會改變輸入的位元組內容,產生不同的雜湊值。請務必提供完全一致的輸入,包括所有的空白字元與格式。
- 忽略 Unicode 編碼:像 é、😊,或漢字這類字元,在 UTF-8 中會佔用多個位元組。如果舊系統預期的是特定編碼方式(例如 UTF-8 對比 ISO-8859-1),請確保你的輸入內容與它一致。Sha1 雜湊產生器在文字模式下使用的是 UTF-8,請確認這與預期的檢查碼一致。
- 假設檔案中繼資料會影響雜湊值:Sha1 雜湊產生器只對檔案的位元組做雜湊運算,不包括檔名、修改時間,或其他中繼資料。這與 sha1sum 這類命令列工具的行為一致,但有些系統(例如 Git)會把中繼資料也納入它們的雜湊運算中。請務必確認那個舊系統到底在對什麼做雜湊運算。
- 把 SHA-1 用在攸關安全的任務上:SHA-1 的抗碰撞性已經被攻破,代表攻擊者能刻意打造出兩個不同的輸入、產生相同的雜湊值。絕不要把它用於數位簽章、密碼儲存,或防竄改保護。對這些任務,請改用 SHA-256、SHA-512,或像 Argon2id 這樣專門的密碼雜湊方案。
- 只複製了雜湊值的一部分:一個 SHA-1 雜湊值的長度是 40 個十六進位字元。即使只漏掉一個字元,也會導致不相符。請務必複製完整的雜湊值,並逐字元比對。
- 混用十六進位與 Base64:有些舊系統預期的是 Base64 格式的雜湊值,另一些則使用十六進位。Sha1 雜湊產生器兩種格式都提供,所以請選擇該系統所要求的格式。舉例來說,Git 使用十六進位,而有些 API 則預期 Base64。
如果你遇到不相符的情況,請仔細檢查輸入內容中是否有隱藏字元、編碼差異,或空白字元的變化。像十六進位轉文字轉換器這樣的工具,能幫你檢視一個檔案或字串確切的位元組內容,找出差異所在。舉例來說,如果一個文字檔案含有 Unicode 位元組順序記號(BOM),即使可見的文字看起來一模一樣,它仍然會影響雜湊值。
因應現代安全需求的替代方案
雖然 SHA-1 對舊系統的檢查碼來說已經夠用,現代的安全需求卻要求更強的演算法。下表把 SHA-1 與它的後繼者 SHA-256、SHA-512 做了比較,這三者都屬於同一套 NIST 安全雜湊標準(FIPS 180-4)。
| 演算法 | 雜湊長度(位元) | 輸出格式 | 抗碰撞性 | 使用情境 |
|---|---|---|---|---|
| SHA-1 | 160 | 40 個十六進位字元,或 28 個 Base64 字元 | 已被攻破(2017 年發現碰撞) | 僅限舊系統的檢查碼 |
| SHA-256 | 256 | 64 個十六進位字元,或 44 個 Base64 字元 | 安全(目前未知碰撞) | 檔案驗證、數位簽章、憑證 |
| SHA-512 | 512 | 128 個十六進位字元,或 88 個 Base64 字元 | 安全(目前未知碰撞) | 高安全性應用、大型資料集 |
如果你正在進行一個新專案,或能影響消費這個雜湊值的系統,請遷移到 SHA-256 或 SHA-512。這兩者都獲得廣泛支援,並能抵抗碰撞攻擊。舉例來說,SHA256 雜湊產生器與Sha512 雜湊產生器這兩個工具,提供了與 Sha1 雜湊產生器相同的用戶端處理方式,卻能產生更強的摘要值。當你為了安全目的產生雜湊值時,請務必透過經過驗證的管道分享這個檢查碼(例如具備有效憑證的 HTTPS),以防止遭到竄改。
對於密碼儲存,請完全避免使用像 SHA-1、SHA-256,或 SHA-512 這類通用雜湊演算法。這些演算法的設計目標就是要快,這讓它們容易受到暴力破解攻擊。請改用像 Argon2id、scrypt,或 bcrypt 這類專門的密碼雜湊方案,它們刻意設計得很慢,並包含一個鹽值,以抵抗彩虹表攻擊。密碼強度檢查工具能幫你評估一個密碼是否符合現代的複雜度要求,但請記住,雜湊運算只是安全密碼儲存中的一環。
想深入了解,請參閱如何解密一個 SHA-512 雜湊值(以及該怎麼做才對)。
想深入了解,請參閱在不使用 OpenSSL 的情況下,於 Linux 產生一組 RSA 金鑰對。