GPG的使用場景簡介


簡介

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 服務器校驗通過,因為公鑰不匹配。
 

加解密

基本流程:
  1. 使用收件用戶的公鑰加密文件
  2. 將加密后的文件發送為收件人
  3. 收件人使用自己的私鑰解密文件
加密:
gpg --recipient [Key ID] --output a.encrypt.txt --encrypt a.txt
解密:
gpg --recipient [Key ID] --output a.decrypt.txt --decrypt a.encrypt.txt
 

簽名

基本流程
  1. 使用自己的私鑰對某個文件進行簽名
  2. 將簽名后的文件發送給收件人
  3. 收件人使用發送者公鑰驗證簽名
簽名:
# 會將文件內容和簽名信息合並然后生成新的 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 上冒充我的身份
 

 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM