檔案完整性校驗

2021-09-29 10:16:59 字數 4199 閱讀 3121

**:

★什麼是」完整性校驗」?

所謂的」完整性校驗」,顧名思義,就是檢查檔案是否完整。那麼,什麼情況下會導致檔案不完整捏?大概有如下幾種情況。

1. 感染病毒

比方說你的系統中了病毒,病毒感染了某個軟體安裝包或者某個可執行程式。那麼該檔案的完整性就被破壞了。

★雜湊演算法(雜湊演算法)掃盲

◇什麼是」雜湊演算法/雜湊演算法」?

這裡所說的」雜湊」是一種計算機演算法,洋文叫做 hash,有時候也根據音譯稱為雜湊。

雜湊演算法可以把任意尺寸的資料(原始資料)轉變為乙個固定尺寸的」小」資料(叫」雜湊值」或」摘要」)。

◇摘要長度

對於某個具體的雜湊演算法,得到的雜湊值長度總是固定的。雜湊值的長度又稱」摘要長度」。

以下是常見雜湊演算法的摘要長度

crc32 32位元(4位元組)

md5 128位元(16位元組)

sha1 160位元(20位元組)

◇雜湊演算法的特色

1. 不可逆性

從剛才的描述看,雜湊似乎有點像壓縮。其實捏,雜湊演算法跟壓縮演算法是完全不同滴。壓縮演算法是可逆的(可以把壓縮後的資料再還原),而雜湊演算法是不可逆的。

還有一些人把雜湊演算法稱為」加密演算法」,這也是不對的。因為加密演算法是可逆的(」加密」的逆操作就是」解密」),而雜湊演算法是不可逆的。

2. 確定性

通過某種雜湊演算法,分別對兩個原始資料計算雜湊值。如果算出來的雜湊值不同,那麼可以 100% 肯定這兩段資料是不同的——這就是」確定性」。

但反過來,如果這兩段資料的雜湊值相同,則只能說,這兩段資料非常可能相同。所謂的」非常可能」,就是說,還達不到百分百。具體原因,請看下一節」雜湊函式的可靠性」。

★關於雜湊演算法的可靠性

◇什麼是」雜湊碰撞」?

剛才說了,存在非常小的可能性,導致兩段不同的原始資料,計算出相同的雜湊值。這種情況稱之為」雜湊碰撞」或」雜湊衝突」。

◇碰撞的型別

雜湊碰撞的型別,大體上有兩種:

1. 隨機碰撞

隨機碰撞就像買彩票中大獎,完全是出於小概率的偶然因素——你碰巧遇見兩個不同的資料(檔案),具有相同的雜湊值。

理論上講,任何雜湊演算法都存在隨機碰撞的可能性,只是可能性有大有小。

2. 人為碰撞

人為碰撞就是說,有人(通常是惡意的攻擊者)故意製造雜湊碰撞,以此來騙過」基於雜湊值的完整性校驗」。

◇如何避免碰撞

1. 對於隨機碰撞

要避免隨機碰撞,很簡單,只需要選擇摘要長度足夠長的雜湊演算法。

拿前面舉的3個例子。

crc32 的摘要長度是 32bit,也就說,最多可以表示 「2的32次方」 這麼多種可能性(也就是幾十億,數量級相當於地球總人口)。表面上看貌似很大,其實還不夠大。比如當前網際網路上的頁面總數就已經大大超過幾十億。如果對每個頁面計算 crc32 雜湊,會碰到很多重複(碰撞)。

而 md5 的摘要長度是128bit,也就是 2的128次方。這個數字足夠大了。通俗地說,從宇宙誕生到宇宙毀滅,你都未必有機會碰見 md5 的隨機碰撞。而 sha1 的摘要長度是160bit,那就更不用說了。

2. 對於人為碰撞

想避免人為碰撞,要同時兼顧兩個因素——雜湊演算法的摘要長度、雜湊演算法的優秀程度。」摘要長度」剛才已經解釋了。光說一下」演算法的優秀程度」。

如果某個雜湊演算法有缺陷(不夠優秀),那麼攻擊者就可以比較容易地構造出兩個不同的原始資料,但卻擁有相同的雜湊值。如此一來,就可以騙過基於雜湊演算法的完整性檢查。

典型的例子就是 md5,md5演算法在過去10多年裡曾經非常流行,但是前幾年被發現存在嚴重缺陷。所以,md5 雖然隨機碰撞的概率非常非常低,但人為碰撞的概率可不低。如果你比較注重安全性,盡量不要依賴 md5 進行完整性校驗。

★雜湊值校驗的步驟

下面,介紹幾個常用軟體的雜湊值頁面,便於大夥兒查詢

微軟的產品

到」這個頁面」:

可以查微軟發布的所有產品的雜湊值。微軟的產品很多,先根據型別或名稱篩選,找到某產品後,點」詳細資訊」,就可以看到 sha1 雜湊值。

firefox 瀏覽器

開啟如下鏈結,可以看到 firefox 某個版本的 sha1 列表(把鏈結中的 ***x 替換為版本號,比如18.0.2)。這個列表很長,包括各種語言,各個平台。為了方便起見,你可以先算好 sha1 雜湊值,然後到裡面搜尋該雜湊值

★雜湊值校驗的工具——fciv

◇計算單個檔案

比如你有乙個微軟的系統安裝光碟映象,位於c:\download\windows.iso 那麼,用如下命令可以計算該檔案的 sha1 雜湊值

fciv -sha1 c:\download\windows.iso

◇批量計算某個目錄

fciv 支援批量計算某個目錄下的檔案雜湊值。比方說,可以用如下命令可以計算 c:\download 目錄下的每乙個檔案的 sha1

fciv -sha1 c:\download\

◇批量計算並儲存,供前後對比

比如 c:\download 目錄下有很多檔案。俺想知道過一段時間之後,這些檔案是否被改過。那麼,可以先用如下命令,把該目錄中所有檔案的 sha1 雜湊都儲存到某個 xml 檔案中(本例中,儲存到 c:\hash.xml,你也可以儲存到其它檔名)

fciv -sha1 c:\download\ -xml c:\hash.xml

過了一段時間後,你可以用如下命令,就可以看出哪些檔案被修改過。

fciv -sha1 c:\download\ -xml c:\hash.xml -v

★什麼是」數字簽名」?

所謂的」數字簽名」,通俗來說,就是採用某種技術手段來證明某個資訊確實是由某個機構(或某個人)發布的。因為其用途有點類似於傳統的手寫簽字,所以稱之為」數字簽名」。

數字簽名的技術實現需要依賴於」非對稱加密技術」和」數字證書體系」。考慮到篇幅,這裡就不再囉嗦了。

★windows 平台的」數字簽名」

數字簽名有很多種,大夥兒比較常見的是 windows 平台下的數字簽名。如今大型 it 公司(比如:微軟、google、蘋果、等)或者是知名開源組織發布的 windows 軟體,安裝檔案通常都內建數字簽名。所以俺著重介紹 windows 平台的數字簽名該如何校驗。

◇利用資源管理器驗證單個檔案

大概從 windows 2000開始,windows 就支援在某個檔案尾部附加數字簽名,並且 windows 的資源管理器內建了對數字簽名的校驗功能。

下面俺通過幾個截圖,簡單介紹一下:如何在資源管理器中驗證數字簽名。

比如,俺手頭有乙個 firefox 的安裝檔案(帶有數字簽名)。當俺檢視該檔案的屬性,會看到如下的介面。眼神好的同學,會注意到到上面有個」數字簽名」的標籤頁。如果沒有出現這個標籤頁,就說明該檔案沒有附帶數字簽名。

選擇該標籤頁,出現如下介面。

順便說一下,某些數字簽名中沒有包含」郵件位址」,那麼這一項會顯示」不可用」;同樣的,某些數字簽名沒有包含」時間戳」,也會顯示」不可用」。不要緊張,這裡顯示的」不可用」跟數字簽名的有效性沒關係。

一般來說,簽名列表中,有且僅有乙個簽名。選中它,點」詳細資訊」按鈕。跳出如下介面:

通常這個介面會顯示一行字:」該數字簽名正常」(圖中紅圈標出)。如果有這行字,就說明該檔案從出廠到你手裡,中途沒有被篡改過(是原裝滴、是純潔滴)。

如果該檔案被篡改過了(比如,感染了病毒、被注入木馬),那麼對話方塊會出現乙個警告提示」該數字簽名無效」,介面如下。一旦出現數字簽名無效,那這個檔案就不要再使用了。

◇利用命令列工具批量驗證

使用如下命令,可以批量檢查某個目錄下(包括多層巢狀子目錄)的所有可執行程式,並且把」無簽名」或者」簽名無效」的檔案列出來。

sigcheck -u -e -s 某個目錄的路徑名

先提醒一下,檢查數字簽名的有效性本身就比較慢,如果目錄下的檔案很多,你要有足夠的耐心等它執行完畢。

稍微補充一下,這個 sigcheck 命令還順便提供了雜湊值(命令格式如下),該功能可替代 fciv 的頭兩個功能,可惜無法替代 fciv 的第三個功能。

sigcheck -h 某個目錄或檔案的路徑名

★pgp/gpg 的數字簽名

剛才聊了 windows 平台滴。但是,切莫以為只有 windows 平台才提供數字簽名——其它的數字簽名工具還有好幾種。名氣比較大的數字簽名工具當屬 pgp/gpg。這兩個縮寫就像繞口令,很容易搞混。pgp 是商業軟體,而 gpg 是 gnupg 的縮寫,是 gnu 的開源專案。後者是前者的開源替代品,兩者的功能基本相容。

這倆玩意兒的功能很強悍,校驗數字簽名對它倆只是小菜一碟。考慮到大夥兒平時較少碰到 gpg 的簽名,俺今天就偷懶一下,暫不介紹。以後如果有空,再專門寫一篇帖子介紹 pgp/gpg 的各種功能和使用場景。

檔案完整性校驗

什麼是 完整性校驗 所謂的 完整性校驗 顧名思義,就是檢查檔案是否完整。那麼,什麼情況下會導致檔案不完整捏?大概有如下幾種情況。1.感染病毒 比方說你的系統中了病毒,病毒感染了某個軟體安裝包或者某個可執行程式。那麼該檔案的完整性就被破壞了。雜湊演算法 雜湊演算法 掃盲 什麼是 雜湊演算法 雜湊演算法...

Dex檔案的完整性校驗

classes.dex 在 android 系統上基本負責完成所有的邏輯業務,因此很多針對android 應用程式的篡改都是針對 classes.dex 檔案的。在 apk 的自我保護上,也可以考慮對 classes.dex檔案進行完整性校驗,簡單的可以通過 crc 校驗完成,也可以檢查 hash ...

資料完整性校驗 釋疑

完整性 雜湊校驗 雜湊是一種不可逆的對映,可以將資料經過雜湊演算法計算得到乙個雜湊值,而無法再將該雜湊值反映射得到原始的資料。一般來說,不同的資料得到的雜湊值是不同的,但也有極少的可能會出現碰撞,但這種概率極小。在網路資料完整性校驗中使用的雜湊演算法通常包括 md5 sha。資料完整性校驗 資料完整...