1. 程式人生 > >掃盲檔案完整性校驗——關於雜湊值和數字簽名

掃盲檔案完整性校驗——關於雜湊值和數字簽名

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

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

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

  2. 植入木馬/後門/人為篡改
  還有一種檔案不完整的情況,是被別有用心的人植入木馬或後門。比方說某些國內的軟體下載站點,它們提供的 Windows 安裝光碟映象已經被安置了後門。

  3. 傳輸故障
  這種情況主要發生在網路下載時。因為網路傳輸是有可能發生誤碼的(傳輸錯誤),另外還有可能下載到快結束的時候斷線(下載不完整)。這些情況就會導致你下載的檔案不完整。
  如今的上網環境相比當年的Modem撥號,已經有明顯改善。所以這種情況應該不多見了。

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

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

  這裡所說的”雜湊”是一種計算機演算法,洋文叫做 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 進行完整性校驗。

★雜湊值校驗的步驟

  如今,大夥兒的安全意識越來越高了。相應的,很多知名的軟體,除了在官網上提供下載,還會相應提供下載軟體的雜湊值。當你下載好某個軟體之後,先在自己電腦裡計算一下雜湊值,然後跟官方網站提供的雜湊值對比一下。如果雜湊值一樣,通常就說明沒問題。再囉嗦一下,儘量不要用 MD5,改用 SHA1。

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

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

  Firefox 瀏覽器
  開啟如下連結,可以看到 Firefox 某個版本的 SHA1 列表(把連結中的 XXXX 替換為版本號,比如18.0.2)。這個列表很長,包括各種語言,各個平臺。為了方便起見,你可以先算好 SHA1 雜湊值,然後到裡面搜尋該雜湊值
https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/XXXX/SHA1SUMS

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

  前面說完了校驗的流程,最後再說一下校驗的工具。
  考慮到大部分讀者是 Windows 使用者,俺介紹一下微軟官方的 FCIV(全稱是 File ChecksumIntegrity Verifier)。這是一個小巧、綠色、免費的命令列工具,下載頁面在”這裡”:http://support.microsoft.com/kb/841290/
  因為是命令列工具,你需要先執行 CMD,出現 Windows 的命令列介面(黑視窗)之後,在其中使用該工具。下面是 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,由大名鼎鼎的 SysInternals 出品(SysInternals 已經被微軟收購)。跟前面提到的 FCIV 類似,它也是一個小巧、綠色、免費的命令列工具,下載頁面在”這裡”:http://technet.microsoft.com/en-us/sysinternals/bb897441.aspx

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

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

  稍微補充一下,這個 SigCheck 命令還順便提供了雜湊值(命令格式如下),該功能可替代 FCIV 的頭兩個功能,可惜無法替代 FCIV 的第三個功能。
sigcheck -h 某個目錄或檔案的路徑名

★PGP/GPG 的數字簽名

  剛才聊了 Windows 平臺滴。但是,切莫以為只有 Windows 平臺才提供數字簽名——其它的數字簽名工具還有好幾種。名氣比較大的數字簽名工具當屬 PGP/GPG。這兩個縮寫就像繞口令,很容易搞混。PGP 是商業軟體,而 GPG 是 GnuPG 的縮寫,是 GNU 的開源專案。後者是前者的開源替代品,兩者的功能基本相容。
  這倆玩意兒的功能很強悍,校驗數字簽名對它倆只是小菜一碟。考慮到大夥兒平時較少碰到 GPG 的簽名,俺今天就偷懶一下,暫不介紹。以後如果有空,再專門寫一篇帖子介紹 PGP/GPG 的各種功能和使用場景。

__ Information from ESET NOD32 Antivirus, version of virus signaturedatabase 7356 (20120804) __

The message was checked by ESET NOD32 Antivirus.

相關推薦

掃盲檔案完整性——關於數字簽名

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

Linux下計算檔案檔案比較

在linux或Unix上,md5sum是用來計算和校驗檔案報文摘要的工具程式。一般來說,安裝了Linux後,就會有md5sum這個工具,直接在命令列終端直接執行。  2、命令格式 md5sum [OPTION]... [FILE]...  3、命令選項 -b 或

檔案完整性

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

函式陣列簽名概念

一、雜湊函式   也稱為雜湊函式,訊息摘要函式,單向函式或雜湊函式。 1. 作用:   不是完成資料加密和解密的工作,而是用來驗證資料的完整性的技術。  如下圖,通過對訊息進行雜湊,然後把訊息和雜湊值hashA一起傳送出去,當接受者收到訊息和雜湊值後,先對訊息進行雜湊,如果雜湊值

密碼學(一)—— 背景、常用的密碼演算法簡介,單向簡介、數字簽名簡介

背景 密碼,最初的目的就是用於對資訊的加密,計算機領域的密碼技術種類繁多,但隨著密碼學的運用,密碼還用於身份認證,防止否認等功能上。最基本的,是資訊加密解密分為對稱加密和非對稱加密,這兩者的區別在於是否在加密解密時是否使用了相同的金鑰。除了資訊的加密解密,還有用於確認資料完

C語言獲取檔案的SHA1(檔案)

安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準 (Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的

PHP 檔案 檔案的 MD5

PHP   MD5 雜湊值 應用場景: 1、校驗檔案的完整性       可用於伺服器檔案的備份處理。 2、檢驗檔案的重複性      去除伺服器上傳檔案的重複,佔用額外空間的問題。 3、校驗檔案是否被篡改   下載網站,多會放置MD5校驗碼,用於校驗檔案。 PHP校驗程

CentOs檔案完整性

linux md5sum hero.png fefd01c9db6e3e83b978eff1b7a67c02 hero.png   sha1sum hero.png f1e929db9cef34a8786ee4b6246fb739566c799d hero.png

Win8安裝驅動時提示“不在指定的目錄檔案中”的解決辦法

1、Windows鍵+C,或滑鼠螢幕右下角 2、設定→更多電腦設定 3、左邊選常規,右下角重新啟動 上面3個步驟也可用這個方法替代:Windows鍵+R→shutdown.exe /r /o /f /t 00→確定 4、等幾秒鐘會出現三個選項,選擇疑難解答 5、高階

win8.1安裝驅動出現“檔案不在指定的目錄”的解決辦法

原因是:升級了系統元件,舊的驅動程式和新系統Win8或10不相容,沒得到數字簽名通過,可通過下面方法解決 1. 按【win+c】組合鍵,或滑鼠螢幕右下角;點選【設定】—【更改電腦設定】 2. 點

win10安裝EOP/op 解決 檔案

win10系統下,很多使用者都在問禁用驅動程式強制簽名的問題,確實,設定起來有點複雜,需要使用者多點耐心。那麼下面就來看看win10系統下禁用驅動程式強制簽名的方法步驟。win10  準備:  1、進行下面操作前,請關閉所有正在執行的程式。  第一步、點開開始選單,點選裡面的

C++ 獲取PE檔案的程式碼

將寫程式碼過程比較重要的一些程式碼收藏起來,下邊資料是關於C++ 獲取PE檔案自校驗值的程式碼。 #include#include <imagehlp.h>#pragma comment(lib,"imagehlp") { char szFileName[] = "d:\newupdate.ex

Window 8.1 安裝驅動出現 “檔案不在指定的目錄檔案中。。。”

如圖: 解決方法: 按下鍵盤組合鍵 Win + C,然後點選“設定”-->"更改電腦設定"進入電腦設定之後,點選“更新和恢復”-->"恢復"-->"立即重啟"等一會,會出現幾個選

WIN10下安裝USB轉串列埠驅動出現 檔案不在指定的目錄 的解決辦法

                今天安裝openJTAG驅動時出現“檔案的雜湊值不在指定的目錄”,系統為WIN10專業版。

類Shiro權限框架的設計實現(2)--對復權限表達式的支持

treemap evel 註冊 st3 builder row blog array www. 前言:   我看了下shiro好像默認不支持復雜表達式的權限校驗, 它需要開發者自己去做些功能擴展的工作. 針對這個問題, 同時也會為了彌補上一篇文章提到的支持復雜表示需求,

Android 獲取證書籤名以及key hash

1、獲取Android應用簽名MD5/sha1/SHA256等證書指紋 keytool -v -list -keystore  uuoversea_tw.jks 2、獲取Android應用key hash 雜湊值  keytool -exportcert -alias

(集合框架)字串物件的

物件的雜湊值,是一個和普通的十進位制值,物件的雜湊值,源自於父類Object    String類繼承Object類,重寫了hashCode方法,所以它有了自己算雜湊值的方法 下面關注String類繼承Object類,重寫父類的方法hashCode

day30 __hash__ 計算

hash() # __hash__雜湊的時候會根據記憶體地址進行雜湊,因為地址不同所以雜湊的值也不同,哪怕是完全一樣子的屬性得出的雜湊值也不一樣因此存在需要某些時刻期望屬性相同得出相同雜湊值可以控制物件的雜湊值是否相等,或者規定改變 1 class B: 2 def __init__(s

CentOs文件的完整性

inux spa centos span util 成功 c11 ash code linux md5sum hero.png fefd01c9db6e3e83b978eff1b7a67c02 hero.png sha1sum hero.png f1e929

SpringBoot 回顯資訊--Ajax請求Controller後返回Map--提示賦

直接上程式碼: 第一: Controller類的方法:     @ResponseBody     @RequestMapping("/USER/Check")     public Map<String,String>