使用gpg保护私密数据

鉴于前段时间csdn、天涯等等一群的爆库事件,虽然据说起源在于抗议实名制,但也暴露了国内网站的安全措施实在堪忧。而且现在云服务盛行,但是又有谁能打保票,保存在云端的数据就是安全的呢?所以个人数据的安全性只能依靠自己了。

gpgPGP的GNU开源实现,非常可靠,至少Linux的密钥管理都是用的它。我们拿来可以有俩用途:

  • 加密解密

    需要保存到云端的文件,使用公钥加密,只有自己的私钥+密码才能解密。

  • 做数字签名

    用私钥给自己生产的文件做签名,别人可以用公钥进行验证这份文件的可靠性。

下边列举一些常用场景,更详细的使用方法可以查manual。

生成密钥

第一步你需要生成自己的密钥才能使用:

gpg --gen-key

按照如下步骤:

  1. 密钥种类可以选择 DSA and Elgamal
  2. 按照提示输入Name、Email和备注信息,最终要求输入一个密码,用来保护私钥。其中,Name就是日后会用到的uid,建议不要设置得太长太复杂,这里假定Name设置为 foo
  3. 运行之后你的密钥就算生成了,生成的key会保存在 ~/.gnupg/ 目录下,其中公钥文件为 pubring.gpg, 私钥文件为 secring.gpg

管理密钥

  • 根据公钥列出当前机器上的密钥。如果想列出私钥,使用参数 -K

      gpg -k
    
  • 导出 foo 的公钥到 foo.key

      gpg -ao foo.key --export foo
    
  • 导出 foo 的私钥到 foo-secret.key (如果要备份,一定要保存在最安全的地方):

      gpg -ao foo-secret.key --export-secret-keys foo
    
  • 导入一个密钥,可以是公钥或私钥:

      gpg --import some.key
    
  • 进入管理密钥的菜单,比如你可以输入 passwd 更改私钥密码:

      gpg --edit-keys foo
    
  • 从公钥钥匙环里删除名为 foo 的公钥:

      gpg --delete-keys foo
    
  • 从私钥钥匙环里删除名为 foo 的私钥:

      gpg --delete-secret-keys foo
    

加解密文件

  • 使用 foo 的私钥加密 sample.txt,你会得到一个加密后的文件 sample.txt.asc

    gpg -ae -r foo sample.txt
    

    其中,-a 表示ASCII 输出,-r 指定密钥。

  • 解密 sample.txt.asc 文件并输出到 new.txt 文件:

    gpg -o new.txt -d sample.txt.asc
    

数字签名

  • 生成文件 sample.txt.gpg,其中包含源文件和签名。

    gpg --sign sample.txt
    

    可以使用参数 --default-key 指定使用哪个私钥做签名。

  • 生成文件 sample.txt.asc,其中包含源文件和可读的ASCII签名。建议用于ASCII文件:

    gpg --clearsign sample.txt
    
  • 生成文件 sample.txt.sig,其中仅包含签名。Debian里的软件包应该都是这种签名方式:

    gpg --detach-sign sample.txt
    
  • 验证该文件的签名。如果使用 --detach-sign 方式签名,且源文件名不一致,那么源文件需跟在签名文件(.sig)之后作为另一个参数提供:

    gpg --verify sample.txt.gpg
    

在Emacs里使用gpg

只要安装好了gpg,并且生成了密钥,在Emacs里使用gpg非常简单:

(require 'epa-file)

打开 .gpg 文件自动解密该文件,保存时即自动加密。前面一篇关于gnus的文章里,邮箱账户的信息可以保存到 ~/.authinfo.gpg 就安全多了。