問題描述:
可能大家都遇到過軟件在下載過程中由於網絡原因導致下載的軟件體積與實際軟件體積不符。最常見的辦法是對待下載文件附加一個摘要文件。這種做法比較常見,也比較容易實現。但是,還是會有一個問題:如果我篡改了網站,改變了文件的內容,並對該文件做了一次摘要,替換了原有的摘要文件。那用戶下載的文件就失去了摘要驗證的意義。如何避免這種問題呢?
解決方案:
軟件提供者對文件做簽名,軟件使用者對文件做驗證。
簽名/驗證,是一種用於對網絡數據傳輸有效性鑒別的常見方法,屬於非對稱加密算法領域。
使用私鑰對數據進行簽名,使用公鑰對數據簽名做校驗。
在這里的理解可以是,私鑰由軟件提供者保留,而公鑰由軟件提供者在網站上公布,並且,該公鑰經過更權威認證機構的簽名。是不是很想CA審核數字證書的系列流程?其實大同小異,只是這種方式更自由一些,也省去了CA認證的費用。這種開放的數字安全模式有別於我們熟悉的PKI,它屬於GunPG/PGP。
實踐操作:
用commons-cdec下載為例,上圖:
以commons-codec-1.8-bin.tar.gz為例,左邊MD5的方式就不說了,看看pgp打開是個什么樣的東西。
加有“PGP SIGNATURE”標識的一段BASE64編碼的數字簽名。
前面說過,要對簽名校驗,就需要有對應的公鑰。那么公鑰在那里呢?
就是那個紅框的KEYS。
下載公鑰:
- wget http://www.apache.org/dist/commons/KEYS
接下來,導入公鑰,並對commons-codec-1.8-bin.tar.gz進行簽名驗證。
- $ gpg --import KEYS
- $ gpg --verify commons-codec-1.8-bin.tar.gz.asc commons-codec-1.8-bin.tar.gz
得到如下提示:
gpg: Good signature from "Gary David Gregory (Code signing key) <ggregory@apache.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 2DB4 F1EF 0FA7 61EC C4EA 935C 86FD C7E2 A112 62CB
gpg: Good signature from "Gary David Gregory (Code signing key) <ggregory@apache.org>"說明這個簽名有效。
有個警告,是因為本地密鑰庫不信任該公鑰。
需要對這個公鑰簽名:
- $ gpg --sign-key A11262CB
- gpg: checking the trustdb
- gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
- gpg: depth: 0 valid: 1 signed: 1 trust: 0-, 0q, 0n, 0m, 0f, 1u
- gpg: depth: 1 valid: 1 signed: 0 trust: 1-, 0q, 0n, 0m, 0f, 0u
- gpg: next trustdb check due at 2014-05-30
- pub 2048R/A11262CB created: 2011-04-12 expires: never usage: SC
- trust: unknown validity: full
- sub 2048R/AD3D7F94 created: 2011-04-12 expires: never usage: E
- [ full ] (1). Gary David Gregory (Code signing key) <ggregory@apache.org>
- "Gary David Gregory (Code signing key) <ggregory@apache.org>" was already signed
- by key 23E8E553
- Nothing to sign with key 23E8E553
- Key not changed so no update needed.
這時候就不會有警告了。