以前寫過一篇文章跪但,詳細(xì)介紹了 GnuPG驼抹,以及如何使用 GPG 工具給郵件簽名和加密荸百。考慮到實際上你的朋友們并不會和你一樣使用 GPG桥帆,這些基本就成了屠龍之技。
好在 GPG 還是有其他用處的慎皱。
驗證下載內(nèi)容
不管是政策法規(guī)原因,還是運營商出國帶寬原因叶骨,反正現(xiàn)在要去國外的軟件官網(wǎng)下點東西茫多,是越來越難了。如果去國內(nèi)第三方下載忽刽,怎么保證下到的文件沒有經(jīng)過篡改呢天揖?畢竟,之前鬧得沸沸揚揚的 XcodeGhost 事件就是前車之鑒啊跪帝。
有的網(wǎng)站提供 MD5 驗證今膊。通過對比本地使用 md5sum
計算得到的校驗和與官網(wǎng)提供的校驗和,來驗證文件完整性伞剑。但是 MD5 可以構(gòu)造沖突斑唬,發(fā)動所謂碰撞攻擊 collision attack,也就是說黎泣,被篡改的文件明明和原文件不一樣恕刘,但是可以構(gòu)造出相同的 MD5 校驗和。
又有網(wǎng)站提供 SHA256 驗證抒倚。使用方法差不多褐着,抵御 collision attack 的能力比 MD5 要強。如果是在 TLS/SSL 加密過的官網(wǎng)(你得好好確認(rèn))獲得的 SHA256 校驗和的話托呕,那么這種方法還是具有一定可靠性的含蓉。
為什么要強調(diào) TLS/SSL 呢?因為沒有簽名的網(wǎng)頁給出的校驗和本身有可能被篡改啊项郊。某些第三方的鏡像馅扣,同時還鏡像了官方的未簽名的校驗和,那就簡直搞笑了:第三方如果真的篡改了文件呆抑,只要相應(yīng)修改鏡像內(nèi)的校驗和即可岂嗓,用戶拿著它在本地校驗純屬浪費時間。
所以為了驗證文件完整性鹊碍,一方面需要保證哈希算法的 collision resistance厌殉,另一方面還要保證官方給出的校驗和正確送達(dá)你手中食绿。防不勝防啊。
第二種需求就是 GPG 的典型應(yīng)用場景——郵件簽名嘛公罕。官方公開一份用自己的私鑰簽名了的文件器紧,其中包含了正確的 SHA256 校驗和,無論用戶在哪里得到了它楼眷,都可以驗證內(nèi)容是否由官方發(fā)出铲汪,是否被篡改。只要確保擁有官方的公鑰罐柳,無論在哪里獲得的軟件掌腰,無論在哪里獲得的校驗和,都可以放心地用 sha256sum
驗證對比后使用张吉。
怎么獲得對方公鑰呢齿梁?你得知道對方的 key ID,然后從公鑰服務(wù)器上獲取肮蛹。
gpg --keyserver hkp://keys.gnupg.net --recv-key 7D8D0BF6
7D8D0BF6
是 Kali Linux 發(fā)布軟件用的鑰匙勺择,其文檔中有詳細(xì)的校驗步驟,本文就是參考文檔寫成伦忠。
話說回來省核,你還是得知道對方的 key ID。不過 key ID 很短昆码,比較容易獲得和記憶气忠,而且鑰匙一旦獲得,會保存在本地赋咽,下次使用就不需要再次獲取了笔刹。
查看 fingerprint,確認(rèn)公鑰正確導(dǎo)入:
gpg --fingerprint 7D8D0BF6
輸出差不多是這樣:
pub 4096R/7D8D0BF6 2012-03-05 [expires: 2018-02-02]
Key fingerprint = 44C6 513A 8E4F B3D3 0875 F758 ED44 4FF0 7D8D 0BF6
uid Kali Linux Repository <devel@kali.org>
sub 4096R/FC0D0DCB 2012-03-05 [expires: 2018-02-02]
和軟件一起下載到的 SHA256SUMS
和 SHA256SUMS.gpg
冬耿,前者是校驗和舌菜,后者是對前者的簽名,用公鑰對簽名進行驗證亦镶。
gpg --verify SHA256SUMS.gpg SHA256SUMS
確比赵拢看到 Good signature 的提示,否則就是驗證失敗了缤骨。
官方給出的校驗和沒問題爱咬,接下來就看與本地算出的校驗和是不是一致了。
你當(dāng)然可以算出后進行肉眼比對绊起,但是下面的命令更方便直觀:
grep kali-linux-2016.2-amd64.iso SHA256SUMS | shasum -a 256 -c
如果不出意外精拟,結(jié)果差不多是這樣:
kali-linux-2016.2-amd64.iso: OK
看到 OK,就是驗證成功了。
第一次導(dǎo)入公鑰成功后蜂绎,以后每次驗證只需要兩條命令栅表,算是比較方便的了。
ubuntu 也使用了同樣的驗證方式师枣。CentOS 驗證方式略有不同怪瓶,它提供了一個同時包含校驗和與簽名的 sha256sum.txt.asc,可以這樣校驗簽名:
gpg --verify sha256sum.txt.asc
如果在 Mac 上裝了 GPG Suite 的話践美,雙擊 .asc
文件就可以完成校驗洗贰,導(dǎo)入公鑰都省了。
把 .asc
和 .iso
放在同一目錄下陨倡,可以用以下命令驗證校驗和:
sha256sum -c sha256sum.txt.asc 2>&1 | grep OK
為 GitHub 每一次提交簽名
仍然是保證提交完整性的一個應(yīng)用場景敛滋。先在 GitHub 賬戶中上傳你的公鑰,隨后對每次提交兴革,在本地用私鑰簽名矛缨,當(dāng) git push
到 GitHub 后,服務(wù)器會驗證這次提交是不是由你完成的帖旨。
服務(wù)器端,在 GitHub 的 Settings -> SSH and GPG keys 里灵妨,添加你的 GPG 公鑰解阅。
在本地,首先告知 git
鑰匙信息泌霍。用 gpg --list-secret-keys --keyid-format LONG
命令货抄,查詢私鑰 ID。
$ gpg --list-secret-keys --keyid-format LONG
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot
ssb 4096R/42B317FD4BA89E7A 2016-03-10
像上面那樣朱转, 3AA5C34371567BD2
就是私鑰的 key ID蟹地。
告知 git
,
git config --global user.signingkey 3AA5C34371567BD2
如果用的不是 GPG Suite藤为,還要設(shè)置環(huán)境變量怪与,
echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile
GPG 鑰匙對應(yīng)的郵件地址必須和 git
提交的郵件地址一致,否則看這里缅疟。
提交的時候分别,加參數(shù) -S
可簽名。
git commit -S -m 'your commit message'
如果要默認(rèn)簽名存淫,可以設(shè)置
git config commit.gpgsign true
如果希望本機所有提交都簽名耘斩,給上面的命令加 —global
參數(shù)即可。
加密 Facebook 郵件通知
Facebook 為用戶提供上傳 GPG 公鑰服務(wù)桅咆。點擊設(shè)置括授,選擇安全與登錄,在頁面最下方上傳。上傳后荚虚,既可以打開加密郵件通知薛夜,也可以在個人頁面公開,以便和你的 geek 朋友們通信曲管。設(shè)置完成后却邓,需要點擊郵件鏈接確認(rèn)。注意院水,如果打開加密腊徙,賬戶找回通知也是加密發(fā)送的。要是哪天重裝系統(tǒng)把私鑰給弄丟了檬某,趕緊關(guān)掉加密或者換掉公鑰吧撬腾。