隐私问题一直闹得沸沸扬扬,今天刚好在Github提交的时候想起来GPG公钥这个东西,所以就搞了半个小时,做了自己的首个GPG Key然后做了一些绑定。

你可以在左边那一栏看到我的keybase.io,如果只是想体验体验的话,在这里可以找到我的公钥,然后使用我的公钥加密你的信息,然后在下面留言给我:smile:

0x00. GPG与用途

img

要了解什么是GPG,就要先了解PGP

1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。

GPG有许多用途,本文主要介绍文件加密。至于邮件的加密,不同的邮件客户端有不同的设置,请参考Ubuntu网站的介绍

上面这段来自阮一峰的博客

那GPG目前主要用途就是信息加密和签名,加密就是对一段信息使用公钥加密之后再发送给收信人,然后再用私钥解密即可;签名是对当前文件的信息进行计算得到一个.gpg文件,任何使用这个文件的人可以使用你的公钥来验证这个文件是不是经过你签名的文件,保证真实性(不会是其他人的修改版)。目前主要应用于加密沟通如邮件加密、信息加密和文件签名,如对程序进行签名发布等。

至于原理上的RSA算法,大家可以自行探索。

0x01. 生成一对密钥

注意,以下操作都是Linux下进行,Windows下你可以尝试Bash on Windows。

首先检查你有没有gpg

1
gpg --version

如果没有版本信息就直接安装,所有版本库都会带的。

安装结束之后,开始生成我们的密钥对。

你可以使用:

1
gpg --gen-key

也可以使用:

1
gpg --full-generate-key

上一个默认生成一个2年有效期,使用RSA2048算法加密的密钥,如果你想调整这个(比如创建一个终身使用的)就选择第二个。

创建过程十分简单,输入你的姓名邮箱,给私钥设置一个保护密码就结束了。

如果你使用第二个的话,只需要跟着提示选择加密算法和过期时间即可,十分简单。

目前的生成流程都会生成一个撤销证书,用于公钥服务器来撤销你的公钥使用,如果你不放心可以自己生成一个:

1
gpg --gen-revoke

注意:如果你的私钥遗失了,没有任何办法来恢复你加密过的所有信息!而如果你的私钥泄露了,你所有加密的信息全部泄露!所以请妥善保管你的私钥!

结束以后你需要发布你的公钥来让别人验证时和加密时使用。

你可以选择直接把公钥文件发布出去:

1
2
gpg --list-keys #查看所有密钥,记录下密钥ID
gpg -a -o <target_path> --export <publickey_ID> #target是导出路径,publickey_ID是上一部你记录的公钥ID

这样在发布的时候把这个文件打包发布或者挂在你网站的某些地方即可。

当然,每次都这么搞很麻烦,我们可以把它发布到一个公钥服务器上。世界上有很多这样的服务器,当你上传到一个服务器之后,经过公钥交换机制,所有公钥服务器都会有你的公钥。

1
gpg --keyserver pgp.mit.edu --send-keys <keyID>

等执行结束就可以了~到时候你就可以在发布的时候指定你的密钥ID的后面几位,别人通过这个可以在任意公钥服务器上下载到你的公钥。

当然,由于这些服务器是公开的,任何人都可以以你的名义上传公钥,所以一般公布公钥的ID是最好的(这其实就是你公钥的哈希值)。

0x02. 签名与加密

0. 公钥添加

上文提到了上传你自己的公钥,这里顺带一提下载的问题。

导入公钥文件:

1
gpg --import <publickey>

从服务器下载公钥:

1
gpg --keyserver pgp.mit.edu --recv-keys <keyID>

很简单对吧~

1. 签名

签名的过程很简单,使用

1
gpg --sign <filepath> #filepath是文件名

即可,之后会在相同路径出现一个名为<filepath>.gpg的二进制签名文件。

如果你想要ASCII输出:

1
gpg --cleansign <filepath>

这样会出现一个名为<filepath>.asc的签名文件,可以用cat <filepath>.asc来看看里面有什么。

如果你想要发布一个程序,建议使用分离签名:

1
gpg --detach-sign <filepath>

这样的签名文件是<filepath>.sig。当你要发布这个文件的时候,需要发布源文件和这个独立的分离签名。

2. 验证签名

你可以直接使用:

1
gpg --verify <signature_path>

来验证一个签名。如果是分离签名,则使用如下的方式:

1
gpg --verify <signature_path> <filepath>

来验证,如果提示是损坏的,就千万不要用!

3. 加密发送给别人的信息

首先是找到你要发送的人的公钥ID或者邮箱:

1
gpg --list-keys

记录下来以后,写下信息并使用如下命令加密:

1
gpg -r <keyID_or_email> -o <output_path> -e <filepath>

你可以省略-o选项,这样加密后的信息会直接输出到在你的终端。

4. 解密来自别人的信息

1
gpg <encrypt_file> -o <output_path>

就这么简单,你也可以省略-o选项,如上所说。


那现在开始你的本子重要文件都可以好好保存啦!

顺带一提,我的公钥的指纹是:

1
2792FC149B21DA174CED7A0EC73C1FF650BB7A03

你可以使用:

1
curl https://keybase.io/lxdlam/pgp_keys.asc | gpg --import

把我的公钥导入你的本地环境。这些信息都可以在我的keybase.io查到。

Have a more pravite life!