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后,那么根据fingerprint获得的public key也是可信的。
- fingerprint足够短,可以方便的贴在github、twitter、个人网站、PPT上。
- 但又足够长,几乎没有碰撞的可能;
验证签名用的是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重新计算一遍得到fingerprint,和检索用的fingerprint进行比对。
key ID
fingerprint是40个字符,key ID 是fingerprint的后16个字符。
我的fingerprint和key ID分别是:
- E6DDF298F8F06D3B7368A3B38D1BE4E317CEF449
- 8D1BE4E317CEF449
之所以使用key ID,是为了方便展示,但对个人身份的区分度也够了。使用GPG签名过的git commits在github页面展示的就是key ID:
因为比较短,它有可能碰撞,但是概率仍然很低,即使碰撞也没有关系,因为你还可以根据名字、邮箱区分。
$ gpg --recv-keys "8D1BE4E317CEF449"
gpg: key 8D1BE4E317CEF449: public key "周宇盛 <jasonzhouu@163.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
signature
signature是使用private key对文件hash的电子签名,其他人接收文件后可以对电子签名进行验证。
验证电子签名需要3样东西:
- 文件本身
- 文件的signature
- 发布者的public key
$ 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对应的人发出的。










网友评论