KeePassXCを使う

今までパスワードマネージャーとして、自作のものやSaaSとして提供されているものを使用してきた。それぞれに一長一短ありどれを使用するのか考えていたが、今回はフリーかつオープンソースであるKeepassXCに移行する事にした。

https://keepassxc.org/

インストール方法は、公式からインストーラをダウンロードしてインストールするのが良さそうだ。

一応KeePassXCはHomebrewを使用してもインストールできる。

brew install --cask keepassxc
KeepassXCをインストールする。

HomebrewはダウンロードしたファイルのSHA256をチェックするようになっている。ただしHomebrew自体に正しくない値が登録されてた場合は通ってしまうだろう。本来的にはOpenPGPで、署名の確認をした方が良い。詳しい手順も掲載されている1

ブラウザ拡張もある。以前 Microsoft StoreKeePassXC の偽アプリが登録されるという事件があったらしい2。怖すぎる。

これはKeePassXCだけの話ではないけれど、ブラウザ拡張もそうだし、他のアプリケーションやソフトウェアもそうだけれど、よくよく注意して使っていく必要がある。

またCLIも提供されているようだった。 keepassxc-cliKeePassXC に梱包されている。

https://www.mankier.com/1/keepassxc-cli

keepassxc-cli --help
使い方: keepassxc-cli [オプション] command
KeePassXC command line interface.

利用可能なコマンド:
add                 データベースに新しいエントリーを追加する。
analyze             パスワードの脆弱性や問題点を解析する。
attachment-export   エントリーの添付ファイルをエクスポートする。
attachment-import   エントリーに添付ファイルをインポートする。
attachment-rm       エントリーの添付ファイルを削除する。
clip                エントリーの属性をクリップボードにコピーする。
close               現在開いているデータベースを閉じる。
db-create           新しいデータベースを作成する。
db-edit             Edit a database.
diceware            新しいランダムなダイスウェアパスフレーズを生成する。
db-info             データベースの情報を表示する。
edit                エントリーを編集する。
estimate            パスワードのエントロピーの推定。
export              データベースの内容を指定した形式で標準出力にエクスポートする。
generate            新しいランダムなパスワードを生成する。
help                コマンドのヘルプを表示する。
import              XML データベースの内容をインポートする。
ls                  データベースのエントリーのリストを表示する。
merge               2つのデータベースをマージする。
mkdir               データベースに新しいグループを追加する。
mv                  エントリーを新しいグループに移動する。
open                データベースを開く。
rm                  Remove an entry from the database.
rmdir               Removes a group from a database.
search              素早くエントリーを見つけ出す。
show                エントリーの情報を表示する。


オプション:
  --debug-info   デバッグ情報を表示する。
  -h, --help     Displays help on commandline options.
  --help-all     Displays help including Qt specific options.
  -v, --version  バージョン情報を表示する。

引数:
  command        実行するコマンドの名前。

新しくパスワード用の文字列を生成してみる。

keepassxc-cli generate --length 15
Fk224zDmKL3fDfR
15文字のパスワード用の文字列を生成する。

徐々に使い方が分かってきた所で、Emacsからkeepassxc-cliを使うためのEmacs Lispを書いた

;;; keepassxc.el --- KeePassXC for Emacs.

;; Copyright (C) 2023 TakesxiSximada

;; Author: TakesxiSximada
;; Maintainer: TakesxiSximada
;; Version: 1.0
;; Package-Version: 20231104.0000
;; Package-Requires: ((emacs "29.1"))
;; Date: 2023-11-04

;; This file is part of soundplay.el.

;;; License:

;; This program is free software: you can redistribute it and/or
;; modify it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Affero General Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with this program.  If not, see
;; <https://www.gnu.org/licenses/>.

;;; Commentary:

;; KeePassXC Emacs Integration.

;;; Code:

(defvar keepassxc-database nil
  "Current KeePassXC Database file path")

;;;###autoload
(defun keepassxc-cli-search (term &optional database)
  (interactive
   (list (read-string "KeePassXC Search Term: ")
	 (read-file-name "Database: "
			 (file-name-directory keepassxc-database)
			 (file-name-nondirectory keepassxc-database) t)))
  (with-current-buffer (get-buffer-create "*KeePassXC*")
    (shell-mode)
    (setq-local comint-password-prompt-regexp "パスワードを入力してください:")
    (setq-local proc (start-process-shell-command
		      "*KeePassXC*"
		      (current-buffer)
		      (format "keepassxc-cli search %s %s"
			      (shell-quote-argument (or database keepassxc-database))
			      (shell-quote-argument term))))
    (set-process-filter proc #'comint-output-filter)
    (switch-to-buffer-other-window (current-buffer))))

;;;###autoload
(defun keepassxc-cli-show (entry &optional database show-protected)
  (interactive
   (list (read-string "KeePassXC Show Entry: ")
	 (read-file-name "Database: "
			 (file-name-directory keepassxc-database)
			 (file-name-nondirectory keepassxc-database) t)
	 (yes-or-no-p "Show the protected attributes in clear text?")))
  (with-current-buffer (get-buffer-create "*KeePassXC*")
    (shell-mode)
    (setq-local comint-password-prompt-regexp "パスワードを入力してください:")
    (setq-local proc (start-process-shell-command
		      "*KeePassXC*"
		      (current-buffer)
		      (format "keepassxc-cli show %s %s %s"
			      (if show-protected "--show-protected" "")
			      (shell-quote-argument (or database keepassxc-database))
			      (shell-quote-argument entry))))
    (set-process-filter proc #'comint-output-filter)
    (switch-to-buffer-other-window (current-buffer))))

;;;###autoload
(defun keepassxc ()
  (interactive)
  (message "Hello KeePassXC World!"))

(provide 'keepassxc)
;; keepassxc.el ends here