1. 程式人生 > >Linux下校驗下載檔案的完整性(MD5,SHA1,PGP)

Linux下校驗下載檔案的完整性(MD5,SHA1,PGP)

 

原文:https://www.cnblogs.com/Alight/p/4104070.html

檢視:

Linux下校驗下載檔案的完整性(MD5,SHA1,PGP)

http://blog.useasp.net/archive/2014/03/29/use-md5-sha1-or-pgp-to-check-downloaded-file-integrity-on-linux.aspx

Linux下的學習開始總是艱難的,但有的時候,卻發現下遠比Windows的操作來的實在的多——這下載檔案的完整性就是其中一件,讓本人覺著很爽的一件事情。在編譯安裝各種軟體的時候,總要到各個網站上收集下軟體原始碼包。正由於此,軟體的入口就非常複雜,

是否被修改過就顯得非常有必要了。而校驗方法當前一般是MD5,SHA1,PGP三種。在Windows那個漫長的歲月裡(滄桑有木有),一般只能接觸到前兩種——前提是你會去校驗的話。

原理:對檔案進行MD5 Hash,求出檔案的MD5雜湊值,通過下載後文件MD5雜湊值和釋出者提供的MD5雜湊值是否一致來判斷檔案是否在釋出者釋出之後被篡改過。

說明:壽命老長的一個Hash演算法,適用範圍廣,網站儲存密碼也經常使用。不同的檔案產生的MD5雜湊值是唯一的,但這點已經有辦法通過對檔案進行少量的修改,讓檔案的MD5後的雜湊值保持一致。

使用:在CentOS下,要對檔案進行MD5 Hash是很簡單的,一個md5sum

命令即可:

code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # $是終端提示符,非輸入. # #號是註釋 # 沒有提示符的是輸出 #直接輸出MD5 Hash $ md5sum your-downloaded- file -name fd4a1b802373c57c10c926eb7ac823d8  your-downloaded- file -name   #將MD5 Hash值儲存到md5-hash.txt檔案中. $ md5sum your-downloaded- file -name > md5- hash .txt # 顯示輸出的md5-hast.txt內容 $ cat  md5- hash .txt fd4a1b802373c57c10c926eb7ac823d8  your-downloaded- file -name   # 通過md5-hash.txt來校驗你下載的檔案是否正確 $ md5sum -c md5- hash .txt your-downloaded- file -name: OK

你是檔案的釋出者話,你可以通過md5sum把檔案的雜湊值傳送給驗證者,這樣下載你檔案的人就可以通過MD5雜湊值來驗證你的檔案正確性。反過來,我們在網站上下載檔案之後,同時可以獲取釋出者的MD5雜湊值和本地生成的Hash值對比,如果一致,認為檔案是正確的。

 

原理: 原理同MD5一樣,都是通過對檔案進行HASH求值,比對檔案釋出者釋出的HASH值,通過是否相等判斷檔案是否被篡改

說明: SHA1 HASH求值方法可以說是MD5的一個升級版本(SHA1 20位,MD5 16位),在HASH求值方面,MD5退出的舞臺將有SHA1佔據。SHA家族有五個演算法:SHA-1、SHA-224、SHA-256、SHA- 384,和SHA-512,後四種有時候稱為SHA2

使用: CentOS有SHA1的命令:sha1sum

code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 說明同上 # 直接輸出SHA1 Hash $ sha1sum your-downloaded- file -name 12dc96cbd822598c1230c87622f3591461a77227  your-downloaded- file -name   # 將SHA1 Hash值儲存到檔案中 $ sha1sum your-downloaded- file -name > sha1- hash .txt # 顯示檔案內容 $ cat  sha1- hash .txt 12dc96cbd822598c1230c87622f3591461a77227  your-downloaded- file -name   #通過sha1-hash.txt來校驗我們下載的檔案your-downloaded-file-name # 注意,檔案必須要要通過txt檔案中的路徑知道哦 $ sha1sum -c sha1- hash .txt your-downloaded- file -name: OK

 這個SHA1和MD5基本一致,需要補充說明下的是,在使用md5sum也好,還是sha1sum也罷,校驗檔案的時候,務必要讓系統能夠根據檔案中提供的路徑找到檔案,如果檔案找不到,是沒有辦法進行校驗的。

如果是做多個檔案的Hash校驗,可以通過一個檔案儲存多個檔案的Hash值即可。

 

原理:使用非對稱加密,程式生成唯一的金鑰對(公鑰和私鑰:Public Key和Private Key/Secret Key)。操作方法如下:

  1. 釋出者通過用生成的金鑰對中的私鑰對要釋出的檔案進行簽名,得到簽名檔案(sign);
  2. 釋出者將金鑰對中的公鑰釋出到公鑰伺服器;
  3. 釋出者將檔案和用私鑰生成的簽名一起釋出;
  4. 驗證者下載釋出者釋出的檔案和簽名;
  5. 使用PGP的程式獲取的釋出者第二步釋出的公鑰;
  6. 使用公鑰校驗檔案簽名

說明:簽名演算法中,金鑰的用處分別是:公鑰用於加密資訊和驗證,私鑰用於解密和簽名。私鑰掌握在資訊釋出方,公鑰可以任意分發。資訊釋出方用金鑰進 行對資訊進行簽名,接收方在獲取公鑰後,可以用公鑰對釋出方釋出的資訊+簽名進行驗證。如果驗證失敗則認為資訊被篡改。在網路中,我們經常碰到的 HTTPS協議,使用了同樣的機制。

使用:由於PGP是商業應用程式,在CentOS/Linux中,具有同類功能的是GPG(也就是:),同樣遵守OpenPGP資料加密標準(RFC 4880),沒有安裝可以用yum install gnupg安裝,命令是:gpg

code
1 2 3 4 # 說明同上 # 由於過程相對複雜,並且在實際使用中,校驗用的比較多,因此這裡只介紹檔案的校驗過程。 # 在獲得檔案和簽名時,我們先用gpg校驗簽名,此時檔案必須存在 $ gpg --verify downloaded- file -sign.asc

 這裡有多種情況,如果你只有簽名,但生成簽名的檔案不存在時(系統沒找到,一般應該放在同目錄下面),返回的是:

code
1 2 gpg: 不含簽名的資料 gpg: can't hash datafile: No data

當你有檔案的時候,但還沒有與簽名對應的公鑰時,gpg返回的資訊類似下面:

code
1 2 gpg: 於 2013年05月06日 星期一 18時27分27秒 CST 建立的簽名,使用 RSA,鑰匙號 47ACDAFB gpg: 無法檢查簽名:No public key

注意:上面的資訊在不同的檔案和作業系統上生成的資訊是不同的。但在沒有公鑰的時候,你可以發現gpg提供了一個該簽名對應的鑰匙號:47ACDAFB,這個是我們需要找的公鑰。

上面已經說過,釋出者已經將公鑰釋出到公鑰伺服器中,供驗證者下載,因此我們需要到公鑰伺服器中下載公鑰,要下載公鑰,鑰匙號就很重要了。

可用的公鑰伺服器可以通過wikipedia 上的Key Server條目來檢視常用的一些key伺服器列表。這裡使用hkp://pgp.mit.edu:

code
1 2 3 4 5 6 7 # 獲取伺服器上的public key $ gpg --keyserver hkp: //pgp .mit.edu --recv-keys 47ACDAFB gpg: 下載金鑰‘47ACDAFB’,從 hkp 伺服器 pgp.mit.edu gpg: 金鑰 47ACDAFB:公鑰“Stephan Mueller <[email protected]>”已匯入 gpg: 沒有找到任何絕對信任的金鑰 gpg: 合計被處理的數量:1 gpg:           已匯入:1

--recv-keys要與--keyserver配合使用,匯入金鑰對的公鑰之後,我們就能夠使用這個公鑰來驗證我們的簽名了。

再次執行我們之前的驗證命令(gpg --verify  sign-file),就可以看到驗證的結果了。

code
1 2 3 4 5 6 7 #這時候我們再次驗證我們的簽名,就能得到驗證結果了 $ gpg --verify downloaded-file-sign.asc gpg: 於 2013年05月06日 星期一 18時27分27秒 CST 建立的簽名,使用 RSA,鑰匙號 47ACDAFB gpg: 完好的簽名,來自於“Stephan Mueller <[email protected]>” gpg: 警告:這把金鑰未經受信任的簽名認證! gpg:       沒有證據表明這個簽名屬於它所聲稱的持有者。 主鑰指紋: B0F4 2D33 73F8 F6F5 10D4  2178 520A 9993 A1C0 52F8

 看到這個結果,至少確認一個結果:這個檔案是沒有被篡改過的。

一般我們到這步也就差不多了。

但注意訊息裡面有個警告,說明這個是未受信任的簽名認證。因為這個公鑰誰都可以釋出上去的,如果你確實需要進一步認證,可以在簽名認證之前,你能還要聯絡下真正的釋出者,確認這個金鑰的資訊——指紋(fingerprint)!這個算是PGP演算法的一個弱點。

如果簽名認證已經通過,你也就可以安心的在自己的系統內編譯,安裝它了。

關於PGP的更多資訊,可以參考以下網站:

  1. wikipedia PGP
  2. ubuntu GPG/PGP
  3. GnuPG,HOWTOs中MiniHOWTO中有個zh的文件,是中文的
  4. gentoo GnuPG