一個 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 這類命令列工具的行為保持一致。這確保了在對照舊有檢查碼時的一致性,但也代表你必須提供完全一致的輸入——不能修剪、重新編碼,或正規化空白字元。

how to get sha1 hash linux
how to get sha1 hash linux

什麼時候該用 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 雜湊值,完全不必安裝任何軟體,也不必使用命令列:

  1. 打開這個工具:在你的瀏覽器中前往 Sha1 雜湊產生器。這個頁面完全在用戶端載入,所以不會有任何資料傳送到伺服器。
  2. 選擇你的輸入類型:選擇「文字」或「檔案」模式。文字模式會把輸入當成 UTF-8 處理,而檔案模式則會完全按照從磁碟讀取到的原始位元組來做雜湊運算。
  3. 提供確切的輸入內容:
    • 針對文字:貼上或輸入確切的字串,包括空格、換行,與 Unicode 字元(例如表情符號,或帶重音符號的字母)。不要正規化或修剪空白字元。
    • 針對檔案:按一下「選擇檔案」,選取一個最大 100 MB 的檔案。檔名、修改時間,與瀏覽器的 MIME 標籤,都不會被納入雜湊運算——只有原始位元組會被納入。
  4. 產生雜湊值:按一下「產生 SHA-1」按鈕。這個工具會在本機處理輸入內容,並同時顯示小寫十六進位(40 個字元)與 Base64(28 個字元,含補位)兩種格式的摘要值。
  5. 選擇所需的格式:依照舊系統所預期的格式,複製十六進位或 Base64 輸出。有些系統使用大寫十六進位,但這個產生器輸出的是小寫——如有需要,請自行轉換(例如用文字編輯器)。
  6. 逐字元比對:手動或用程式,把產生出來的雜湊值,與預期的數值做比對。只要有一個字元不相符,就代表輸入內容並不完全一致。如果雜湊值相符,輸入內容很可能完好無損(但請記住,就安全性目的而言,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 金鑰對