簡介
GPG 是一個用於加解密的命令行工具,其中包含了對一些常用的加解密場景的支持命令。
GPG 是 GnuPG (GnuPrivacyGuard) 的縮寫。其中的 PG 是指 PGP (Pretty Good Privacy):
https://en.wikipedia.org/wiki/Pretty_Good_Privacy
PGP 是商業用的加密軟件,GPG 是自由軟件基金開發的開源替代版本。
版本發布歷史可參見官網
https://www.gnupg.org/
安裝及入門用法
MAC 環境直接 brew install gnupg
然后使用 gpg --version 確認安裝成功以及查看版本信息
我當前使用版本為:
gpg (GnuPG) 2.3.2 libgcrypt 1.9.4 Copyright (C) 2021 Free Software Foundation, Inc. License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
使用場景
秘鑰管理
密鑰管理大致包括如下幾個方面:
1、密鑰生成、查看、刪除、導入、導出
# 生成秘鑰 gpg --full-generate-key # 查看秘鑰列表 gpg --list-keys --keyid-format long # 刪除秘鑰 gpg --delete-secret-keys [Key ID] gpg --delete-keys [Key ID] # 添加子密鑰 gpg --quick-add-key [Key ID] rsa2048 encr gpg --quick-add-key [Key ID] rsa2048 sign gpg --quick-add-key [Key ID] rsa2048 auth # 導入秘鑰 gpg --import private-key.txt # 導出秘鑰 # 公鑰 gpg --armor --output pub-key.txt --export [Key ID] # 私鑰 gpg --armor --output private-key.txt --export-secret-keys [Key ID]
gpg --armor --output private-sub-key.txt --export-secret-subkey [Key ID]
2、密鑰發布、搜索
密鑰發布是指將自己的公鑰發布到互聯網上,使得別人可以搜索下載到。公鑰服務器有很多,隨便找一個發布就可以。公鑰服務器之間會進行公鑰的互相同步。
搜索時可使用他人的 Key ID(郵箱或者HASH)進行搜索
# 發布公鑰 gpg --keyserver hkps://keys.openpgp.org --send-keys [Key ID] # or gpg --export [Key ID] | curl -T - https://keys.openpgp.org # or # 在 https://keys.openpgp.org/upload 這里上傳公鑰文件 # 獲取他人公鑰 # 搜索 https://keys.openpgp.org/ gpg --sign-key [Key-ID]
3、密鑰注銷
密鑰注銷是指聲明此密鑰不可用,一般可能是由於私鑰泄漏、私鑰密碼遺忘等原因
gpg --gen-revoke --output revoke.asc [Key ID]
資源發布
GPG 經常用於對資源進行簽名,類似於校驗碼。校驗碼常見的有 CRC、MD5 等,通過對資源內容做 HASH 值的計算,
來確認資源內容是否被修改過。但校驗碼只能驗證文件的完整性,是跟文件一一對應的,假如有人將文件內容和校驗碼同時
修改了,僅使用校驗碼的手段是無法發現的。而 GPG 的簽名在校驗時,可以同時確認文件完整性和簽名所屬用戶,不同用
戶對同一文件的簽名結果是不一樣的。
舉個例子:
比如在 Ubuntu 系統中使用 apt 命令安裝軟件,apt 會同時下載軟件包和軟件包的 GPG 簽名,然后對軟件包進行簽名驗
證。驗證時會同時確認軟件包的完整性和簽名用戶身份,只有兩者都是可信的,才會信任此軟件包並進行安裝。
假如有人惡意將服務器上的軟件包內容和簽名都重新打包了,那么簽名對應的用戶信息必然會發生改變,校驗時就能發
現包被修改過。
完整的信任鏈是這樣的:
- 可信用戶 -> 可信簽名 -> 可信軟件
之所以不簡單使用如下的信任鏈:
- 可信簽名 -> 可信軟件
是因為,可信用戶是可以枚舉的,沒有多少個,完全可以將可信官方的用戶ID內置在系統中。
但可信簽名就太多了,每個軟件都不一樣,無法枚舉。
郵件加密
關於為什么要加密郵件,參見此網站:
https://emailselfdefense.fsf.org/en/。不過目前國內可能沒有這個意識或者由於其他
原因並不普及。
郵件加密的方式有兩種:
1、有些郵件客戶端支持GPG插件,可以自動對郵件內容進行加解密。
2、對於不支持的郵件客戶端(國內常見的都不支持),可采用手工加密,然后將加密后的數據寫進郵件發送的方式。
在 Git 中使用 GPG
Git默認使用郵件地址來確認提交者身份,但郵件地址是可以隨便修改的,假如別人使用你的郵件地址做了一個提交,那么
Git是無法識別提交真正的用戶的。
參考
https://zhuanlan.zhihu.com/p/76861431,為了防止提交被假冒,Git 引入了 GPG 簽名機制。
基本原理如下:
1、用戶將自己的 GPG 公鑰上傳到 Git 服務器
2、用戶在 Commit 時使用私鑰對 Commit 進行簽名
3、Git 服務器接收到 Commit 信息后,使用用戶的公鑰對簽名進行校驗,校驗通過則標識為有效 Commit
郵件地址可以被偽造,但簽名無法被偽造,偽造者使用偽造者的私鑰進行的簽名不會被 Git 服務器校驗通過,因為公鑰不匹配。
加解密
基本流程:
- 使用收件用戶的公鑰加密文件
- 將加密后的文件發送為收件人
- 收件人使用自己的私鑰解密文件
加密:
gpg --recipient [Key ID] --output a.encrypt.txt --encrypt a.txt
解密:
gpg --recipient [Key ID] --output a.decrypt.txt --decrypt a.encrypt.txt
簽名
基本流程
- 使用自己的私鑰對某個文件進行簽名
- 將簽名后的文件發送給收件人
- 收件人使用發送者公鑰驗證簽名
簽名:
# 會將文件內容和簽名信息合並然后生成新的 ascii 文件 gpg --clearsign a.txt # 同上 但生成的是二進制文件 gpg --sign a.txt # 生成獨立的簽名文件 gpg --detach-sign --armor a.txt
驗證簽名:
gpg --verify a.txt.asc
總結一下
GPG 最重要的作用就是在加密的同時添加了加密人的信息,使得信任機制變得更有效。
參考文檔:
GPG入門教程
簡明GPG概念
在 Github 上使用 GPG 的全過程
震驚!竟然有人在 GitHub 上冒充我的身份