前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPG in Emacs

GPG in Emacs

作者头像
飞驰的西瓜
发布2022-07-26 16:39:44
9650
发布2022-07-26 16:39:44
举报
文章被收录于专栏:EmacsTalk

Pretty Good Privacy (PGP) 是一款诞生于 1991 年的,一款用于认证、加密的一款软件,现如今已经有了标准化协议 OpenPGP,最常用的实现是 GnuPG,一般提到 GPG 时都是指的 GnuPG。

笔者在保存一些私人文件像日记、密码等时,就会用 GPG 格式的文件来保存。这篇文章就来介绍下 Emacs 对 GPG 文件的支持,关于如何创建 GPG key,读者可参考 GPG入门教程 by 阮一峰[1]

密码输入

为了提高 key 安全系数,一般推荐在创建 key 时设置一个密码,这样即使密钥丢了,别人也无法使用。

但是每次 输入密码显得有些繁琐,解决方式是让 gpg-agent 这个进程记住密码,这样只需要在系统第一次使用时输入即可。为了让 Emacs 功能在首次使用 GPG 时,捕获密码输入框,在 minibuffer 中输入密码,需要做如下的配置:

•首先是修改 agent 的配置文件

代码语言:javascript
复制
# cat ~/.gnupg/gpg-agent.conf
 
allow-emacs-pinentry
allow-loopback-pinentry
 
# 之后然后加载即可
gpgconf --reload gpg-agent

•然后安装 pinentry[2] 包,配置 loopback,最后启动 pinentry server,参考配置

代码语言:javascript
复制
(use-package pinentry
  :config
  (setq epa-pinentry-mode 'loopback)
  (pinentry-start))

笔者之前一直很好奇为什么这么复杂,pinentry 是什么东西?为什么需要它?我只是像输入一个密码而已呀。直到写这篇文章,我才彻底了解了 pinentry 的作用:

它会让用户输入的密码不会因内存不足而换出到磁盘,说到底还是安全问题。

更多技术细节可参考:pinentry-curses(1) man page[3]

文件操作

GPG 格式的文件是一种二进制文件,一般的编辑器是无法打开的,但 Emacs 对 GPG 提供了非常方便的支持,比如创建一个名为 password.org.gpg 的文件,保存时 Emacs 会自动弹出选择框,让用户选择加密的公钥。

代码语言:javascript
复制
Select recipients for encryption.
If no one is selected, symmetric encryption will be performed.
- ‘m’ to mark a key on the line
- ‘u’ to unmark a key on the line
[Cancel][OK]
 
  u D3026E5C08A0BAB4 Jiacai Liu <xxx@gmail.com>

而且,这个文件的 major mode 也能正确识别为 org mode,这样就可以非常方便的编辑 GPG 文件。与此同理,可以方便地创建任何格式的 GPG 文件,比如: diary.md.gpg ,重新打开文件时,Emacs 会自动解密,并设置相应的 major mode。

EasyPG

Emacs 自带的 EasyPG 包对常用 GPG 都提供了相应函数的支持:

•epa-sign-file

•epa-decrypt-file

•epa-import-keys

•epa-export-keys

•epa-list-keys

•epa-list-secret-keys

•epa-delete-keys

Git 集成

Git 对 GPG 这种二进制文件有特殊的支持,可以转化为文本的方式,这样就能非常方便的进行 diff、merge 了。

代码语言:javascript
复制
git config --global diff.gpg.textconv "gpg --no-tty --decrypt"
echo "*.gpg filter=gpg diff=gpg" > ~/.gitattributes

弦外之音

尽管 GPG 出现的时间很久,但互联网上每隔一段时间都会出现批评它的文章,比如:

•HN: GPG and Me[4]

•I'm giving up on PGP[5]

但目前为止,GPG 还没有替代品。没有 Emacs 的话,很难想象如何去方便、快捷地操作 GPG。

参考

•A.1.4 How to show diffs for gpg-encrypted files?[6]•[求助]magit 处理 gpg 文件:diff、merge[7]

引用链接

[1] GPG入门教程 by 阮一峰: http://www.ruanyifeng.com/blog/2013/07/gpg.html [2] pinentry: https://elpa.gnu.org/packages/pinentry.html [3] pinentry-curses(1) man page: https://sarata.com/manpages/pinentry-curses.1.html [4] HN: GPG and Me: https://news.ycombinator.com/item?id=9104188 [5] I'm giving up on PGP: https://blog.filippo.io/giving-up-on-long-term-pgp/ [6] A.1.4 How to show diffs for gpg-encrypted files?: https://magit.vc/manual/magit/How-to-show-diffs-for-gpg_002dencrypted-files_003f.html [7] [求助]magit 处理 gpg 文件:diff、merge: https://emacs-china.org/t/magit-gpg-diff-merge/19084

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 EmacsTalk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 密码输入
  • 文件操作
  • EasyPG
  • Git 集成
  • 弦外之音
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档