首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

GPG 101

原创
作者头像
timerring
修改2025-06-05 20:25:43
修改2025-06-05 20:25:43
2410
举报
文章被收录于专栏:TechBlogTechBlog

本文是从我的英文博客上翻译而来,最新修订内容可随时参考:gpg-101

GnuPG 是RFC4880(也称为PGP)定义的OpenPGP标准的完整免费实现。GnuPG允许您对数据和通信进行加密和签名;它具有通用的密钥管理系统,以及用于各种公钥目录的访问模块。GnuPG(也称为GPG)是一个命令行工具,具备与其他应用程序轻松集成的功能。

本文将介绍GPG的基本用法。

什么是GPG?

提到GPG,首先需要了解PGP。PGP是一种提供加密和数字签名服务的协议(Pretty Good Privacy),而GPG是PGP协议的实现。PGP支持多种加密算法,如AES、RSA、ECC等。

您还可以将GPG添加到Github中,使仓库的每次提交都经过签名验证。

警告:切勿向公钥服务器上传任何信息,这并不安全!本文不涉及任何与公钥服务器相关的操作!公钥服务器是中心化服务,即使您撤销了公钥,其上的信息也不会被删除。

常见缩写说明

功能标识
  • A:认证(如SSH)
  • C:认证(仅主密钥具备此能力)
  • E:加密
  • S:签名(如提交签名)
  • ?:未知功能
密钥类型
  • sec:主私钥
  • ssb:子私钥
  • pub:主公钥
  • sub:子公钥
格式
  • armored:ASCII装甲格式(.asc
  • binary:二进制格式(.pgp
指纹(Fingerprint)

每个密钥或子密钥都有一行由10组4字符组成的指纹,这是密钥整体的SHA-1哈希值(160位,20字节,通常表示为40位十六进制数),可用于唯一标识密钥对。

密钥ID(Key ID)
  • 长格式:指纹的最后16个字符
  • 短格式:指纹的最后8个字符
UID

用户标识符,格式为姓名(注释)<邮箱>,包含用户名、注释和邮箱:

  1. 一个私钥可拥有多个UID
  2. UID适用于整个密钥组,而非单个子密钥
  3. 可轻松添加新UID,但现有UID只能撤销,无法修改
有效性(Validity)

导入密钥时默认状态为[unknown],需通过指纹和所有者声明验证密钥真实性。

信任网络(Trust Network)

信任级别:

  • ultimate:仅应完全信任自己的密钥,作为信任链的根
  • full:完全信任此密钥及其签名的其他密钥
  • marginal:边际信任,需至少三人信任同一密钥才会转为完全信任
  • never:永不信任此密钥及其签名的密钥

如何使用GPG?

安装

代码语言:shell
复制
brew install gpg  

生成主密钥

需快速完成以下步骤,超时需重新操作:

代码语言:bash
复制
gpg --full-generate-key  
# 1. 选择密钥类型(默认即可)  
# 2. 选择过期时间(建议`3y`,便于后续续期并保持密钥控制,过期密钥仅影响新加密/签名,仍可解密/验证现有内容,但会标记为过期)  
# 3. 输入姓名(UID,不建议使用真实姓名,可使用用户名)  
# 4. 输入邮箱(建议使用Github验证过的邮箱,强烈推荐使用Github提供的`no-reply`邮箱避免垃圾邮件)  
# 5. 设置密码短语(用于加密密钥)  
# 6. 完成随机操作后,密钥生成成功  

生成子密钥

建议为密钥生成子密钥,主密钥仅用于签名新子密钥,子密钥按场景拆分:

代码语言:bash
复制
# 进入主密钥交互模式  
gpg --edit-key [主密钥UID或KeyID]  
gpg > addkey  
# 选择密钥类型(如仅用于签名的RSA)  
# 生成前需输入主密钥密码短语  
# 生成后保存密钥  
gpg > save  

生成撤销证书

若忘记密码或密钥失控,可通过撤销证书废止公钥,避免手动通知所有人的麻烦:

代码语言:bash
复制
gpg --gen-revoke -ao revoke.pgp [UID或KeyID]  
# 按提示选择撤销范围  

生成的revoke.pgp文件需妥善保存,用于后续撤销操作。

密钥列表管理

代码语言:bash
复制
gpg --list-keys         # 列出公钥(简写`gpg -k`)  
gpg --list-secret-keys  # 列出私钥(简写`gpg -K`)  

常用查询参数

代码语言:shell
复制
gpg -K --with-fingerprint --with-subkey-fingerprint --keyid-format long  
# --with-fingerprint        显示密钥指纹  
# --with-subkey-fingerprint 显示子密钥指纹  
# --with-sig-list           显示密钥签名列表  

密钥导出

代码语言:bash
复制
# 导出公钥  
gpg -ao public-key.txt --export [UID或KeyID]  
# 导出主私钥(需添加!指定单一密钥,否则导出所有私钥)  
gpg -ao secret-key --export-secret-key [主密钥ID]!  
# 导出签名子私钥(功能标识[S])  
gpg -ao sign-subkey --export-secret-subkeys [子密钥ID]!  
# 导出加密子私钥(功能标识[E])  
gpg -ao encrypt-subkey --export-secret-subkeys [加密子密钥ID]!  

ASCII装甲格式导出(常用)

代码语言:bash
复制
gpg --export-secret-key --armor [KeyID] > secret-key.asc  

密钥删除

导出密钥后可从本地删除(注:密钥以明文存储,需配合wipe等工具彻底清除,或使用Tails系统确保安全):

代码语言:bash
复制
gpg --delete-secret-keys [UID或KeyID]  # 删除私钥  
gpg --delete-keys [UID或KeyID]         # 删除公钥  

密钥导入

强烈反对使用公钥服务器!直接通过可信渠道传输密钥文件: gpg --import [密钥文件(私钥或他人公钥)] # 输出说明: # sec# rsa3072/keyid 2021-01-11 [SC] # `#`表示主密钥未导入(安全) # ssb # rsa3072/keyid 2021-01-11 [E] # 子密钥已导入

签名与验证

代码语言:bash
复制
# 签名  
gpg --sign input.txt          # 生成二进制签名文件(input.txt.sig)  
gpg --clearsign input.txt     # 生成ASCII签名文件(input.txt.asc,包含原文)  
gpg --armor --detach-sign input.txt  # 生成独立签名文件(input.txt.asc)  

# 验证  
gpg --verify input.txt.asc input.txt  

加密与解密

代码语言:bash
复制
# 加密(需提前导入接收者公钥)  
gpg --encrypt --recipient [UID或KeyID] input.txt --output output.txt  
# 简化写法  
gpg -se -o encrypt.txt -r [UID或KeyID] input.txt  

# 解密  
gpg --decrypt encrypt.txt --output decrypt.txt  

密钥撤销

撤销后,仍可能有人使用旧公钥加密消息(黑客也可能获取旧公钥),已加密内容仍可解密,但新操作将被拒绝。撤销证书需由私钥签名,若私钥丢失则无法撤销!

撤销后需将已撤销的公钥重新发布到原渠道,并通知相关人员:

代码语言:bash
复制
# 撤销主密钥  
gpg --import gpg-linus.asc    # 先导入公钥  
gpg --import revoke           # 导入撤销证书,公钥状态变为[revoked: 日期]  

# 撤销子密钥  
gpg --edit-key [UID或KeyID]  
gpg > list         # 查看子密钥索引  
gpg > key 1        # 选择要撤销的子密钥(1为索引)  
gpg > revoke       # 执行撤销  
gpg > save         # 保存修改  

配置Git签名

参考Github文档添加GPG密钥到Github

参考资料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是GPG?
    • 常见缩写说明
      • 功能标识
      • 密钥类型
      • 格式
      • 指纹(Fingerprint)
      • 密钥ID(Key ID)
      • UID
      • 有效性(Validity)
      • 信任网络(Trust Network)
  • 如何使用GPG?
    • 安装
    • 生成主密钥
    • 生成子密钥
    • 生成撤销证书
  • 密钥列表管理
    • 常用查询参数
  • 密钥导出
    • ASCII装甲格式导出(常用)
  • 密钥删除
  • 密钥导入
  • 签名与验证
  • 加密与解密
  • 密钥撤销
  • 配置Git签名
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档