這裡教大家如何在 Linux 系統上面產生 MD5 與 SHA1 校驗碼,驗證檔案是否有損毀或遭到竄改。
校驗碼(checksum,或譯為驗證碼,或稱為 hash code)是用來驗證檔案正確性的一種機制,它的做法是在檔案要經過網路傳輸、備份儲存等過程之前,利用一些特別設計的演算法依據檔案的內容算出一組驗證專用的編碼,這種校驗碼有一個特性就是當檔案發生微小的變動時,產生出來的校驗碼會完全不同,我們可以在檔案經過網路傳輸或備份回復之後,重新計算一次校驗碼,在跟之前的校驗碼做比較,如果校驗碼完全一致則代表檔案的內容完全沒有改變,靠著這樣的方式確保檔案沒有損毀或遭到竄改。
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.txt
c1fa0dfbd869b01995b0818e4d176011 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.md5sum
date1.txt: OK date2.txt: OK date3.txt: OK
當然如果要自行手動計算與比對 MD5 校驗碼也可以。
另外 md5sum
也跟一般的 Linux 工具類似,可以從標準輸入讀取資料來計算 MD5 校驗碼:
date | md5sum -
2f1791c1293065da3dbd282ecf522610 -
SHA1 校驗碼與 MD5 非常類似,不過由於後來 MD5 有一些碰撞(collision)問題,所以後來許多人會改用 SHA1 這個 160 位元的校驗碼,但對於資料的正確性驗證上,不管是使用 MD5 或 SHA1 都可以。
SHA1 校驗碼可以使用 sha1sum
這個指令來產生:
sha1sum date.txt
f679936a25f69b5cb4bc6c862b87c30ba4fce6ec date.txt
一次產生多個檔案的 SHA1 校驗碼:
sha1sum date1.txt date2.txt date3.txt
fb9249f09b589241e3556ff6b6fab5f80015ed5c date1.txt 40e691d0d06673c9d5bc31aececafac85a9011be date2.txt a428582cace49024d5964bac8ab71d00b191b9fa date3.txt
SHA1 校驗碼同樣只依據檔案內容來計算,與檔名無關:
sha1sum date.txt date-copy.txt
f679936a25f69b5cb4bc6c862b87c30ba4fce6ec 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
我們以 Ubuntu Linux 16.04 的 iso 映像檔為例,在 Ubuntu 官方網站上除了提供 iso 的檔案之外,也同時會有 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.iso
83a60e1cc28068534b3e4f2f2c9881bb32cbfb74 ubuntu-16.04-desktop-amd64.iso
在 Ubuntu 的官方網站上還有提供 SHA256 的校驗碼,這種校驗碼的安全性又更高一些,使用方式也都跟 MD5 與 SHA1 類似,只不過是改用 sha256sum
這個指令而已:
sha256sum ubuntu-16.04-desktop-amd64.iso
4bcec83ef856c50c6866f3b0f3942e011104b5ecc6d955d1e7061faff86070d4 ubuntu-16.04-desktop-amd64.iso