假設(shè)你搞了個大新聞,希望通過安全途徑爆料給記者;又假如你有個互聯(lián)網(wǎng)領(lǐng)域的商業(yè)創(chuàng)意,想發(fā)送到投資人的 QQ 郵箱,卻擔(dān)心友商騰訊會掃描你們的往來郵件進而竊取創(chuàng)意;再或者你的郵件里因為有某些不可描述的文字內(nèi)容被郵件服務(wù)商給退回了……在這些情境之下,你可能需要用 OpenPGP/GnuPG 給你的郵件加密了。
OpenPGP 是廣泛使用的郵件加密標(biāo)準(zhǔn),定義在 RFC 4880 之中。而 GnuPG(又稱 GPG)是 OpenPGP 的一種開源實現(xiàn)。
原理簡述
OpenPGP 從完整性和保密性兩方面保證通信安全。對郵件進行數(shù)字簽名可以防止內(nèi)容被篡改,對郵件進行加密保證內(nèi)容不被刺探。兩部分功能相互獨立,可以獨立或共同使用。
OpenPGP 的工作原理大體是這樣的:用戶針對自己的郵件地址,生成一對密鑰。其中公鑰是完全公開的,可以上傳到公鑰服務(wù)器,讓通信的另一方通過郵件地址搜索到;也可以通過郵件等形式直接發(fā)送給對方。而私鑰是保密的,只有用戶自己知道。
現(xiàn)在假設(shè)用戶 Alice 希望發(fā)送加密郵件給 Bob,Alice 首先需要知道 Bob 的公鑰,然后利用 Bob 的公鑰和自己的私鑰加密郵件。Bob 收到郵件之后,用自己的私鑰就可以解密。如果第三方 Carol 截獲了郵件,雖然她可以獲得 Bob 公開的公鑰,但仍無法破譯郵件內(nèi)容。
有時,Alice 不在乎郵件是否被 Carol 看到,只關(guān)心內(nèi)容是否被篡改。那么她可以用自己的私鑰對郵件內(nèi)容進行數(shù)字簽名,并附在郵件中。Bob 收到郵件后利用 Alice 的公鑰就可以核對信息完整性。由于沒有 Alice 的私鑰,Carol 不可能在修改郵件內(nèi)容后生成合法的簽名。
郵件簽名和加密工具
作為 OpenPGP 標(biāo)準(zhǔn)的一種實現(xiàn),原始的 GnuPG 是個純命令行軟件,盡管許多中文博客對其有介紹,不過看完簡介仍然有可能一頭霧水。好在許多工具都將 GnuPG 集成在內(nèi),對郵件簽名加密并不需要直接在命令行里使用它。
OpenPGP 網(wǎng)站 列出了一系列郵件加密解決方案,涵蓋了各種桌面和移動操作系統(tǒng),有單獨的應(yīng)用,有常用郵件客戶端和瀏覽器的插件,還有直接提供加密服務(wù)的郵件平臺。
GPG Tools 是 macOS 上的一整套加密工具,它基于 GnuPG,包含了 Mail.app 插件、GPG 鑰匙串(GPG Keychain)等工具,可以無縫集成在 macOS 自帶的郵件客戶端中使用。
在 iOS 下,有 iPGMail 和 oPenGP 可選。
如果你習(xí)慣直接通過 web 訪問郵箱,Mailvelope 提供了 Chrome 和 Firefox 插件。
GPG Tools
軟件可以在官網(wǎng)下載。下載完成后,建議進行 SHA256 校驗——如果下載了不正確的版本,那郵件信息安全的基礎(chǔ)就被動搖了。事實上,官網(wǎng)本身都是 SSL 加密傳輸?shù)摹?/p>
sha256sum GPG_Suite-2017.1b2.dmg
安裝完成后,首次打開 Mail.app 時,會提示你創(chuàng)建密鑰對。(軟件提示是“密匙”,不過本文還是使用通用說法“密鑰”,二者同義。)
電子郵件地址應(yīng)該與 Mail.app 中郵件賬戶完全一致。設(shè)置口令(passphrase)可以增強安全性,但以后每次使用時都要輸入,一旦忘記,也無法恢復(fù),安全性與便利性需要權(quán)衡。勾選“上傳公鑰”后,公鑰會在創(chuàng)建完成后被自動上傳到公鑰服務(wù)器,全世界的人都可以通過你的電子郵件地址搜索到你的公鑰,方便固然方便,不過之后就不能修改全名了。初次使用可不勾選,畢竟之后你仍然可以隨時手動上傳。
點擊“生成密匙”,稍等片刻,就可以在 GPG Keychain 中看到新生成的密鑰對。現(xiàn)在,可以發(fā)出第一封加密郵件了!
在“郵件”中點擊“編寫新郵件”,可以看到右上角出現(xiàn)綠色的“OpenPGP”。
同時在“主題”一欄之后,出現(xiàn)兩個按鈕:加密和數(shù)字簽名。
默認(rèn)情況下,“數(shù)字簽名”按鈕是常亮的。而加密需要對方的公鑰,在填寫收件人并且獲得公鑰之前,始終是灰的。為了測試,你可以填上自己的郵箱地址,以打開加密按鈕。
填寫郵件標(biāo)題和內(nèi)容之后,給自己發(fā)送一封加密郵件。很快,你可以在收件箱中看到剛才發(fā)出的郵件。對于正確配置了 GPG Tools 的收件人來說,郵件驗證和解密完全是透明的,除了抬頭那一欄“安全性”之外,與普通郵件沒有任何區(qū)別。
如何知道對方的公鑰呢?當(dāng)然你可以讓對方通過簽名郵件發(fā)給你(在 GPG Keychain 中右擊密鑰,選擇“Mail public key”),更通常的做法是,通過“查找公鑰”工具,搜索對方電子郵件地址或 key ID 查找。公鑰服務(wù)器有許多,信息是共通的,由于不可描述的原因,默認(rèn)的服務(wù)器連接會超時,在“偏好設(shè)置”里改成 hkp://keys.gnupg.net
可以解決。
公開鑰匙算法的一個弱點就是公鑰的傳播。如果 Carol 生成了一對鑰匙,并偽裝成 Bob 的,Alice 在收到偽造的公鑰后,發(fā)送給 Bob 的郵件一旦被 Carol 截獲,后者可以用自己的私鑰將其解密。所以,通過郵件傳送公鑰時,數(shù)字簽名是必要的。收到公鑰后,通過可信渠道(比如打個電話啥的)核對“指紋”(fingerprint)也能避免這類攻擊。
iPGMail
這款應(yīng)用在 App Store 上賣 12 元人民幣,我買了。與之類似的 oPenGP 賣 30,我沒舍得再買。
這類軟件的功能要件無非這幾樣:
- 生成并管理自己的一對鑰匙
- 獲取對方公鑰
- 用鑰匙給郵件加解密、簽名
iPGMail 可以從 iCloud 導(dǎo)入鑰匙,可以生成鑰匙,也支持從一系列可編輯的服務(wù)器列表中下載公鑰。
由于 iPGMail 是以單獨應(yīng)用而不是插件形式存在的,收發(fā)郵件就相對麻煩了。你可以在 iPGMail 的“Compose”標(biāo)簽頁中生成加密/簽名郵件,然后傳送到 iOS 自帶的客戶端,由自帶客戶端最終發(fā)送;收到密文時,需要發(fā)送或復(fù)制到應(yīng)用中,由 iPGMail 解密。
Mailvelope
TODO
折騰這么半天,終于實現(xiàn)了幾乎全平臺的加密郵件收發(fā),現(xiàn)在你可以隨心所欲地給你同樣配置了 OpenPGP/GnuPG 的朋友們發(fā)信了——如果你真能找到的話。不得不說,開頭設(shè)想的幾種場景略顯中二,如果不是在安全領(lǐng)域,這樣的朋友恐怕很難成對出現(xiàn)。剛才看到個段子,有垃圾郵件發(fā)送者開始發(fā)送經(jīng)過加密和簽名的郵件,收件人解開郵件卻發(fā)現(xiàn)是尼日利亞王子的故事——繞過郵件過濾系統(tǒng)并成功引起收件人的注意,這或許是加密郵件在非極端場合下最大的作用了。