使用 GnuPG 加密簽名來驗證下載文件的可靠性和完整性
一個快速和簡單地驗證下載文件的完整性的方法是使用不同的校驗工具(比如:md5sum、sha356sum、cksum)來計算和比較校驗碼(比如:MD5、SHA、CRC)。然而,然而校驗容易受到碰撞攻擊,而且同樣不能用於驗證文件的可靠性(比如:擁有者)。
如果你想要同時驗證下載文件的可靠性(擁有者)和完整性(內容),你需要依賴於加密簽名。本教程中,我會描述如何使用GnuPG(GNU Privacy Guard)來檢查文件的可靠性和完整性。
本例中我會驗證一個從 https://onionshare.org 上下載的磁碟鏡像。這個網站中,發行商會提供他們的公鑰,還有它用於密鑰驗證的指紋。
至於下載的文件,發行商也會提供它相關的PGP簽名。
安裝 GnuPG 並且生成一個鍵對
讓我們首先在你的Linux系統上安裝GnuPG。
在Debian、Ubuntu和其他Debian衍生版上:
$ sudo apt-get install gnupg
在Fedora、CentOS或者RHEL上:
$ sudo yum install gnupg
完成安裝後,生成一個本篇中會使用到的鍵對。
$ gpg --gen-key
在生成鍵對期間,你會被要求提供你的姓名和email,還有保護你私鑰的密碼。你同樣也可以選擇鍵對何時過期(默認不會過期)。依賴於你選擇的key的大小(在1024和4096位之間),key生成會花上幾分鐘或者更多,同時它要求收集來自你桌面活動的大量的隨機數據。(比如鍵盤輸入、滑鼠移動、磁碟訪問等等,所以這個時候隨便動動滑鼠鍵盤什麼的)。
一旦key生成完畢後,公鑰和私鑰會存儲在~/.gnupg目錄。
與某個文件和擁有者建立信任
驗證下載文件的第一步是與任何提供文件下載的人建立信任。出於此,我們下載了這個文件的公鑰,並且驗證公鑰的擁有者是否是他或者她自稱的。
在下載完文件擁有者的公鑰後:
$ wget https://onionshare.org/signing-key.asc
使用gpg命令導入公鑰到你的keyring中
$ gpg --import signing-key.asc
一旦擁有者的公鑰導入後,他會像下面那樣列印出一個key ID(比如:"EBA34B1C")。記住這個key ID。
現在,運行下面的命令檢查導入的公鑰的指紋:
$ gpg --fingerprint EBA34B1C
你會看到key的指紋字元串。把這個和網站上顯示的指紋做對比。如果匹配,你可以選擇信任這個文件擁有者的公鑰。
一旦你決定相信這個公鑰,你可以通過編輯key來設置信任級別:
$ gpg --edit-key EBA34B1C
這個命令會顯示GPG提示符:
在GPG提示符中輸入「trust」,它會讓你從1-5之間選擇這個key的信任等級。
本例中,我決定分配給它「4」,在這之後,輸入「sign」用你自己的私鑰簽名,接著輸入在GPG提示符中輸入「save」來完成操作。
要注意的是不需要這樣明確地給一個公鑰指派信任,通過key的導入隱式地信任往往就夠了。
給一個key隱式地分配給「完全」的信任就是任何其他由這個完全信任簽名的key X都會被認為是對你有效的。通常上,key驗證依賴於一個稱之為「信任網」的複雜機制。
回到教程,現在讓我們檢查導入的key列表。
$ gpg --list-keys
你至少會看到兩個key:一個帶 depth 0和終極信任("1u"),這就是你自己的key,另外一個帶depth 1和完全信任("1f"),這是你之前簽名的key。
驗證文件的可靠性/完整性
一旦你建立了與文件擁有者和他的/她的公鑰之間的信任關係,我們需要驗證你從擁有者那邊下載的文件的可靠性和完整性了。
本例中,文件擁有者分別公布了一個文件和它相關的PGP簽名(.asc)。簽名所起的作用就是認證(文件)並且在其中加入一個時間戳。
一個典型的簽名(*.asc)看上去像這樣。
-----BEGIN PGP SIGNATURE--
iQIcBAABCgAGBQJUJGhsAAoJEP1yCtnro0sc1jUP/ixNY/lKdrcMIAUoqlWKNE8f
sj4SFiwREMew76w66GASDF03fa5zPX6EsS2kucgx8ZsfEiSmN5T0y2P/aSaXwZqF
kywZVEzirKtca5AJ4DBzu6qrt9GgSw6JBJVv1oBJCMNyO+eAj341paR3MudvnyQz
H/N5tc4Qcilzy6M184opGIzy4ipEmMXfLHsd7WJpAyn+tO/z3uhh9NkNuygZpaFr
olpSWPE8revdDJyfMfSmb3ZrFmhLn7FCEltOi+a7SluvrMclizfnbec9rgLJtjo0
CPDZY7tsWmmL0DA3VvpMVqGvkg/Dyhpn2IIDrNaLAlvGQ5aovf+4tjad5IHvyaWx
4Gds93G6Hqvv5RwGx7OR3hgt2o0Y+qFsVDxVnPxerGhXeJXHzSDwLQMpdj9IoSU
Ae/53XXnxqSN6POZcwHiHvbsv0pdlg0Ea0dDAAN0ZeINNyZf1R0tLjWkcgpvGCtv
qkJuYFF9W9cWHraPY2ov5Hs/JZzPcG0eVpnDdzfOOH1gDKADq9A5D2X5QJCulsh9
WwU3X+E43OqIsoRzBucItD9HhZbEH7t8Q0xAqnAkgU3hriZp3dN4cnMfhM6I9hli
EmpSpLKCceMexu2o9QgzGXVm+AGZJe4QkuwAhRIccp5JDMVny61UlKTasjy6co8h
5GBhhYybPEFM+G1BODMd
=c9wo
-----END PGP SIGNATURE--
現在讓我們同時下載它的文件和簽名:
$ wget https://onionshare.org/files/0.6/OnionShare.dmg
$ wget https://onionshare.org/files/0.6/OnionShare.dmg.asc
現在驗證下載文件的PGP簽名。
$ gpg --verify OnionShare.dmg.asc OnionShare.dmg
如果命令的輸出包含了「Good signature from <文件所屬者>」,那麼下載的.dmg文件就被成功地認證和核實了。如果下載的文件的任何地方在簽名後被篡改了,那麼驗證就會失敗。
這時你就可以放心地信任你下載的文件了。
via: http://xmodulo.com/verify-authenticity-integrity-downloaded-file.html
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive