GPG根本上用的是非对称加密算法和电子签名算法
public/private key 是密钥对,public key很长,下面这张截图只展示了它的大约1/4。
由于太长,public key一般通过文件的形式传播,比如Electrum把软件发布者的public key下载链接放在官网上,我下载后可以将它用GPG导入。
In order to be able to verify GPG signatures, you need to import the public key of the signer. Electrum binaries are signed with ThomasV's public key. On Linux, you can import that key using the following command:
gpg --import ThomasV.asc
.
https://electrum.org/#download
fingerprint
fingerprint 是public key的 hash,fingerprint的长度大大缩短[1],只需要40个字符。
E6DDF298F8F06D3B7368A3B38D1BE4E317CEF449
fingerprint相比public key更方便传播,可以方便的展示在个人网站上。它和public key一一对应,几乎没有碰撞的可能。我们可以根据他人的 fingerprint 从 key server 获取对应的 public key,gpg的命令行工具支持这项功能。
- fingerprint足够短,可以方便的贴在github、twitter、个人网站、PPT上。
- 但又足够长,几乎没有碰撞的可能;
比如 https://github.com/laanwj 在github主页宣告自己的 gpg fingerprint:
fingerprint 是 public key 的 hash,而验证签名需要 public key。public key 的 hash 是无法验证签名的。我们需要将public key上传到公开的 key server,其他人可以根据 fingerprint 在 key server 检索,下载对应的public key。
$ gpg --recv-keys "ED1A 1280 DEFC A603 14CD 15BF 72B5 BACD FEDF 39D7"
gpg: key 72B5BACDFEDF39D7: public key "T Dev D (Samourai) <dev@samouraiwallet.com>" imported
从 key server 下载的 public key 是真实可信的,因为下载 public key 后我们可以对其进行验证。只需将下载下来的public key 进行 hash 计算得到 fingerprint,将其与检索用的 fingerprint 进行比对。如果相同,则 public key 是真实的。
key ID
fingerprint 包含 40个字符,而 key ID 则是 fingerprint 的其中后16个字符。
我的 fingerprint 和 key ID 分别是:
- E6DDF298F8F06D3B7368A3B38D1BE4E317CEF449
- 8D1BE4E317CEF449
之所以使用key ID,是为了方便展示,16 个字符对个人身份的区分度足够了。使用GPG签名过的git commits在github页面展示的就是key ID:
和 fingerprint 一样,同样可以根据 key ID 获取公钥:
$ gpg --recv-keys "8D1BE4E317CEF449"
gpg: key 8D1BE4E317CEF449: public key "周宇盛 <jasonzhouu@163.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
signature
有时需要证明一个信息是自己发出的,比如发布软件的最新版、发送的邮件。这时先对文件进行 hash 计算,得到 hash;然后用自己的 private key 对 hash 签名,得到 signature。其他人收到信息时,可以用你的 public key 对电子签名进行验证。
验证文件的电子签名需要3样东西:
- 文件本身
- 发布者用 private key 对文件的签名
- 发布者的 public key
验证时,需要提前导入发布者的公钥,然后在命令行中指定第1、2个参数的路径:
$ gpg --verify GPG_Suite-2018.5.dmg.sig GPG_Suite-2018.5.dmg
gpg: Signature made Tue Oct 23 02:20:49 2018 CST
gpg: using RSA key 8C31E5A17DD5D932B448FE1DE8A664480D9E43F5
gpg: Good signature from "GPGTools Team <team@gpgtools.org>" [unknown]
Primary key fingerprint: 85E3 8F69 046B 44C1 EC9F B07B 76D7 8F05 00D0 26C4
Subkey fingerprint: 8C31 E5A1 7DD5 D932 B448 FE1D E8A6 6448 0D9E 43F5
计算机执行验证任务时,进行了以下几个步骤:先计算得到文件的 hash,使用hash、signature、public key验证,如果验证通过,则说明这个文件确实是这个 public key 对应的人发出的。