背景
- Android-Password-Store (aka APS) 作为 pass 在安卓上的独苗实现,在 2024年10月停止开发了
- 我的博客 全面使用 SSH 取代 PGP 解释了我为什么用 age
- 或许你可以用 termux 直接运行 pass/passage,但是有 Emacs 干嘛还用 termux
大致步骤
-
F-Droid 下一个 Emacs(废话)
-
melpa 安装依赖:
age f s with-editor
-
把 passage.el 的 repo 扔进 load-path
-
把 age、age-keygen 扔进 Emacs 可访问的目录(这就体现 age 简洁性的好处了,两个静态二进制就完事)
-
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)))
- 修改 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)
- 将第 5 步的公钥加入
.age-recipients
,重新加密整个 store,把你的 .passage 目录通过某种方式传到手机 - (optional) F-Droid 下一个 Clipeus,防止国产软件(点名B站) 乱读剪贴板
- (optional) 弄个应用锁
- (optional) rice your emacs!
展望
- 首先还是希望安卓能有一个像样的兼容 pass (最好是 gpg,age 等多后端)的密码管理软件
- Emacs pinentry 其实是能调用“安卓安全键盘”的,或许可以继续魔改 age.el 使其先用 pinentry 读取密码然后作为 stdin 传给
age
,这样应该就能支持密码加密的私钥