OpenPGP 是一种加密标准,而 GnuPG 是这个标准的开源实现,是一套软件,gpg 是这个软件的命令行工具。GnuPG 在 Linux 系统里面有非常广泛的应用,绝大多数的 Linux 发行版有默认安装 GnuPG,并且包管理器使用 GnuPG 验证软件包的完整性。

GnuPG 主要功能

  • 签名 / 验证签名
  • 加密 / 解密数据

密钥分为公钥和私钥,公钥对外发放,私钥自己保留,如果私钥泄露,数据也就不安全。工作流程是使用私钥签名,使用公钥认证;使用公钥加密,使用私钥解密;公钥可以发送到一些公共服务器上保管。签名验证会验证时间还有是否有吊销证书。过期时间和吊销证书只对文件签名有意义,对于数据加密解密,没有任何意义。

创建密钥

最简单的方法是输入下面命令,使用默认参数生成密钥,生成的密钥关联两个公共信息,分别为用户名和邮箱,并且私钥能加密:

gpg --gen-key

列出所有 key

所有密钥

gpg --list-keys

所有私钥(用来查看自己的)

gpg --list-secret-keys

所有公钥(查看别人的)

gpg --list-public-keys

加密解密

加密数据:

gpg -e -r [uid] [filename]

解密数据:

gpg -d [filename]

gpg永远使用公钥加密数据,并且使用私钥解密数据,所以加密的时候需要指定使用哪一个公钥进行加密,可以使用指纹或是用户名作为标识。加密和签名后的数据会附带密钥指纹信息,所以解密和验证过程能自动查询本地对应的密钥。

密钥管理

密钥分为公钥和私钥,公钥顾名思义就是公开的,私钥需要妥善管理,不能泄露。一般来说为了保证安全,可以在一台完全离线的计算机上,生成密钥对,然后通过存储介质拷贝公钥出来,而需要用的私钥的地方,则在完全离线的环境下进行。这种操作在区块链钱包上也是很常见。

导出公钥,通过添加-a参数表示输出 ascii 编码,而不是输出二进制文件,这样就可以打印在纸上保存。

gpg -a --output public-file.key --export keyId

导出私钥

gpg -a --output public-file.key --export-secret-keys keyId

导入公钥/私钥

gpg --import [filename]

信任密钥

导入或是创建的密钥 uid 一栏会出现 unknown,这是由于导入的密钥没有出现在本地的密钥环里面。需要先修改信任程度:

gpg --edit-key keyId
gpg> trust
gpg> save

信任程度为:

  1. I don't know or won't say,选择这个会切换到unknown状态
  2. I do NOT trust
  3. I trust marginally
  4. I trust fully
  5. I trust ultimately

有别于X.509证书中心化的CA,GnuPG 的信任模式是一种熟人信任模型,根据公钥的信任等级决定详细熟人或是相信熟人相信的人或是不信任。

私钥密码修改

创建私钥的时候会提醒输入私钥保护密码,这个密码在需要用到私钥的地方都需要先解锁。输入下面进入交互模式来修改私钥保护密钥:

gpg --edit-key keyId

之后输入下面命令完成操作,如果想要移除密码,在输入新的密码的时候保持空白就能移除私钥密码。

gpg> passwd
gpg> save

在导出私钥的时候,导出的也是加密后的私钥,并不是明文的私钥。 因此在备份可以选择不用二次加密。