201501291652Hash 建立檔案特徵碼 - md5sum sha512sum - Shell Script

   在網路上下載檔案,怎麼知道檔案有沒有下載完整,檔案有沒有被竄改呢?所以各大下載檔案主機都還會提供 md5sum.txt 或 sha256sum.txt 這樣的檢查檔案,讓下載的使用者可以自行檢查,下載的內容是否跟伺服器上的一致,他的原理是利用雜湊法 MD5 / SHA 來取得一特徵值(hash)。

H(file)= hash value ,但無法從 hash value 反轉回 file。

--- 理論上的我就不多說了,直接來看~~~在 Linux / CentOS 環境下怎麼利用他 --------------

假如你有一個檔案 fileA 你想取得他的特徵值,該怎麼做

$ /usr/bin/md5sum fileA
cee36a4cc3e512c704ff89f69d248ee5 fileA
$ /usr/bin/sha1sum fileA
13cea5b15b6046ab4e2368f63f91dda34fcb15c4 fileA
$ /usr/bin/sha224sum fileA
bb0cc9d18d3b61b93a8b513414982f297af78d15acff4869e7acc28a fileA
$ /usr/bin/sha256sum fileA
677f3de8e8c4853b271c3d761f8e326a6f21c98d15a8908e62f9e400fac676cd fileA
$ /usr/bin/sha384sum fileA
eecb2da324a99593977921f41667c737d10d1151d80e51fda93bf7f2ad36ca9f41a3bb8dd6880df5b30e50e95605779d fileA
$ /usr/bin/sha512sum fileA
a329c2b02befca338a976fd71ece32ddced859688b771a429d2b913beac9fe80e950ac0e5b34fe47b7c3abccdbb520116336901d3eb82aa76e3427a5d8fc1c93 fileA

理論上來說,不同的檔案不會得到同一個特徵值~~~
因為MD5 產出的是32個 英文字母+數字 混合的字串,排列組合有 36^32 次方,幾乎可以說不會重複了.......但~~還是有可能,所以 SHA 這個雜湊演算法就提供了更長的 hash 值來避開這個問題。

--- 那怎麼驗證檔案是一致的呢?----- 假設我們把上面產出的值,存在名為  fileA.hash 檔案

#md5sum 跟 sha 都是使用參數 -c [檔名] 來做檢查
$ /usr/bin/md5sum -c fileA.hash
fileA: 正確

$ /usr/bin/sha1sum -c fileA.hash
fileA: 正確

利用 sha512sum 檢查,並故意修改檔案內容
$ /usr/bin/sha512sum fileA > fileA.hash
$ cat fileA.hash
a329c2b02befca338a976fd71ece32ddced859688b771a429d2b913beac9fe80e950ac0e5b34fe47b7c3abccdbb520116336901d3eb82aa76e3427a5d8fc1c93 fileA
$ /usr/bin/sha512sum -c fileA.hash
fileA: 正確
$ echo "aaa" >> fileA
$ /usr/bin/sha512sum -c fileA.hash
fileA: 錯誤
/usr/bin/sha512sum: WARNING: 1 of 1 computed checksum did NOT match

================================================

我在「對個別檔案作壓縮、加密 - 使用 7ZIP 跟 openssl」跟「tar 指令 - 加密、解密 - 排除某目錄某檔案備份 - 差異備份」曾提到,在做備份的時候可以寫段 shell script 使用 tar 跟 openssl 來對檔案作包裝、壓縮跟加密,今天看完這個,你還可以加上 hash 值更進一步的確認檔案是否有遭受到修改。

當然也可以針對重要檔案每日檢查,一旦 hash 有錯的時候代表被更動了,可以進一步的採取還原措施。

可用的方法:
S1: 將重要要檢查的檔案或目錄寫在一個設定檔
S2:將設定檔內所有檔案計算特徵值 hash
S3:將設定檔內所有檔案+特徵值檔案 利用 tar 跟 gz 備份起來
S4:利用 openssl 做加密保護
S5:用 scp 複製到備份池(異機甚至異地)
S6:將整段的記錄 mail 給自己

在 S2 步驟後,可以再加一個動作,就是每日 md5sum -c  xxx.hash 去檢查跟前一次備份中,哪些檔案被異動了,再以 S6 步驟回報給自己確認

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

會遭遇的問題

剛剛說的 tar, scp 都可以自動的處理目的地檔案是目錄的情況,但是 md5sum 或 sha512sum 無法直接處理目錄
$ md5sum /etc
md5sum: /etc: 是個目錄
$ sha512sum /etc
sha512sum: /etc: 是個目錄

 

底下的例子是執行時要求使用者輸入「設定檔:內容為每一行記錄要備份的檔案或目錄名稱,一行一個」,然後利用 find 的技巧來處理檔案/目錄,這樣 md5 或 sha 就具有遞迴 recursive 的處理能力了。最後再將計算出來的 hash 儲存在 MD5Output.hash 檔案中。

OutputFile="MD5Output.hash"
echo -n "讀取檔案 :" 
read filename
exec < $filename
while read var
do
   find $var -type f -exec md5sum {} ; >> $OutputFile
done

~End

 

回應
Google Search
Google
累積 | 今日
loading......
平均分數:0 顆星
投票人數:0
我要評分:
Google