1、首先生成一个密钥(可在Linux控制台,Windows下有Cygwin64等)安装好gnupg套件后
$ gpg --gen-key
gpg (GnuPG) 1.4.23; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择?
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)4096
您所要求的密钥尺寸是 4096 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
注意:生成GPG Key时所填写的邮箱地址必须跟注册GitHub账号所使用的邮箱相同
DSA和RSA的区别(密钥加密算法)
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。它既能用于加密,也能用于数字签名。RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,
但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。
公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。
加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。-------------------------------------------------------------------------------------
Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)
DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,
即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多
DSA算法是美国的国家标准数字签名算法,它只能用户数字签名,而不能用户数据加密和密钥交换。
DSA 一般用于数字签名和认证,只用于签名,它比RSA要快很多
2、查看生成的密钥ID,这里的KeyID为886C8FB9
$ gpg -k
/home/kend/.gnupg/pubring.gpg
-----------------------------
pub 3072D/886C8FB9 2019-01-15 # 3072D为密钥长度和加密类型,886C8FB9才是KeyID
uid kend56 (Git签名) <kend56@qq.com>
3、导出公钥
$ gpg -a -o key.txt --export 886C8FB9 # 导出公钥,公钥可以随便公开,千万别公开私钥
4、用文本编辑器打开导出的key.txt文件,并将里边的内容放GitHub的Settings --- > SSH and GPG keys
5、设置 Git 全局要签名的Key
# 设置 Git 全局要签名的Key
git config --global user.signingkey 886C8FB9 # 886C8FB9为生成的GPG KeyID
# 如果要让当前git项目启用签名验证,使用下面的命令:
git config commit.gpgsign true # 设置:false 为关闭
# 如果要让所有项目都启用签名验证:
git config --global commit.gpgsign true # 设置 Git 全局提交都要签名
# 如果没有设置局部仓库或全局仓库默认开启 commits GPG 验证,提交时可以添加 -S 参数,要求进行 GPG 验证
# Git里填写的提交者信息,必须跟注册的GitHub帐号相同的邮箱,否则会显示 "Unverified"标志
git config --global user.email "kend56@qq.com"
6、commit 带签名提交
$ git commit -am "add" # 提交
[master(根提交) 72064f0] add
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 t.txt
# 未设置git config --global commit.gpgsign true
# 可手动选择带签名提交:git commit -S -am "add"
$ git log --show-signature # 查看带签名的提交
commit 72064f01e84f10497664f4a205832abff72b4cc2 (HEAD -> master)
gpg: 签名建立于 2019年01月15日,周二 20:43:55 CST
gpg: 使用 DSA 密钥 2CAF2804886C8FB9
gpg: 完好的签名,来自于“kend56 (Git签名) <kend56@qq.com>”
Author: kend56 <kend56@qq.com>
Date: Tue Jan 15 20:43:54 2019 +0800
add
7、带签名的tag提交
# -u 后面跟着的就是GPG KeyID
$ git tag -u "886C8FB9" -s v0.0.1 -m "说明"
$ git show v0.0.1 # 查看带签名tag信息
tag v0.0.1
Tagger: kend56 <kend56@qq.com>
Date: Tue Jan 15 21:24:50 2019 +0800
说明
-----BEGIN PGP SIGNATURE-----
iF4EABEIAAYFAlw93yMACgkQLK8oBIhsj7kqRQEAldiUJ0m3i3A30WtrXZsp2rws
wrbyIAJd1WXZLxQHp3gA/3FHG7XJ3nFOuvu6lo4K5EVDWyrgNmedffaf9TAay2W0
=c5fI
-----END PGP SIGNATURE-----
commit 72064f01e84f10497664f4a205832abff72b4cc2 (HEAD -> master, tag: v0.0.1)
Author: kend56 <kend56@qq.com>
Date: Tue Jan 15 20:43:54 2019 +0800
add
diff --git a/t.txt b/t.txt
new file mode 100644
index 0000000..e69de29
8、提交后查看,如图(一个使用和注册GitHub相同邮箱,另一个为不同邮箱,所显示的认证标志)
点击认证标志可以看到用户相关内容