用emacs和gpg保管你的小秘密

我以前从来都不记工作笔记。涉及到内部工作的信息,用evernote或者其他类似的笔记软件都不够安全。万一哪天evernote被拖库了呢?安全隐患太大,所以为了避免出现安全问题,干脆就不记了。但是确实不方便,脑子里不可能一直记住所有的东西的。除了工作内容之外,每个人都有自己的小秘密。如何把这些小秘密安全的记下来呢?

最近发现用emacs和gpg可以加密笔记,而且使用过程非常流畅,emacs可以直接编辑加密的文件,保存时自动加密。gpg的加密通过密钥实现,只有拿到密钥才可以解密。为了在不同的电脑上记录笔记,可以把密钥导出到自己常用的电脑上。那如果其他人拿到自己电脑,是不是也可以直接打开加密的笔记了呢?并不是,生成密钥的时候gpg会要求你输入一个passphrase,这个就是整个加密的最后一道防线。

这样本地的文件就是安全的了,那怎么解决诸如电脑突然坏了之类的单点故障问题?其实也很简单,github上创建一个私有的仓库,把本地的内容push上去就好了。对于工作的内容,可以push到公司内部的私有git仓库。

如果其他人想要获取到加密的内容,需要突破以下几个防线:

整体来讲已经非常安全了。下面讲讲具体的操作步骤。

生成新的gpg key

gpg加密需要使用密钥,通过如下的命令生成新的密钥。一定要输入passphrase,这是保证安全的最后一道防线了。

$ gpg --full-gen-key

执行命令后会交互式的让你输入加密算法、姓名和邮箱、选择过期时间等信息,按提示操作即可。

导出key

用如下命令导出密钥。比如我在创建密钥使用的姓名是jxq,执行命令后密钥就会保存在jxq.asc这个文件中。

$ gpg --armor --export-secret-keys jxq > jxq.asc

导入key

把key同步到另一个电脑上之后,再执行以下命令导入key,并且信任该key。

$ gpg --import jxq.asc

$ gpg --edit-key jxq
gpg> trust
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

创建文件并加密

在emacs里面创建文件,比如 note.org.gpg ,然后再保存。保存的时候会让你选择用哪一个key加密。为了方便可以在文件里通过 file local variable 指定用哪个key来加密解密。

# -*- epa-file-encrypt-to: ("jxq@jxq.me") -*-

以后再打开文件时,emacs会提示你输入passphrase并自动解密,后面就像编辑正常的文件一样操作了。

让git diff也支持解密

笔记保存在git里,那如何看到每个版本间的diff呢?执行下面的操作即可。

$ git config --global diff.gpg.textconv "gpg --no-tty --decrypt"
$ echo "*.gpg filter=gpg diff=gpg" > .gitattributes