Linux 產生 MD5 與 SHA1 校驗碼 Checksum 使用教學,檢查檔案是否損毀[轉錄]

Ryan Lu
Linux on raspberry pi4
10 min readSep 7, 2020

這裡教大家如何在 Linux 系統上面產生 MD5 與 SHA1 校驗碼,驗證檔案是否有損毀或遭到竄改。

校驗碼(checksum,或譯為驗證碼,或稱為 hash code)是用來驗證檔案正確性的一種機制,它的做法是在檔案要經過網路傳輸、備份儲存等過程之前,利用一些特別設計的演算法依據檔案的內容算出一組驗證專用的編碼,這種校驗碼有一個特性就是當檔案發生微小的變動時,產生出來的校驗碼會完全不同,我們可以在檔案經過網路傳輸或備份回復之後,重新計算一次校驗碼,在跟之前的校驗碼做比較,如果校驗碼完全一致則代表檔案的內容完全沒有改變,靠著這樣的方式確保檔案沒有損毀或遭到竄改。

用來產生校驗碼的演算法有很多種,而比較常用的就是 MD5 與 SHA1 這兩種,以下分別介紹這兩種校驗碼的使用方式。

MD5

MD5 校驗碼是依據檔案內容所產生的一個編碼,而其長度固定都是 128 位元,通常兩個不同的檔案很難產生相同的 MD5 校驗碼,所以很適合用來檢查檔案的正確性,屬於最普遍被使用的校驗碼之一,例如各個 Linux 網站提供給使用者下載的 ISO 映像檔一定會附帶 MD5 的校驗碼。

如果在 Linux 系統中想要產生檔案的 MD5 校驗碼,可以使用 md5sum 這個指令,首先我們使用 date 建立一個測試的檔案內容:

date > date.txt

這樣產生的 date.txt 檔案就會是目前的時間,類似這樣:

Thu Oct 13 16:31:42 CST 2016

而若要產生 date.txt 這個檔案的 MD5 校驗碼,則執行:

md5sum date.txt

輸出為

6603209b532e4aa6f8e44df37d99a61e  date.txt

如果我們馬上再產生一個新的 date.txt,並且對新的檔案再產生一次 MD5 校驗碼,會發現產生的 MD5 校驗碼完全不同:

date > date.txt
md5sum date.txt
1e53719b6fef60fbb7663b2b890111b0 date.txt

縱使兩個檔案之間的差異非常微小,產生出來的 MD5 校驗碼也會完全不一樣,所以使用者可以一眼就辨識出兩個檔案是有差異的。

若要一次對多個檔案產生 MD5 校驗碼,可以將所有的檔案放在 md5sum 的參數列中:

md5sum date1.txt date2.txt date3.txtc1fa0dfbd869b01995b0818e4d176011  date1.txt
5f6a6c6f121351a1b7f33a2372df9932 date2.txt
c170b6cd45b9f2a2ff580c4837e5bb8a date3.txt

MD5 校驗碼是根據檔案內容來計算的,與檔案的名稱無關,也就是說兩個檔案如果名稱不同,但內容相同,還是會產生相同的 MD5 校驗碼:

cp date.txt date-copy.txt
md5sum date.txt date-copy.txt
1e53719b6fef60fbb7663b2b890111b0 date.txt
1e53719b6fef60fbb7663b2b890111b0 date-copy.txt

通常在準備要透過網路傳送檔案或是要將檔案複製到其他儲存媒體之前,為了保險起見我們可以先產生每個檔案的 MD5 校驗碼並且儲存起來:

md5sum date1.txt date2.txt date3.txt > date.md5sum

然後在透過網路傳輸或複製到其他的儲存媒體之後,再算一次檔案的 MD5 校驗碼,並且跟 date.md5sum 的內容做比對。md5sum 有提供一個 -c 的檢查用參數可以自動進行檔案的 MD5 校驗碼比對:

md5sum -c date.md5sumdate1.txt: OK
date2.txt: OK
date3.txt: OK

當然如果要自行手動計算與比對 MD5 校驗碼也可以。

另外 md5sum 也跟一般的 Linux 工具類似,可以從標準輸入讀取資料來計算 MD5 校驗碼:

date | md5sum -2f1791c1293065da3dbd282ecf522610  -

SHA1

SHA1 校驗碼與 MD5 非常類似,不過由於後來 MD5 有一些碰撞(collision)問題,所以後來許多人會改用 SHA1 這個 160 位元的校驗碼,但對於資料的正確性驗證上,不管是使用 MD5 或 SHA1 都可以。

SHA1 校驗碼可以使用 sha1sum 這個指令來產生:

sha1sum date.txtf679936a25f69b5cb4bc6c862b87c30ba4fce6ec  date.txt

一次產生多個檔案的 SHA1 校驗碼:

sha1sum date1.txt date2.txt date3.txtfb9249f09b589241e3556ff6b6fab5f80015ed5c  date1.txt
40e691d0d06673c9d5bc31aececafac85a9011be date2.txt
a428582cace49024d5964bac8ab71d00b191b9fa date3.txt

SHA1 校驗碼同樣只依據檔案內容來計算,與檔名無關:

sha1sum date.txt date-copy.txtf679936a25f69b5cb4bc6c862b87c30ba4fce6ec  date.txt
f679936a25f69b5cb4bc6c862b87c30ba4fce6ec date-copy.txt

驗證檔案的 SHA1 校驗碼時,也可以使用 -c 參數:

sha1sum date1.txt date2.txt date3.txt > date.sha1sum
sha1sum -c date.sha1sum
date1.txt: OK
date2.txt: OK
date3.txt: OK

驗證 Linux ISO 映像檔

我們以 Ubuntu Linux 16.04 的 iso 映像檔為例,在 Ubuntu 官方網站上除了提供 iso 的檔案之外,也同時會有 MD5 與 SHA1 的校驗碼。

MD5 與 SHA1 校驗碼

MD5SUMS 這個檔案裡面就包含了每個 iso 映像檔的 MD5 校驗碼,內容如下:

c94d54942a2954cf852884d656224186 *ubuntu-16.04-desktop-amd64.iso
610c4a399df39a78866f9236b8c658da *ubuntu-16.04-desktop-i386.iso
23e97cd5d4145d4105fbf29878534049 *ubuntu-16.04-server-amd64.img
23e97cd5d4145d4105fbf29878534049 *ubuntu-16.04-server-amd64.iso
494c03028524dff2de5c41a800674692 *ubuntu-16.04-server-i386.img
494c03028524dff2de5c41a800674692 *ubuntu-16.04-server-i386.iso
17643c29e3c4609818f26becf76d29a3 *ubuntu-16.04.1-desktop-amd64.iso
9e4e30c37c99b4e029b4bfc2ee93eec2 *ubuntu-16.04.1-desktop-i386.iso
d2d939ca0e65816790375f6826e4032f *ubuntu-16.04.1-server-amd64.img
d2d939ca0e65816790375f6826e4032f *ubuntu-16.04.1-server-amd64.iso
455206c599c25d6a576ba23ca906741a *ubuntu-16.04.1-server-i386.img
455206c599c25d6a576ba23ca906741a *ubuntu-16.04.1-server-i386.iso

通常我們在 iso 檔案下載完成後,會先進行 MD5 校驗碼的檢查,看看算出來的校驗碼是否跟官方所提供的相同,確認檔案在網路傳輸過程中沒有損壞。

md5sum ubuntu-16.04-desktop-amd64.iso

輸出為:

c94d54942a2954cf852884d656224186  ubuntu-16.04-desktop-amd64.iso

除了 MD5 之外,也可以使用 SHA1 校驗碼來檢查,這是 SHA1SUMS 的檔案內容:

83a60e1cc28068534b3e4f2f2c9881bb32cbfb74 *ubuntu-16.04-desktop-amd64.iso
c83771554a470f1a79dfd1792856b857b6020f4f *ubuntu-16.04-desktop-i386.iso
70db69379816b91eb01559212ae474a36ecec9ef *ubuntu-16.04-server-amd64.img
70db69379816b91eb01559212ae474a36ecec9ef *ubuntu-16.04-server-amd64.iso
4fe67511901a8e1b662aabdfe37c06b5003cb150 *ubuntu-16.04-server-i386.img
4fe67511901a8e1b662aabdfe37c06b5003cb150 *ubuntu-16.04-server-i386.iso
805337c2c3a00ac9b4a59a5c9692903ad30fe3ce *ubuntu-16.04.1-desktop-amd64.iso
0e1a52ceb4c683bec25e4f808c3027daf476f48a *ubuntu-16.04.1-desktop-i386.iso
de5ee8665048f009577763efbf4a6f0558833e59 *ubuntu-16.04.1-server-amd64.img
de5ee8665048f009577763efbf4a6f0558833e59 *ubuntu-16.04.1-server-amd64.iso
96f97db886f7b6ad1e2fba96d395af70020cb9c8 *ubuntu-16.04.1-server-i386.img
96f97db886f7b6ad1e2fba96d395af70020cb9c8 *ubuntu-16.04.1-server-i386.iso

計算 iso 檔案的 SHA1 校驗碼:

sha1sum ubuntu-16.04-desktop-amd64.iso83a60e1cc28068534b3e4f2f2c9881bb32cbfb74  ubuntu-16.04-desktop-amd64.iso

在 Ubuntu 的官方網站上還有提供 SHA256 的校驗碼,這種校驗碼的安全性又更高一些,使用方式也都跟 MD5 與 SHA1 類似,只不過是改用 sha256sum 這個指令而已:

sha256sum ubuntu-16.04-desktop-amd64.iso4bcec83ef856c50c6866f3b0f3942e011104b5ecc6d955d1e7061faff86070d4  ubuntu-16.04-desktop-amd64.iso

[參考]
Linux 產生 MD5 與 SHA1 校驗碼 Checksum 使用教學,檢查檔案是否損毀

--

--