APS 已死,使用 Emacs + age 作为安卓密码管理器

背景

大致步骤

  1. F-Droid 下一个 Emacs(废话)

  2. melpa 安装依赖: age f s with-editor

  3. passage.el 的 repo 扔进 load-path

  4. age、age-keygen 扔进 Emacs 可访问的目录(这就体现 age 简洁性的好处了,两个静态二进制就完事)

  5. age-keygen 一个无密码的 key(见下文),并配置好 age-default-identity, age-default-recipient 最后 (age-file-enable)

    由于 age 二进制文件没在 PATH 里,所以需要写成

(setq age--configurations '((Age (program . "path/to/age") (version . "1.0.0)))
  1. 修改 passage 的键位使其适合触屏
--- passage.el.orig	2025-07-13 09:55:57.166110480 +0800
+++ passage.el	2025-07-13 09:09:23.741570293 +0800
@@ -86,7 +86,7 @@
     (define-key map (kbd "v") #'passage-view)
     (define-key map (kbd "r") #'passage-rename)
     (define-key map (kbd "o") #'passage-otp-options)
-    (define-key map (kbd "RET") #'passage-view)
+    (define-key map (kbd "<mouse-1>") #'passage-view)
     (define-key map (kbd "q") #'passage-quit)
     map)
   "Keymap for `passage-mode'.")
@@ -464,7 +464,7 @@
   (dotimes (_ (max 0 (* (1- indent-level) 4)))
     (insert " "))
   (unless (zerop indent-level)
-    (insert "├── ")))
+    (insert "\\- ")))
 
 (defun passage-entry-at-point ()
   "Return the `passage-entry' property at point."
@@ -566,8 +566,8 @@
 
 (defvar passage-view-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "C-c C-c") #'passage-view-toggle-password)
-    (define-key map (kbd "C-c C-w") #'passage-view-copy-password)
+    (define-key map (kbd "<mouse-1>") #'passage-view-toggle-password)
+    (define-key map (kbd "<touchscreen-hold>") #'passage-view-copy-password)
     map))
 (make-variable-buffer-local 'passage-view-mode-map)
  1. 将第 5 步的公钥加入 .age-recipients,重新加密整个 store,把你的 .passage 目录通过某种方式传到手机
  2. (optional) F-Droid 下一个 Clipeus,防止国产软件(点名B站) 乱读剪贴板
  3. (optional) 弄个应用锁
  4. (optional) rice your emacs!

展望

  • 首先还是希望安卓能有一个像样的兼容 pass (最好是 gpg,age 等多后端)的密码管理软件
  • Emacs pinentry 其实是能调用“安卓安全键盘”的,或许可以继续魔改 age.el 使其先用 pinentry 读取密码然后作为 stdin 传给 age,这样应该就能支持密码加密的私钥