﻿# 如何利用 md5sum 稽核重要檔案與驗證檔案完整性

要確認檔案是否被修改 (竄改) 並不是檢查檔案**修改時間**也不是檢查**檔案大小**，比較有效的方式是檢查檔案內容，但一一比對檔案內容成本過高，所以一般來說都會用 [MD5](http://en.wikipedia.org/wiki/Md5) 演算法將檔案內容計算出一個雜湊值(Hash)，在 Linux 下最常見的工具就是 [md5sum](http://en.wikipedia.org/wiki/Md5sum) 工具，今天我就講幾個在 Windows 下的相關工具。

[**MD5summer - Windows MD5 Sum generator**](http://www.md5summer.org/)

這是 Windows 下的 GUI 工具，可以建立檔案雜湊(Create sums)以及驗證檔案雜湊(Verify sums)。

**檔案雜湊(Create sums)的步驟如下：**

1\. 先選取目錄，並點選 Create sums

 ![MD5summer - Windows MD5 Sum generator](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/774f9db05ecef5e5ce56-image_6.png "MD5summer - Windows MD5 Sum generator")

2\. 選取要建立 md5sum 雜湊的檔案

![Create list of files to sum](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/fe4ef60d605cff8ef9b0-image_9.png "Create list of files to sum")

3\. 將雜湊清單存檔，通常副檔名為 md5

![將雜湊清單存檔，通常副檔名為 md5](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/eb55e08ea1452bcb08f1-image_12.png "將雜湊清單存檔，通常副檔名為 md5")

**驗證檔案雜湊(Verify sums)的步驟如下：**

1\. 先選取目錄，並點選 Verify sums

2\. 接著直接選取之前產生的 md5sum 清單檔

![選取之前產生的 md5sum 清單檔](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/92e95cb08ecc177dfe0b-image_15.png "選取之前產生的 md5sum 清單檔")

3\. 接著就會進行所有檔案驗證，不同的燈號代表不同的驗證狀態

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/57741abd829cb6f7863a-image_18.png "image")

若要對檔案驗證進行自動化，就必須搭配指令列(Command Line)工具，一般來說我們還是會用標準的 Windows 版 [md5sum](https://web.archive.org/web/20090220140207/http://downloads.activestate.com:80/contrib/md5sum/Windows/) 工具來建立或驗證雜湊，只是 Windows 版的 [md5sum](https://web.archive.org/web/20090220140207/http://downloads.activestate.com:80/contrib/md5sum/Windows/) 工具無法建立包含所有子目錄下的所有檔案，這時就要透過 [md5deep](http://md5deep.sourceforge.net/) 協助建立雜湊清單檔案。

我個人習慣用 [md5deep](http://md5deep.sourceforge.net/) 建立雜湊檔，用 [md5sum](https://web.archive.org/web/20090220140207/http://downloads.activestate.com:80/contrib/md5sum/Windows/) 驗證雜湊與檔案，以下是一些常用的指令：

1\. 利用 [md5sum](https://web.archive.org/web/20090220140207/http://downloads.activestate.com:80/contrib/md5sum/Windows/) 驗證雜湊與檔案，執行過程如下範例：

```xml
G:\md5deep-3.4>md5sum -c md5deep-3.4.md5
CHANGES.TXT: OK
COPYING.TXT: OK
FILEFORMAT.TXT: OK
hashdeep.exe: OK
HASHDEEP.TXT: OK
md5deep.exe: OK
MD5DEEP.TXT: FAILED
sha1deep.exe: OK
sha256deep.exe: OK
tigerdeep.exe: OK
whirlpooldeep.exe: OK
md5sum: WARNING: 1 of 11 computed checksums did NOT match

G:\md5deep-3.4>echo %ERRORLEVEL%
1
```

在驗證完後可判斷 %ERRORLEVEL% 是否為 0 用以確認檔案驗證是否成功，一個簡單的批次檔範例：

```
@echo off
md5sum -c md5deep-3.4.md5 > nul
IF %ERRORLEVEL% NEQ 0 GOTO Error

echo 檔案驗證成功
GOTO End

:Error
echo 檔案驗證失敗

:End
```

2\. 利用 [md5deep](http://md5deep.sourceforge.net/) 建立雜湊檔

建立**相對路徑**的 md5 清單

```xml
G:\>md5deep -r -l -k md5deep-3.4
93f97d08506ad4c0d2aa71a014b47192 *md5deep-3.4\CHANGES.TXT
c2c307215407ef12c442168c9fe8ab5c *md5deep-3.4\COPYING.TXT
28dbd4e02914185bec18195a0917460c *md5deep-3.4\FILEFORMAT.TXT
384814ae2fa5b6e5f5f7e546db0a94fc *md5deep-3.4\hashdeep.exe
c1a8ecc804c2305ce32f92ef744b42e6 *md5deep-3.4\HASHDEEP.TXT
434037609272560d708c4b0b339e19d5 *md5deep-3.4\md5deep.exe
e22fba1df1f02a9491ce09e419d91922 *md5deep-3.4\MD5DEEP.TXT
5dda92fb6df49c2c5d347476a2199e9d *md5deep-3.4\sha1deep.exe
9fcb347e5d7ff15ae4e6aff59282699d *md5deep-3.4\sha256deep.exe
63d218b204a03f9fe1b352ffd9b8616e *md5deep-3.4\tigerdeep.exe
ca1f58f199eb7ac933aa83f4408afcab *md5deep-3.4\whirlpooldeep.exe
4d51d0ac57a9b70118b5a91a3014a60c *md5deep-3.4\md5deep-3.4.md5
61858fa4654e224668ac14edec406209 *md5deep-3.4\verify.bat
```

建立**完整路徑**的 md5 清單

```xml
G:\>md5deep -r -k md5deep-3.4
93f97d08506ad4c0d2aa71a014b47192 *G:\md5deep-3.4\CHANGES.TXT
c2c307215407ef12c442168c9fe8ab5c *G:\md5deep-3.4\COPYING.TXT
28dbd4e02914185bec18195a0917460c *G:\md5deep-3.4\FILEFORMAT.TXT
384814ae2fa5b6e5f5f7e546db0a94fc *G:\md5deep-3.4\hashdeep.exe
c1a8ecc804c2305ce32f92ef744b42e6 *G:\md5deep-3.4\HASHDEEP.TXT
434037609272560d708c4b0b339e19d5 *G:\md5deep-3.4\md5deep.exe
e22fba1df1f02a9491ce09e419d91922 *G:\md5deep-3.4\MD5DEEP.TXT
5dda92fb6df49c2c5d347476a2199e9d *G:\md5deep-3.4\sha1deep.exe
9fcb347e5d7ff15ae4e6aff59282699d *G:\md5deep-3.4\sha256deep.exe
63d218b204a03f9fe1b352ffd9b8616e *G:\md5deep-3.4\tigerdeep.exe
ca1f58f199eb7ac933aa83f4408afcab *G:\md5deep-3.4\whirlpooldeep.exe
4d51d0ac57a9b70118b5a91a3014a60c *G:\md5deep-3.4\md5deep-3.4.md5
61858fa4654e224668ac14edec406209 *G:\md5deep-3.4\verify.bat
```

更完整的使用方式與範例可參考 [Getting Started with md5deep](http://md5deep.sourceforge.net/getting-started.html) 說明。

我目前運用 [md5sum](http://en.wikipedia.org/wiki/Md5sum) 在檔案備份與還原的領域以及驗證重要檔案是否被竄改，成效相當不錯，建議各位可以作為每日重要檔案稽核的標準作業流程(SOP)。

**補充說明**

由於 MD5 演算法在幾年前被一個中國大陸的數學家給破解([MD5 Collision](http://www.google.com.tw/search?hl=zh-TW&q=md5+collision&meta=&aq=0&oq=md5+col))，因此並非絕對安全，若不放心的人建議可使用 [md5deep](http://md5deep.sourceforge.net/) 套件內附的 **sha256deep.exe** 工具進行雜湊運算。

若要驗證使用 sha256deep.exe 工具所運算出來的雜湊值，可以利用 [sha256sum.exe](https://github.com/markpizz/HashSum) 工具進行驗證，用法跟 [md5sum](http://en.wikipedia.org/wiki/Md5sum) 一模一樣。[sha256sum.exe](https://github.com/markpizz/HashSum) 可以到 [Win32 native md5sum, sha1sum, sha256sum etc.](https://github.com/markpizz/HashSum) 下載。

**相關連結**

-   [RFC 1321 - The MD5 Message-Digest Algorithm](http://tools.ietf.org/html/rfc1321)
-   [MD5summer - Windows MD5 Sum generator](http://www.md5summer.org/)
-   [md5sum - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Md5sum)
-   [md5sum for Windows](https://web.archive.org/web/20090220140207/http://downloads.activestate.com:80/contrib/md5sum/Windows/)
-   [md5deep - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Md5deep)
-   [md5deep for Windows](http://md5deep.sourceforge.net/)
    -   [Getting Started with md5deep](http://md5deep.sourceforge.net/getting-started.html)
-   [Batch files – Errorlevels](http://www.robvanderwoude.com/errorlevel.php)
-   [Win32 native md5sum, sha1sum, sha256sum etc.](https://github.com/markpizz/HashSum)
