在自问自答之前,先说一下 GPG 的用处。
GPG 密钥,就是用来对数据进行加密,解密的。为了不被中间人获取信息内容而设计的。
在使用 GPG 之前有几个问题要理一下。
需要生成多少对密钥?
通常是一对主密钥,具有认证(Certify)功能。
三对子密钥,分别具有签名(sign)功能,加密(Encrypt)功能,身份验证(Authenticate)功能。
平时使用,就只使用子密钥。主密钥只用来生成和吊销子密钥。子密钥可以放到 Yubikey 中。
如何选择加密算法?
通常使用的加密算法有很多,主要就是 RSA 和 ECC两类。
最为常用的就是 RSA 4096 和 curve 25519,这两个目前我用的 Yubikey 5 NFC 已经支持(从 5.2.3 固件开始就支持ECC算法了)
如果可能的话,就选用 curve25519,更快更安全。目前来看 RSA 4096也已经是很安全了。也有的看法是,RSA 4096更加安全一点。
根据 Sectigostore 的一篇文章,来看,差不多。
各种密钥的功能是什么?
- Certify 认证: 认证其它密钥,给其它证书签名,就类似 SSL/TLS 的根证书。
- Sign 签名:给文件添加数字签名,给邮件签名,给 Git 签名。
- Authenticate 身份验证:比如 SSH 登录。
- Encrypt 加密:加密文件,加密邮件内容等。
带有 Certify 的密钥被称之为主密钥,只有这种密钥才能添加或撤销其它子密钥的 S/A/E 功能,添加或者修改其它子密钥的到期时间。
密钥是怎样的?
密钥,包含了公钥和私钥,这是一对。
公钥是发布出去,分发给公众的,所以称之为公钥。
私钥是拥有者自己使用的,要保证安全,不能泄露给第三方。
OpenPGP的密钥是如何组织的?
一般都是先生成主密钥,具有 Certify ,认证功能。
然后分别生成三个单独的子密钥,包括 Sign,Encrypt,Authenticate,三种。
还有要生成撤销证书。
最后导出下面这些文件。
- 公钥文件,包含了主密钥和三个子密钥的公钥。
- 撤销证书
- 主密钥的私钥文件 (C)只包含主密钥的私钥。
- 加密子密钥的私钥文件(E)不含主密钥的私钥。
- 签名子密钥的私钥文件(S)不含主密钥的私钥。
- 身份认证子密钥的私钥文件(A)不含主密钥的私钥。
- 三个子密钥合在一起的私钥文件,不含主密钥的私钥。
把上面所有的这些文件都离线保存,两份至少。比如 U 盘,或者打印出来,成方便扫描的格式。
然后在个人电脑上只使用公钥,以及各种子密钥的私钥文件。公钥还需发布到网络上。
我有在用 Thunderbird 邮件客户端,里面已经内置了 openGPG 的管理器,也可以生成加密邮件和签名所需的密钥,这里我还是建议自己手工生成密钥为好,然后只需要在 Thunderbird 中导入上面做的三个子密钥合在一起的私钥文件,以及公钥文件就可以了使用了。
注意:如果只导入子密钥的私钥的话,Thunderbird 中的管理器是无法延长密钥过期时间的,即使再导入主私钥也不行,这里似乎有个顺序问题。先导入主私钥,再导入子私钥是可以完整展示所有的私钥,如果反过来就不行。
邮件的加密与签名是怎么回事?
比如我要发邮件给甲,那么我就用甲的加密公钥对邮件内容加密,然后用我自己的签名私钥给邮件签名。
甲收到邮件后,需要用我的签名公钥来验证是否真的是我发出的邮件,还有就是用他自己的加密私钥对邮件内容进行解密。
加密与签名是独立的事件,并无联系。
加密邮件的目的是只有收信人才能看到邮件的内容。
邮件签名的目的是确认发信人是发信人邮箱地址的持有人,而不是其它的冒名者。
GPG可以用来加密邮件,可以为邮件签名,还可以做什么?
- 可以用 PGP 为 Gig commit 签名,很高级的做法。
- 使用 PGP 进行 SSH 验证。
- 用公钥加密文件,然后丢到任何的云盘,不担心会被偷窥,需要使用的时候,再下载回来,用自己的私钥解密就可以了。
- 文档的签名与认证,比如很多大型软件的下载包除了有 MD5摘要验证以外,还会有签名文件。
- 还有很多,我都不会。
怎样使用 GPG?
当然,需要一个 GPG 环境,如果用 Linux,一般已经内置了相关软件,比如我用的 Manjaro, 直接用就是了。
如果是 Windows,我用的是 gitbash 环境,它包含了 GPG 环境。