回覆列表
-
1 # DeveloperPeer
-
2 # uread
首先先說結論,同一檔案或字元在任何系統環境中計算出的MD5值都是相同的,任何二進位制檔案都是如此,當然包括你所提到的兩種格式。道理其實非常簡單,因為全世界所有檔案的MD5摘要值都採用同一種演算法得出。如果對同一個檔案或字元,你計算出來的MD5值不同,那麼肯定是這個檔案或字元發生了變化,哪怕是一個小小的空格。
對檔案求MD5值時,我們只提取檔案的內容部分,像檔名、儲存目錄、建立時間、修改時間、許可權等等的元資訊都是不進行計算的。
在計算機系統中,檔名儲存在元資料區(windows中的NTFS格式儲存在主控檔案表MFT中,即主檔案表 Master File Table,它是NTFS檔案系統的核心),檔案內容儲存在資料區,計算MD5只針對資料區的檔案內容,而與檔名無關。下圖中黃色部分即為NTFS系統硬碟為檔案元資料區專門預留的空間。
所以改變檔名不會影響到MD5數值。實際上,一個檔案可以用多個名字,透過連結的方式與檔案系統產生聯絡,也可以透過其它連結方式(其它檔名,如果有的話)進行檢視。檔名不屬於檔案資料的一部分,在進行MD5或類似的內容校驗時,會自動忽視掉檔名。
MD5資訊摘要演算法(MD5 Message-Digest Algorithm),是一種被廣泛使用的密碼雜湊函式,可以將任意位元組串透過計算產生出一個128位(16位元組)的雜湊值,用於確保資訊傳輸完整一致。該演算法於1992年公開,1996年後該演算法被證實存在弱點,可以被破解,對於需要高度安全性的資料,專家一般建議改用其他演算法,如SHA-2。2004年,證實MD5演算法無法防止碰撞(兩個檔案的MD5值相同),因此這種方法不適用於如SSL公開金鑰認證或是數字簽名等用途。
修改檔案格式後的 md5 碼變了沒?
為了弄明白這個問題,需要知道 md5 是什麼,是怎麼計算的?和修改檔案格式影響了什麼後,就知道這個問題的答案了。
MD5 是什麼?MD5(訊息摘要演算法)雜湊演算法是一種單向密碼函式,它可以接受任意長度的訊息作為輸入。
這裡的單向指的是可以透過輸入推匯出輸出 MD5 值,卻不能反過來透過 MD5 值推匯出輸入(當前已經不夠安全了,可以破解了)。
MD5 適合用來作為資訊摘要,通常 MD5 值一樣,說明輸入是一樣的(不是100%,但是機率很高,可以預設是一致的)。如果需要強一致性校驗,可以結合多種資訊摘要演算法來比對。
MD5 是怎麼計算的?如下圖所示,輸入的資料被以512位為單位進行位預算,得到128位的輸出。128位的輸出在於接下來的512位(不足需要補齊)進行計算,直到所有資料都計算完。
由此可見,同樣的輸入,輸出結果是一樣的。
修改檔案格式修改了什麼?這個需要看你是怎麼修改的,首先需要明確檔名跟檔案內容是兩個不同的東西,檔名就像一個人的名字,改名並不影響這個人的物理構成。
如果僅僅是修改了檔名的字尾,則並沒有修改檔案內容。
如果是對檔案進行轉換,不同格式的檔案的編碼是不同的,也就是檔案內容不同。
示例,1.隨機填充一個檔案
$ head -c 256 /dev/random > file.wav
2.檢視修改檔案字尾前後文件內容的md5,發現簡單修改檔名字尾是不影響檔案內容md5的。
$ md5sum.exe file.wav
5f69bc9716b09e7f19c3541d4cfc5d70
$ mv file.wav file.mps
$ md5sum.exe file.mps
5f69bc9716b09e7f19c3541d4cfc5d70
3.檢視檔名的md5, 可見不同的檔名的md5是不同的。
$ echo file.wav | md5sum.exe
b545d87a87be1a2a703f16c95b3593b4
$ echo file.mas | md5sum.exe
32a2a55bed9dcecb8cb91cfa2c175c1d
4.模擬修改檔案內容編碼,這裡使用bash64編碼來模擬格式轉換,發現編碼不同,檔案的md5是不同的。
$ md5sum.exe file.mps
5f69bc9716b09e7f19c3541d4cfc5d70
$ cat file.mps |base64.exe >file.b64
$ md5sum.exe file.b64
1c9707f4b22f8f27ef2911a632decd6c