本文是从我的英文博客上翻译而来,最新修订内容可随时参考:gpg-101
GnuPG 是RFC4880(也称为PGP)定义的OpenPGP标准的完整免费实现。GnuPG允许您对数据和通信进行加密和签名;它具有通用的密钥管理系统,以及用于各种公钥目录的访问模块。GnuPG(也称为GPG)是一个命令行工具,具备与其他应用程序轻松集成的功能。
本文将介绍GPG的基本用法。
提到GPG,首先需要了解PGP。PGP是一种提供加密和数字签名服务的协议(Pretty Good Privacy),而GPG是PGP协议的实现。PGP支持多种加密算法,如AES、RSA、ECC等。
您还可以将GPG添加到Github中,使仓库的每次提交都经过签名验证。
警告:切勿向
公钥服务器
上传任何信息,这并不安全!本文不涉及任何与公钥服务器
相关的操作!公钥服务器是中心化服务,即使您撤销了公钥,其上的信息也不会被删除。
.asc
) .pgp
) 每个密钥或子密钥都有一行由10组4字符组成的指纹,这是密钥整体的SHA-1哈希值(160位,20字节,通常表示为40位十六进制数),可用于唯一标识密钥对。
用户标识符,格式为姓名(注释)<邮箱>
,包含用户名、注释和邮箱:
导入密钥时默认状态为[unknown]
,需通过指纹和所有者声明验证密钥真实性。
信任级别:
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]!
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 # 保存修改
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。