GPG体系介绍


GPG体系

介绍

GnuPG(GNU Privacy Guard) 是对 OpenPGP 标准(RFC 4880/4880bis) 的自由实现,包括了加密解密,非对称加密体系,签名体系等。

能够保障机密性,完整性和不可否认性,分别代表着对数据进行安全加密,保障数据的完整无损和对数据进行不可否认签名。

一个GPG密钥由一个bundle模型组成一个密钥束,包含了一个主密钥和若干个功能密钥。

主密钥类似于根证书,可以签署子密钥,而主密钥一般不经常使用,日常通过子密钥来进行签名加密等。

子密钥的三个常见用途分别是加密(对称加密),签名(对某个实体进行签名操作)以及认证(例如SSH)

安装Gpg4win

Gpg4win是GPG的Windows平台,通常由一个前端加上若干组件组成,Git和cygwin64也会自带GPG组件

https://www.gpg4win.org/ 下载gpg4win

以下均通过gpg4win的前端组件kleopatra进行演示

创建或导入密钥

新建密钥对:

在文件->新建OpenPGP密钥对中输入信息

image-20260206160747012

一般需要一个唯一的邮件,建议使用个人常用或公司约定的邮件,例如提交代码的邮件

image-20260206160835878

其他配置保持默认即可,通常会以最佳安全实践方式配置其他安全参数

image-20260206160903625

随后得到指纹,新建的密钥对会自动生成两个子密钥

image-20260206160939395

两个子密钥分别用于加密以及认证签名。

导入密钥直接选择asc文件即可,通常导入的密钥需要私钥

导出公钥

image-20260206161102625

通常导出公钥是可公开的,放置在验证平台或代码托管平台

而备份私钥是不能公开的,可以保存在安全介质或离线环境中。

加密操作

利用OpenPGP的私钥对内容进行加密,安装gpg4win后通常会在Windows的右键中注册一个加密选项,例如

image-20260206161357212

但需要在安装时选中GPGEX拓展组件

点击加密后

image-20260206161445524

注意到这里的指纹和自己的密钥对指纹是一致的

image-20260206161632491

加密完成通常会生成一个gpg文件

当再次打开时,如果没有正确的密钥,则会提示无法解密

image-20260206161745312

此时需要导入正确的密钥才能进行解密

若存在正确密钥,则可以正确解密

image-20260206161849537

签名操作

image-20260206161941535

在选择需要签名的账户后,会生成一个sig文件,用于签名

在双击sig文件后,程序会自动进行签名验证

image-20260206162027423

注意签名和加密是可以同时进行的

image-20260206162129113

此时只会生成一个gpg文件,而gpg文件里面包含了签名信息,则sig文件会自动集成在gpg文件中。

额外注意

若一个文件被同时加密和签名,那么只有同时拥有加密密钥和证书的情况下才能进行加密并验签,无法通过加密的gpg文件直接进行验签,除非sig文件被单独提供。

即gpg文件会先进行解密,然后才能看到是否存在签名信息。

如果一个文件进行了签名提供了sig文件,那么在对方只导入公钥的情况下即可进行验证签名

其他场景

对代码签名

在仓库中需要保障签名邮箱和指纹ID一致

image-20260206163744183

但需要注意需要使用自己下载的GPG程序(gpg4win)而不是git自带的GPG程序,

image-20260206163939426

通常默认提交命令不带有签名(如果不显式指定)

可以通过显式配置指定签名的行为

git config --local commit.gpgsign true
× Preview