經常在網絡或設備之間傳輸文件會遇到一個問題,就是如何確定文件沒有在傳輸過程中損壞。尤其是在網絡上這種相對不穩定的環境中更容易出現錯誤。其實一些網站的文件是有提供MD5值的,我們只需要為下載的文件使用md5sum命令計算校驗碼然后和網站提供的校驗碼對比就行,如果md5值一樣理論上可以確定這兩個文件內容是一樣的。同樣,不同設備或同一設備上的兩個文件,我們也可以對比其md5值來確定它們的內容是否一致。
除了md5sum 還有其他的一些哈希算法也可以對文件進行校驗如sha1sum命令使用sha1,用法和md5sum類似。
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16個字符(BYTES))的散列值(hash value),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。將數據(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理。
MD5被廣泛用於加密和解密技術上,它可以說是文件的“數字指紋”。任何一個文件,無論是可執行程序、圖像文件、臨時文件或者其他任何類型的文件,也不管它體積多大,都有且只有一個獨一無二的MD5信息值,並且如果這個文件被修改過,它的MD5值也將隨之改變。因此,我們可以通過對比同一文件的MD5值,來校驗這個文件是否被“篡改”過。
MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,於1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 中被加以規范。
將數據(如一段文字)運算變為另一固定長度值,是散列算法的基礎原理。
1996年后被證實存在弱點,可以被加以破解,對於需要高度安全性的資料,專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞攻擊,因此不適用於安全性認證,如SSL公開密鑰認證或是數字簽名等用途。
MD5算法具有以下特點:
1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原數據計算出MD5值很容易。
3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。
從md5的資料可以知道,兩個文件的數據就算有一丁點差異,生成的md5碼都有很大差別,因此只能用md5碼來找完全相同的文件,而不能找相似的文件。對文件進行md5驗證的目的除了文件完整性外,也避免由於文件名的更改導致不一樣的結果
md5sum 手冊
MD5SUM(1)
NAME
md5sum - 計算檢驗MD5效驗碼
總覽 (SYNOPSIS)
../src/md5sum [OPTION] [FILE]...
../src/md5sum [OPTION] --check [FILE]
描述 (DESCRIPTION)
顯示 或 檢驗 MD5 效驗碼. 如果 沒有 FILE 或者 FILE 是 - 時, 就從 標准 輸入 讀入.
-b, --binary
以二進制模式讀取
-c, --check
檢驗文件的 MD5 值。給定的文件中每一行的內容是 md5sum 的輸出結果,即 md5-value filename(文本輸入模式)或 md5-value *filename(二進制輸入模式)
--tag
創建 BSD 風格的 md5 輸出行
-t, --text
以文本模式讀取(默認)。注意,在 GNU 系統中,-b 與 -t 選項在讀取時沒有差別。在輸出時,文本輸入模式在文件名前是兩個空格,二進制輸入模式在文件名前是一個空格和星號
以下選項只在校驗 md5 值時有效
--quiet
校驗成功的文件不打印 OK
--status
不輸出任何校驗成功與失敗的信息,使用命令返回碼來表示是否校驗成功,0 成功,非 0 失敗
--strict
遇到非法格式的校驗行,命令返回非 0 狀態碼
-w, --warn
遇到非法格式的校驗行發出告警
常用示例
1)生成文件的 md5 值,以文件 /etc/passwd 為例
[root@ito-yw-host ~]# cp /etc/passwd /etc/passwd.bak
[root@ito-yw-host ~]# md5sum /etc/passwd
fc6a975eb7ac26ddec24e72c95c3c935 /etc/passwd
[root@ito-yw-host ~]# md5sum /etc/passwd.bak
fc6a975eb7ac26ddec24e72c95c3c935 /etc/passwd.bak
[root@ito-yw-host ~]# echo "123" >> /etc/passwd.bak
[root@ito-yw-host ~]# md5sum /etc/passwd.bak
77b8a0e3a67f7aa91320b3436f55bc45 /etc/passwd.bak
上面示例中passwd.bak和passwdMD5值一樣,說明MD5只與文件內容有關和文件名稱無關,只要文件內容不一樣,得出來的MD5值完全不一樣。就是文件 內容差一個字符不一樣,得出的MD5值也完全不一樣。
2)生成文件的 md5 值到輸出文件 passwd.md5
[root@ito-yw-host ~]# md5sum /etc/passwd.bak
77b8a0e3a67f7aa91320b3436f55bc45 /etc/passwd.bak
[root@ito-yw-host ~]# md5sum /etc/passwd.bak > passwd.bak.md5
3)校驗文件的 md5 值。使用上面第二步生成的校驗行文件。
-c, --check:從指定文本中讀取md5值,然后檢測MD5值對應的文件是否完整,這個“指定文本”的格式如下:
[root@ito-yw-host ~]# cat passwd.bak.md5
77b8a0e3a67f7aa91320b3436f55bc45 /etc/passwd.bak
當passwd.bak.md5記錄的md5值和實際一致是輸出“ok"或”確定“,不一致時輸出”FAILED“或”失敗“
[root@ito-yw-host ~]# md5sum -c passwd.bak.md5
/etc/passwd.bak: 確定
[root@ito-yw-host ~]# echo "1" >> /etc/passwd.bak
[root@ito-yw-host ~]# md5sum -c passwd.bak.md5
/etc/passwd.bak: 失敗
md5sum: 警告:1 個校驗和不匹配
4)–tag:按照BSD樣式輸出結果
[root@ito-yw-host ~]# md5sum --tag /etc/passwd
MD5 (/etc/passwd) = fc6a975eb7ac26ddec24e72c95c3c935
5)–quiet:檢查MD5值只輸出錯誤信息
[root@ito-yw-host ~]# md5sum --quiet -c passwd.bak.md5
/etc/passwd.bak: 失敗
md5sum: 警告:1 個校驗和不匹配
[root@ito-yw-host ~]# md5sum --quiet -c passwd.md5 ## md5校驗ok,沒有輸出
6)–status:不打印任何信息,執行結果以狀態碼形式輸出
狀態碼為0標識校驗成功,非 0 失敗
[root@Centos7.9 ~]# md5sum --status -c passwd.md5
[root@ito-yw-host ~]# echo $?
0
[root@ito-yw-host ~]# md5sum --status -c passwd.bak.md5
[root@ito-yw-host ~]# echo $?
1
7)-w, --warn :如果檢測文本中有,非法的行,不符合md5sum -c需要的格式,則打印出警告信息
不過測試加不加--warn格式不正確時都會有警告信息
[root@ito-yw-host ~]# md5sum --warn -c passwd.md5
/etc/passwd: 確定
[root@ito-yw-host ~]# cat passwd.md5
fc6a975eb7ac26ddec24e72c95c3c935 /etc/passwd
[root@ito-yw-host ~]# echo "ccccc" >> passwd.md5
[root@ito-yw-host ~]# cat passwd.md5
fc6a975eb7ac26ddec24e72c95c3c935 /etc/passwd
ccccc
[root@ito-yw-host ~]# md5sum --warn -c passwd.md5
/etc/passwd: 確定
md5sum: passwd.md5:2:MD5 的校驗和行目格式不適當
md5sum: 警告:1 行的格式不適當
[root@ito-yw-host ~]# md5sum -c passwd.md5
/etc/passwd: 確定
md5sum: 警告:1 行的格式不適當
Tips
1)md5sum 是校驗文件內容,與文件名是否相同無關
2)md5sum值逐位校驗,所以文件越大,校驗時間越長
3)理論上不同文件md5值可能會相同,但這種概率極低
總結
通過md5sum來校驗生成文件校驗碼,來發現文件傳輸(網絡傳輸、復制、本地不同設備間的傳輸)異常造成的文件內容不一致的情況。
