用 PGP 保護程式碼完整性(五):將子金鑰移到一個硬體裝置中
在這個系列教程中,將為你提供使用 PGP 和保護你的私鑰的最佳體驗。
在本系列教程中,我們將提供一個使用 PGP 的實用指南。如果你沒有看過前面的文章,你可以透過下面的連結去檢視。在這篇文章中,我們將繼續討論如何保護你的金鑰,談一談將你的子金鑰移到一個專門的硬體裝置中的一些技巧。
清單
- 取得一個 GnuPG 相容的硬體裝置(必要)
- 配置 GnuPG 在裝置上工作(必要)
- 設定使用者和管理員的 PIN(必要)
- 移動子金鑰到裝置中(必要)
考慮事項
雖然現在主金鑰已經不用擔心洩露或失竊了,但子金鑰仍然在你的家目錄中。任何得到它的人都能夠解密你的通訊或假冒你的簽名(如果他們知道金鑰的密碼)。並且,每次執行一個 GnuPG 操作都要將金鑰載入到作業系統記憶體中,這將使一些更高階的惡意軟體有機會得到你的金鑰(想想 Meltdown 和 Spectre)。
完全保護金鑰的最好方式就是,將它移到一個專門的硬體裝置中,這種硬體裝置是一個可操作的智慧卡。
智慧卡的好處
一個智慧卡包含一個加密晶片,它能夠儲存私鑰,並且直接在智慧卡內部執行秘密操作。因為金鑰內容從來沒有離開過智慧卡,計算機作業系統並不能檢索你插入的智慧卡上的私鑰。這與前面用於備份目的的加密 USB 儲存是不同的 —— 雖然 USB 裝置也是插入並解密的,但作業系統是能夠去訪問私鑰內容的。使用外接的加密 USB 介質並不能代替智慧卡裝置的功能。
智慧卡的一些其它好處:
- 它們很便宜且易於獲得
- 它們小巧且易於攜帶
- 它們可以用於多種裝置上
- 它們中的很多都具有防篡改功能(取決於製造商)
可用的智慧卡裝置
智慧卡最初是嵌入到真實錢包大小的卡中,故而得名智慧卡。你肯定可以買到並使用 GnuPG 功能的智慧卡,並且它們是你能得到的最便宜的可用裝置之一。但是,事實上智慧卡有一個很重要的缺點:它們需要一個智慧卡讀卡器,只有極小數的膝上型電腦上有這種讀卡器。
由於這個原因,製造商開始推出小型 USB 裝置,它的大小和 U 盤類似,內建有微型智慧卡,並且在晶片上簡單地實現了智慧卡協議特性。下面推薦幾個這樣的裝置:
- Nitrokey Start:開源硬體和自由軟體,可用於 GnuPG 的最便宜的選擇之一,但是額外的安全特性很少。
- Nitrokey Pro:類似於 Nitrokey Start,它提供防篡改及更多的安全特性(但沒有 U2F,具體檢視指南的 U2F 節)。
- Yubikey 4:專利硬體和軟體,但比 Nitrokey Pro 便宜,並且可以用在最新的膝上型電腦上的 USB-C 介面;也提供像 U2F 這樣的額外的安全特性。
我們推薦選一個同時具備智慧卡功能和 U2F 的裝置,在寫這篇文章時,只能選擇 Yubikey 4。
配置智慧卡裝置
你的智慧卡裝置插入任何一臺現代的 Linux 或 Mac 工作站上都應該能正常工作。你可以透過執行如下的命令去驗證它:
$ gpg --card-status
如果你沒有收到錯誤,有一個完整的卡列表,就表示一切正常。不幸的是,排除為什麼裝置不能正常工作的所有可能原因,已經超出了本指南的範圍。如果你的智慧卡使用 GnuPG 時有問題,請透過你的作業系統的常見支援通道尋求支援。
PIN 不一定是數字
注意,儘管名為 “PIN”(暗示你它必須是一個“數字”),不論是使用者 PIN 還是管理員 PIN 都不必非要是數字。
當你收到一個新裝置時,它可能設定有一個預設的使用者和管理員 PIN,對於 Yubikey,它分別是 123456
和 12345678
。如果它們的 PIN 不是預設的,請檢視裝置附帶的說明書。
快速設定
為配置你的智慧卡,你需要使用 GnuPG 選單系統,因此這裡並沒有更方便的命令列開關:
$ gpg --card-edit
[...omitted...]
gpg/card> admin
Admin commands are allowed
gpg/card> passwd
你應該去設定使用者 PIN (1)、管理員 PIN (3)、和重置碼 (4)。請確保把它們記錄並儲存到一個安全的地方 —— 尤其是管理員 PIN 和重置碼(它允許你去擦除整個智慧卡內容)。你很少使用到管理員 PIN,因此如果你不記錄下來,很可能會忘掉它。
返回到智慧卡主選單,你也可以設定其它值(比如名字、性別、登入日期、等等),但是這些都不是必需的,一旦你的智慧卡丟失了,將導致額外的資訊洩露。
將子金鑰移到你的智慧卡中
退出卡選單(使用 q
命令)儲存所有更改。接下來,我們將你的子金鑰移到智慧卡中。將需要用到你的 PGP 金鑰的密碼,在大多數的智慧卡操作中都將用到管理員 PIN。記住,那個 [fpr]
表示你的金鑰的完整的 40 個字元的指紋。
$ gpg --edit-key [fpr]
Secret subkeys are available.
pub rsa4096/AAAABBBBCCCCDDDD
created: 2017-12-07 expires: 2019-12-07 usage: C
trust: ultimate validity: ultimate
ssb rsa2048/1111222233334444
created: 2017-12-07 expires: never usage: E
ssb rsa2048/5555666677778888
created: 2017-12-07 expires: never usage: S
[ultimate] (1). Alice Engineer <alice@example.org>
[ultimate] (2) Alice Engineer <allie@example.net>
gpg>
使用 --edit-key
再次進入到選單模式,你將注意到那個金鑰清單有一點小差別。從現在開始,所有的命令都是在這個選單模式下執行,它用 gpg>
提示符來表示。
首先,我們來選擇移到智慧卡中的金鑰 —— 你可以透過鍵入 key 1
(它表示選擇清單中的第一個金鑰)來實現:
gpg> key 1
這個輸出會有一點細微的差別:
pub rsa4096/AAAABBBBCCCCDDDD
created: 2017-12-07 expires: 2019-12-07 usage: C
trust: ultimate validity: ultimate
ssb* rsa2048/1111222233334444
created: 2017-12-07 expires: never usage: E
ssb rsa2048/5555666677778888
created: 2017-12-07 expires: never usage: S
[ultimate] (1). Alice Engineer <alice@example.org>
[ultimate] (2) Alice Engineer <allie@example.net>
注意與金鑰對應的 ssb
行旁邊的 *
—— 它表示這是當前選定的金鑰。它是可切換的,意味著如果你再次輸入 key 1
,這個 *
將消失,這個金鑰將不再被選中。
現在,我們來將金鑰移到智慧卡中:
gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2
由於它是我們的 [E] 金鑰,把它移到加密區中是有很有意義的。當你提交了你的選擇之後,將會被提示輸入你的 PGP 金鑰的保護密碼,接下來輸入智慧卡的管理員 PIN。如果命令沒有返回錯誤,表示你的金鑰已經被移到智慧卡中了。
重要: 現在再次輸入 key 1
去取消選中第一個金鑰,並輸入 key 2
去選擇 [S] 金鑰:
gpg> key 1
gpg> key 2
gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1
你可以使用 [S] 金鑰同時做簽名和驗證,但是我們希望確保它在簽名區,因此,我們選擇 (1
)。完成後,如果你的命令沒有返回錯誤,表示操作已成功。
最後,如果你建立了一個 A 金鑰,你也可以將它移到智慧卡中,但是你需要先取消選中 key 2
。完成後,選擇 q
:
gpg> q
Save changes? (y/N) y
儲存變更將把你的子金鑰移到智慧卡後,把你的家目錄中的相應子金鑰刪除(沒有關係,因為我們的備份中還有,如果更換了智慧卡,你需要再做一遍)。
驗證移動後的金鑰
現在,如果你執行一個--list-secret-keys
操作,你將看到一個稍有不同的輸出:
$ gpg --list-secret-keys
sec# rsa4096 2017-12-06 [C] [expires: 2019-12-06]
111122223333444455556666AAAABBBBCCCCDDDD
uid [ultimate] Alice Engineer <alice@example.org>
uid [ultimate] Alice Engineer <allie@example.net>
ssb> rsa2048 2017-12-06 [E]
ssb> rsa2048 2017-12-06 [S]
在 ssb>
的輸出中的 >
表示子金鑰僅在智慧卡上有效。如果你進入到你的金鑰目錄中,檢視目錄的內容,你將會看到那個 .key
檔案已經被存根替換:
$ cd ~/.gnupg/private-keys-v1.d
$ strings *.key
這個輸出將包含一個影子私鑰,它表示那個檔案僅是個存根,真正的內容在智慧卡中。
驗證智慧卡的功能
驗證智慧卡能否如期正常執行,你可以透過建立一個簽名來驗證:
$ echo "Hello world" | gpg --clearsign > /tmp/test.asc
$ gpg --verify /tmp/test.asc
首次執行這個命令時將詢問你智慧卡的 PIN,在你執行 gpg —verify
之後,它將顯示 “Good signature”。
祝賀你,你已經成功將竊取你的開發者數字身份變得更加困難了!
其它常見 GnuPG 操作
下面是使用你的 PGP 金鑰需要做的一些常見操作的快速指南。
在下面的所有命令中,[fpr]
表示你的金鑰指紋。
掛載主金鑰離線儲存
下面的一些操作將需要你的主金鑰,因此首先需要去掛載你的主金鑰離線儲存,並告訴 GnuPG 去使用它。首先,找出介質掛載路徑,可以透過檢視 mount
命令的輸出找到它。接著,設定你的 GnuPG 目錄為你的介質上備份的目錄,並告訴 GnuPG 將那個目錄做為它的家目錄:
$ export GNUPGHOME=/media/disk/name/gnupg-backup
$ gpg --list-secret-keys
確保你在輸出中看到的是 sec
而不是 sec#
(這個 #
表示金鑰不可用,仍然使用的是慣常的那個 Home 目錄)。
更新你慣常使用的那個 GnuPG 工作目錄
在你的離線儲存上做了任何更改之後,你應該將這些更改同步應用到你慣常使用的工作目錄中:
$ gpg --export | gpg --homedir ~/.gnupg --import
$ unset GNUPGHOME
延長金鑰過期日期
我們建立的主金鑰的預設過期日期是自建立之日起兩年後。這樣做都是為安全考慮,這樣將使淘汰金鑰最終從金鑰伺服器上消失。
延長你的金鑰過期日期,從當前日期延長一年,只需要執行如下命令:
$ gpg --quick-set-expire [fpr] 1y
如果為了好記住,你也可以使用一個特定日期(比如,你的生日、1 月 1 日、或加拿大國慶日):
$ gpg --quick-set-expire [fpr] 2020-07-01
記得將更新後的金鑰傳送到金鑰伺服器:
$ gpg --send-key [fpr]
吊銷身份
如果你需要吊銷一個身份(比如,你換了僱主並且舊的郵件地址不再有效了),你可以使用一行命令搞定:
$ gpg --quick-revoke-uid [fpr] 'Alice Engineer <aengineer@example.net>'
你也可以透過使用 gpg --edit-key [fpr]
在選單模式下完成同樣的事情。
完成後,記得將更新後的金鑰傳送到金鑰伺服器上:
$ gpg --send-key [fpr]
下一篇文章中,我們將談談 Git 如何支援 PGP 的多級別整合。
透過來自 Linux 基金會和 edX 的免費課程 “Linux 入門”學習更多 Linux 知識。
作者:KONSTANTIN RYABITSEV 譯者:qhwdw 校對:wxy
相關文章
- 使用 PGP 保護程式碼完整性(三):生成 PGP 子金鑰
- 用 PGP 保護程式碼完整性(六):在 Git 上使用 PGPGit
- 如何保護物聯網裝置
- 硬體裝置上能執行小程式嗎?
- Intel 提出 CPU 漏洞硬體保護方案:有望一勞永逸Intel
- 保護郵件加密兩把鎖:PGP和S/MIME(轉)加密
- 保護雲資料隱私,要將金鑰放在哪裡?
- HDI硬體裝置介面介紹
- 零程式碼零硬體玩轉華為雲IoT,基於裝置聯動實時監控裝置
- 智慧成人用品軟硬一體化裝置遙控
- 保護企業系統中的程式碼安全
- 在應用程式中將OJB作為一個儲存層使用(五) (轉)
- 5個常用Java程式碼混淆器 助你保護你的程式碼Java
- Android獲取硬體裝置資訊Android
- 如何保護SSL證書私鑰安全
- 可信前端之路-程式碼保護前端
- 怎樣保護java程式碼???Java
- 維護程式碼庫的五個精華實踐
- Easy App Locker for Mac(Mac應用密碼保護軟體)APPMac密碼
- 將EJB 3應用程式遷移到GlassFish
- 超簡單整合華為系統完整性檢測,搞定裝置安全防護
- Zenlayer如何將萬臺裝置監控從Zabbix遷移到Flashcat
- 保護你的 PL/SQL 程式碼!SQL
- 程式碼混淆工具ipaguard:如何使用ipaguard保護和混淆iOS應用程式程式碼iOS
- 打破平臺限制,小程式如何在硬體裝置上執行?
- Ledger 加密貨幣硬體錢包曝嚴重缺陷,多種場景竊取裝置私鑰加密
- 軟體保護
- [譯] 用 Apache Shiro 來保護一個 Spring Boot 應用ApacheSpring Boot
- 將PHP應用無縫轉移到IIS中?PHP
- mysql:使用樂觀鎖保護資料一致性和完整性MySql
- 將應用程式從Sql Server遷移到OracleSQLServerOracle
- oracle將控制檔案從裸裝置遷移到檔案系統Oracle
- mscorwks.dll在.Net中的地位以及在.Net程式碼保護方面的應用
- 程式碼伺服器安全保護(二)伺服器
- 關於pl/sql的程式碼保護SQL
- 使用Wrap加密,保護Oracle程式原始碼加密Oracle原始碼
- Verilog程式碼和FPGA硬體的對映關係(五)FPGA
- Win10系統驅動裝不上顯示Wnidows無法啟動這個硬體裝置程式碼19如何解決Win10