前面在製作 Forensic Image 時,其實已經碰過很多次 Hash。
當時我們知道,製作完映像檔後通常還會進行 Verification,確認取得的資料沒有在複製過程中發生改變。
今天就把 Hash 單獨拉出來看。
Hash 可以把一份資料經過特定的 Hash Algorithm 計算後,產生一串固定長度的值,這串結果就是 Hash Value(雜湊值)。
不管原本是一個幾 KB 的文字檔,還是一個幾 GB 的檔案,只要使用相同的 Hash Algorithm,最後產生的 Hash 長度都會固定。
常見的 Hash Algorithm 有 MD5、SHA-1 和 SHA-256。
| Algorithm | Hash 長度 |
|---|---|
| MD5 | 128 bit |
| SHA-1 | 160 bit |
| SHA-256 | 256 bit |
例如一個檔案經過 SHA-256 計算後,可能得到:
7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069
SHA-256 的結果是 256 bit,因此我們平常看到的會是一串 64 個十六進位字元。
如果同一份資料沒有被修改,再使用相同演算法計算一次,得到的結果也會相同。
所以 Hash 有時候會被形容成資料的數位指紋。
Hash 很適合拿來做完整性驗證,其中一個原因就是資料只要發生變化,重新計算後通常就會得到完全不同的結果。
假設原本的文字內容是:
Digital Forensics
現在只是把最後一個字母改成大寫:
Digital ForensicS
肉眼看起來只差了一個字元,但兩份資料重新計算 SHA-256 後,得到的 Hash 會完全不同。
甚至從更底層來看,只要資料有一個 bit 被改變,都會影響最後的 Hash 結果。
這也是 Hash 在數位鑑識裡很重要的原因。
鑑識人員不需要自己一個 Byte、一個 Byte 去比較兩份檔案,只要分別計算 Hash,就可以快速確認兩份資料內容是否一致。
其實不用另外安裝大型鑑識工具,Windows PowerShell 就可以直接計算檔案的 Hash。
假設目前有一個 evidence.txt,檔案內容為 Digital Forensics 。
可以執行:
Get-FileHash .\evidence.txt -Algorithm SHA256

得到 Hash 值:
C6D9C5E82883FF2716F1295235F334F96DE7A1EE4647600FA031C10F6A84F381
接著打開 evidence.txt,把檔案內容改成 Digital ForensicS,再執行一次相同指令。

這時候就會發現,重新計算出來的 Hash 變成:
1B14E5EA1D1B4C4796637512B7B5C0E9012380E46A08AA2DFE16A57338E56E9F
如果一開始記錄的 SHA-256 跟重新計算的不一致,就代表這份資料和原本計算 Hash 時的內容已經不一樣。
前面製作 Forensic Image 時,其實就是一個很典型的例子。
我們取得數位證據時,不只是把資料複製出來而已,還必須確認擷取出來的內容沒有因為 Acquisition 過程而發生非預期的變化。
概念上可以理解成:
Original Evidence
↓
Acquisition
↓
Forensic Image
↓
Verification
Hash 可以用來協助確認取得的資料是否與當初讀取到的內容一致。
而且這件事情並不是只有製作 Image 的當下才重要。
假設一份 Evidence Image 取得之後,被複製到另一顆硬碟、移到分析工作站,甚至隔了一段時間之後才開始進行鑑識,都可以再次進行完整性驗證。
如果驗證結果仍然一致,就代表目前準備分析的資料,和原本保存下來的內容一致。
前面使用 FTK Imager 時,我們曾經接觸過 E01。
這裡有一個地方很容易混淆。
E01 本身是一種 Evidence File Format,除了擷取到的資料之外,裡面還會包含其他鑑識相關資訊,並具有自己的完整性驗證機制。
因此不能單純理解成原始硬碟的 Hash 一定等於 Evidence.E01 這個檔案本身的 Hash。
如果直接對 Evidence.E01 這個檔案使用 Get-FileHash,算出來的是這個 E01 檔案本身的 Hash。
但鑑識工具在 Acquisition 和 Verification 階段所驗證的,是被擷取資料的完整性。
這兩個概念不完全一樣。
所以在做鑑識時,除了看到一串 Hash 之外,也要先確認這個 Hash 到底是在驗證什麼資料。
假設今天取得一份檔案後,先記錄它的 SHA-256。
過了一個月之後,再對同一份檔案計算一次,結果是相同的。
這時我們可以說,這份資料和當初計算 Hash 時的內容一致。
但Hash 驗證的是資料的完整性,不是直接證明這份資料的真實性。
例如有人交給你一個 secret.docx,你第一次拿到時就計算 SHA-256,之後再算一次仍然得到相同結果。
這只能告訴你,兩次計算之間檔案內容沒有改變。
但光靠這串 Hash,還是無法得知這個檔案原本來自哪一台電腦、是誰建立的、取得之前有沒有被修改過,也不知道它和正在調查的事件到底有沒有關係。
所以 Hash 很重要,但它只能回答這份資料和我先前記錄的那份資料,內容是不是一致的,至於這份資料從哪裡來、和誰有關、能不能證明某件事情,還需要搭配其他數位證據一起判斷。
假設原本有一個 secret.txt,現在把它重新命名成 homework.txt 但檔案內容完全沒有改變。
使用 Get-FileHash 計算出來的 Hash 通常也不會改變。
因為這類工具計算的是檔案內容本身,只是改變檔名、移動檔案位置,或讓 NTFS 的部分 Metadata 發生變化,並不代表檔案裡面的內容會跟著改變。
反過來說,就算檔名完全一樣,只要檔案內容被修改,重新計算的 Hash 就可能完全不同。