从 GPG 密钥中引申出的思考和学习

个人学习时的思考

GPG 密钥组成和理念

GPG密钥由以下部分组成:

  1. Key ID:该 GPG Key 的唯一标识,作为主密钥的 fingerprint
  2. UID:可以有一个或多个,由 name、email、comment 组成,email 和 comment 可为空
  3. Expire:过期时间,指定该密钥的时效性
  4. 多个用途不一样的非对称密钥对(子密钥对),每个密钥对可以有不一样的 Expire

GPG使用主密钥对来管理多个子密钥对,通过这种方式管理的密钥对使得整个密钥的安全性得到提高,想要对公钥进行篡改就需要获取主密钥相关的信息,而子密钥对的多用途、时效和注销密钥对等操作也大大的提高了整个GPG密钥的可靠性。

加密和签名

在加密和签名中,公钥和私钥的作用分别有区别:

  • 加密:加密是用过密钥来对原数据进行篡改的过程,此时为保证安全,以及密钥不被泄漏,使用公钥对数据进行加密,使用私钥进行解密。
  • 签名:签名是通过原数据生成散列值,再通过对散列值加密生成的。此时的作用是为了保证数据未曾被篡改,故需要一个公开且有信用的凭证,这里由公钥来充当这个角色,因为私钥并未公开,故使用私钥来对数据进行加密,而其它人只能用公钥来对数据解密来验证数据的真实性。

其中,加密和签名的过程有先后顺序的要求,通常是签名在前,加密在后。因为如果签名在外,攻击者有可能会篡改签名来阻碍正常的密钥验证。

对 GPG Pubkey 安全性的一些思考

我听到有些说法:gpg 公钥被导出的时候,主密钥会对它进行签字。但是经过了解和仔细思考,我觉得这种做法并不完全可靠。

设想场景中,导出一份pubkey,并使用secret key对其签名。我们确实可以使用pubkey对这个签名进行严重以保证一个pubkey和签名是吻合的,但是这没办法证明我们的密钥是我们的,攻击者完全可以对这份 pubkey 进行篡改来妨碍正常的行为,由此这没法完全做到验证密钥可靠性的,想要防范这种行为,至少还需要信任网络的配合。
关于信用网络的形成可以参考下面:

根据六度分隔理论(Six Degrees of Separation),世界上任何互不相识的两人,平均通过六个人就可以产生联系。 那么可以不可以这么思考, 假设我和小A见过面并检查过他的公钥,因而知道小A的公钥的的确确属于他本人,我选择信任小A。而小A同样验证了小B的证书并为小B的证书签名背书——小A的证书的持有人在此证明该证书是真实属于小B。那么我无须见亲见小B本人,也可以通过小A的背书而接受小B的证书。

如此循环下去,就形成了一张网, 这就是信任网络。

所以如果需要使用私钥来对pubkey进行签名的话,肯定不只使用自己的私钥,还需要有可信任的第三者的私钥来进行签名。

如今身份认证机构——证书签发机构的原理,也是要有权威的第三者来为公钥生成证书(数字签名)来让人确认证书的可用性。

安全的使用GPG

就我目前了解到的知识而言,最安全的用法还是平常在多机器环境时使用子私钥,发布 gpg pubkey,但是主公钥除非发生变更否则处于 offline 的状态来保存和隔离,具体配置可以参考 debian wiki 的 subkeys 条目的指示来操作,我个人现在也是遵循这个来操作。
大致流程如下:

  1. 生成主密钥对
  2. 根据需求生成子密钥对
  3. 转移主私钥到安全的地方
  4. 导出公钥并发布
  5. (option) 如果存在多设备的话,其它设备需要导入子私钥

SSL和GPG的信任模型

又看到一篇文章,里面很好的对 SSL 和 GPG 的信任模型进行了总结和归纳,这里简单引用并自己稍微总结下:

这两个背后对应的是两种不同的信任机制模型,一句话来说GPG的背后PGP模型是"信任你信任的人所信任的人",而HTTPS背后的PKI模型则是"信任权威机构信任的人"。

两种方式都可以简单可靠的建立直接信任,所谓直接信任是指使用者因为知道一把密钥从哪里来而信任它是有效的。简单的例子比如你和我当面交换公钥,然后之后我们在网络上使用自己私钥对内容进行签名,那么我们互相都可以证明对方收到的信息真的是由自己发出的并且没有被篡改。再比如软件仓库的维护者将公钥发布在使用了HTTPS的网站上,当我们下载了软件后就可以通过验证签名确认软件没有被篡改。

原文中也罗列了两个模型可能会遇到的问题,PGP模型的问题在于信任网络的建立成本,PKI模型的问题在于对于权威的强依赖导致的维护成本和推广,后者最后是在Let's Encrypt的免费证书机构的出现下才逐渐普及。

方才提到的,都是开销上的问题,这不过前者是关于信用价值本身的建立所需要的付出,后者是使用者对与信用价值所要付出的成本。在资本市场的普及下,后者的普及难度显著低于前者,前者更多的是对人性本身的信任,在这一点上前者更具有极客精神,也是我个人所期望的,不过直觉上,我还是对后者更有安全感,但到现在,我也能意识到这也绝非可靠。

参考资料

debian wiki: subkeys
理解和使用GPG
PGP工作原理简述
2021年,用更现代的方法使用PGP(下)
浅谈SSL和GPG

LICENSED UNDER CC BY-NC-SA 4.0
Comment