场景

Org Mode 作为主要 GTD 和笔记软件,需要使用网盘来同步信息,虽然 Dropbox 名声十分良好, 但是有一些敏感信息,还是认为谁都不值得信任。

所以需要使用 GPG 加密后再传到 Dropbox,而 Emacs 中, EasyPG Assistant 可以很方便地加解密。

GPG

https://zh.wikipedia.org/wiki/GnuPG

GNU Privacy Guard(GnuPG或GPG)是一种加密软件,它是PGP加密软件的满足GPL的替代物。GnuPG依照由IETF订定的OpenPGP技术标准设计。 GnuPG用于加密、数字签名及产生非对称钥匙对的软件。

如果不了解 GPG,推荐看一下阮一峰老师的文章,快速入门 http://www.ruanyifeng.com/blog/2013/07/gpg.html

简单地说就是可以通过 GPG 使用两种方式加密文件:

  • 对称加密,只使用密码对文件进行加密
  • 非对称加密,使用 GPG 密钥对文件进行加密,只有使用私钥能进行解密,而且需要私钥密码才能使用私钥

配置

macOS

通过 brew 安装 gpg

brew install gpg

Emacs

通过 use-package 配置 Emacs

如果没用过 use-package 可以看一下: https://github.com/jwiegley/use-package

macOS 上的图形界面 Emacs 弹出密码窗口有问题,可以通过以下配置解决

(setq epa-pinentry-mode 'loopback)

最后,配置文件如下:

(use-package epa-file
  :ensure nil
  :config
  (epa-file-enable)
  (setq epa-pinentry-mode 'loopback))

使用

对称加密

默认情况下,Emacs会使用对称加密的方法进行文件加密,实际就是用一个密码,使用 AES 对文件进行加密

每次打开文件时,都要输入密码,保存时,甚至要输入两次,因为被当成新加密了。

可以把密码缓存起来:

(setq epa-file-cache-passphrase-for-symmetric-encryption t)

再打开和保存这个文件时,就不用输入密码,

但是!!

这个缓存是在 gpg agent 进程里的,如果能确保电脑没别人会用,倒还好, 否则别人也是可能通过 gpg agent 的缓存读到解密内容的! 或者说使用完,关了 Emacs 之后,其它人再重新打开,尝试读取,也是能载入缓存的!

可以通过加一个 Hook,在关 Emacs 的时候,把 gpg agent 也杀了,相对能安全点

(add-hook 'kill-emacs-hook (defun personal--kill-gpg-agent ()
                             (shell-command "pkill gpg-agent")))

这里我们用 defun 而不是 lambda,有兴趣可以看一下这篇文章: http://ergoemacs.org/emacs/emacs%5Favoid%5Flambda%5Fin%5Fhook.html

非对称加密

使用 gpg key 对文件进行加密,这个目前应该是无懈可击的加密方式了

Org Mode 里使用非对称加密需要在文件开头加上:

# -*- mode:org; epa-file-encrypt-to: ("[email protected]") -*-

在保存的时候,Emacs 会提示让选择一个 GPG Key 进行加密, 加密以后,再打开这个文件,需要提供 GPG Key 私钥密码进行解密,然后再保存就不需要输入密码了。

我在用的时候有个问题,就是第一次新建文件加密保存后,每次都需要选择 Key 进行加密, 把 Buffer Kill 了之后,再打开文件使用就没有问题了

GPG 相关

导出 Key

用了 GPG 加密,那私钥就非常的重要了,所以最好把私钥导出一份:

# 找到自己的 Key ID,一长串字符
gpg --list-keys
# 导出,armor 表示使用可打印字符
gpg --export-secret-keys --armor AAAABBBBBBBBBCCCCCCC0000000000 >> /tmp/private.key

最重要的就是把导出文件保存好了,推荐离线保存!

这个文件比较大,内容比较多。 可以把文件分割成几个小份,然后导出生成二维码,打印到纸上,离线保存。

导入 Key

有导出,自然也有导入:

gpg --import private.key

导入之后 Key 没被信任,需要修改一下:

gpg --edit-key AAAABBBBBBBBBCCCCCCC0000000000
# 看到提示符后输入 trust
# 再选择信任等级,我自己的 Key,我选 5