GPG 101

简介: 本文介绍了GPG(GnuPG)的基本使用方法,GPG是OpenPGP标准的完整免费实现,支持数据加密和签名。文章涵盖GPG的基础概念、安装、密钥生成与管理、导出与导入、签名与验证、加密与解密以及Git配置等内容。特别提醒不要上传任何信息到公共密钥服务器,以免造成安全隐患。更多详细内容请参考我的博客:[gpg-101](https://blog.timerring.com/posts/gpg-101)。

本文是从我的英文博客上翻译而来,最新修订内容可随时参考: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?

安装

brew install gpg

生成主密钥

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

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

生成子密钥

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

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

生成撤销证书

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

gpg --gen-revoke -ao revoke.pgp [UID或KeyID]  
# 按提示选择撤销范围

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

密钥列表管理

gpg --list-keys         # 列出公钥(简写`gpg -k`)  
gpg --list-secret-keys  # 列出私钥(简写`gpg -K`)

常用查询参数

gpg -K --with-fingerprint --with-subkey-fingerprint --keyid-format long  
# --with-fingerprint        显示密钥指纹  
# --with-subkey-fingerprint 显示子密钥指纹  
# --with-sig-list           显示密钥签名列表

密钥导出

# 导出公钥  
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装甲格式导出(常用)

gpg --export-secret-key --armor [KeyID] > secret-key.asc

密钥删除

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

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] # 子密钥已导入

签名与验证

# 签名  
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

加密与解密

# 加密(需提前导入接收者公钥)  
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

密钥撤销

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

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

# 撤销主密钥  
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

参考资料

目录
相关文章
|
关系型数据库 MySQL PHP
PHP服务环境配置之 WampServer的安装与环境配置
PHP服务环境配置之 WampServer的安装与环境配置
1326 0
|
并行计算 PyTorch 测试技术
MMDetection系列 | 1. MMDetection安装流程与测试
MMDetection系列 | 1. MMDetection安装流程与测试
1379 0
|
机器学习/深度学习 传感器 人工智能
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在人工智能和计算机视觉的快速发展中,火灾检测与火焰识别逐渐成为智慧城市、公共安全和智能监控的重要研究方向。一个高质量的数据集往往是推动相关研究的核心基础。本文将详细介绍一个火灾火焰识别数据集,该数据集共包含 2200 张图片,并已按照 训练集(train)、验证集(val)、测试集(test) 划分,同时配有对应的标注文件,方便研究者快速上手模型训练与评估。
5158 10
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在Linux中,列出几种常见打包工具并写相应解压缩参数。
在Linux中,列出几种常见打包工具并写相应解压缩参数。
|
Shell
adb: error: cannot create file/directory ‘d:/1.png‘: No such file or directory
adb: error: cannot create file/directory ‘d:/1.png‘: No such file or directory
899 0
|
Rust 搜索推荐 算法
【密码学】一文读懂GCM(Golais计数器模式)
GCM(Galois计数器模式)同样的也是NIST提出来的,这个模式基于并行化设计,下面来一起看一下这个模式具体是如何工作的吧。
4327 0
【密码学】一文读懂GCM(Golais计数器模式)
|
弹性计算
阿里云服务器99元和199元提示“不符合活动条件”或显示价格为原价的解决方案
2024年阿里云推出了两款长效特惠云服务器,经济型e实例2核2G配置3M固定带宽40G ESSD Entry云盘,价格只要99元1年,通用算力型u1实例2核4G配置5M固定带宽80G ESSD Entry云盘,价格只要199元1年,而且购买之后还能享受续费同价的政策,这两款云服务器的购买资格为新老用户同享,但是还是有部分用户在购买时会提示“不符合活动条件”或者显示的价格是原价,本文为大家解析出现这一情况的原因是什么呢,以及我们应该如何解决。
阿里云服务器99元和199元提示“不符合活动条件”或显示价格为原价的解决方案
|
JSON 前端开发 Java
获取HTTP请求参数的方法
获取HTTP请求参数的方法
|
Ubuntu Unix Linux
Linux 用户使用sudo时 显示xxx is not in the sudoers file.This incident will be reported.的解决方法
Linux 用户使用sudo时 显示xxx is not in the sudoers file.This incident will be reported.的解决方法
5832 1