世界を動かす技術を、日本語で。

Pass: Unixパスワードマネージャー

概要

pass は、Unix哲学に基づいた シンプルなパスワード管理ツール。 パスワードは gpgで暗号化されたファイル として保存。 標準的な コマンドライン操作やgit連携 に対応。 拡張性・柔軟性が高く、他ツールからの移行も容易。 多くの クライアントや拡張機能 がコミュニティにより提供。

pass の概要と特徴

  • Unix哲学 に基づく、シンプルなパスワード管理ツール
  • 各パスワードは gpgで暗号化されたファイル として保存
  • ファイル名は ウェブサイトやリソース名 で管理
  • ディレクトリ階層 で整理可能、標準コマンドで操作
  • パスワードは ~/.password-store に保存
  • 追加、編集、生成、取得 などのコマンドを提供
  • クリップボードへの一時コピーgitによるバージョン管理 に対応
  • bash, zsh, fish の補完機能
  • 多様なクライアントやGUI、拡張機能 がコミュニティで開発

基本的な使い方

  • 既存のパスワード一覧表示
    • passコマンドで 全パスワードの階層表示
  • パスワードの表示
    • pass パス名該当パスワードを表示
  • クリップボードへのコピー
    • pass -c パス名一時的にクリップボードへコピー
  • パスワードの追加
    • pass insert パス名新規パスワードを登録
    • 複数行対応--multilineまたは-m
  • パスワードの編集
    • pass edit パス名デフォルトエディタで編集
  • パスワードの自動生成
    • pass generate パス名 長さランダム生成
    • 記号なし生成--no-symbolsまたは-n
    • クリップボード直送--clipまたは-c
  • パスワードの削除
    • pass rm パス名削除操作

git連携

  • パスワードストアを gitリポジトリとして初期化 可能
  • 各操作ごとに 自動でgitコミット
  • pass git pushpass git pull同期管理

初期設定

  • ストアの初期化
    • pass init "GPG鍵ID"GPG鍵を指定して初期化
    • 複数GPG鍵やチーム利用 にも対応(-pでフォルダごとに鍵指定可能)
  • gitリポジトリの初期化
    • pass git initストア内にgitリポジトリ作成

インストール方法

  • Ubuntu / Debiansudo apt-get install pass
  • Fedora / RHELsudo yum install pass
  • openSUSEsudo zypper in password-store
  • Gentooemerge -av pass
  • Arch Linuxpacman -S pass
  • Macintosh (Homebrew)brew install pass
  • FreeBSDpkg install password-store
  • ソースコードgit clone https://git.zx2c4.com/password-store

データ構成と柔軟性

  • 特定のデータ構造を強制しない フラットテキストファイル形式
  • 複数行機能 (--multiline/-m)でパスワード以外の情報も保存可能
    • 例:1行目にパスワード、2行目以降にURLや秘密の質問等
    • クリップボードコピーは1行目のみ
  • フォルダ分けやファイル分割 による柔軟な整理も可能
  • ユーザーの好みに合わせた運用 が可能

拡張機能(Extensions)

  • /usr/lib/password-store/extensions~/.password-store/.extensions/に設置
  • 環境変数PASSWORD_STORE_ENABLE_EXTENSIONS で有効化
  • 主要な拡張例
    • pass-tomb:Tombによるストア管理
    • pass-update:パスワード更新フロー
    • pass-import:他マネージャからのインポート
    • pass-otp:ワンタイムパスワード対応

対応クライアント・ツール

  • passmenu :dmenuスクリプト
  • qtpass :クロスプラットフォームGUI
  • Android-Password-Store :Androidアプリ
  • passforios, pass-ios :iOSアプリ
  • passff, browserpass :Firefox/Chromeプラグイン
  • Pass4Win :Windowsクライアント
  • gopass, upass :Go製GUIやインタラクティブUI
  • Alfred連携 :複数のAlfred統合スクリプト
  • emacs, XMonad対応 :各種エディタ・ウィンドウマネージャ統合

他ツールからの移行

  • 1Password, Keepass, Lastpass, Firefox 等からのインポートスクリプト多数
    • 例:1password2pass.rb, keepassx2pass.py, lastpass2pass.rb, firefox_decrypt など

ライセンス・開発体制

  • 作者 :Jason A. Donenfeld (zx2c4.com)
  • ライセンス :GPLv2+
  • 活発な開発・貢献方法
    • メーリングリスト参加、gitパッチ送付
    • IRC (#pass on Libera.Chat)で議論可能

Hackerたちの意見

GPGの代わりにageを使って暗号化するなら、これが役立つよ: https://github.com/FiloSottile/passage

他にもageを使ったパスのようなパスワードマネージャーがあるよ。一つの開発者が比較表を作ってる: https://gitlab.com/retirement-home/seniorpw/-/tree/02dc02d1e.... (開示:表の中のpagoは俺のやつ。)

CLI好きには面白いけど、一般の人にはデスクトップのKeepassXCとAndroidのKeepassDX(パスワードDBを自分のマシンに保存して、Wireguard経由でリモートアクセスする方)がいい解決策だと思う。

wg経由でリモートアクセスする理由は何かある?syncthingじゃなくて?Androidでwgを使ってどうやってアクセスしてるのかも気になるな。

keepassxc.cliも忘れないで!これを使うとプログラム的に秘密を設定したり取得したりできるよ。インターフェースはかなりユーザーフレンドリーで、ちょっと難解だけど。暗号化された秘密のバンドルを作る必要があった時に使った(長いパスワードで一時的にAPIキーをアンロックするため)。単一のファイルとそれをアンロックするための「Makefile」を生成できたし、適切な環境にキーを渡すこともできた。最初にGNUのpassを使おうとしたけど、残念ながらgnupgの管理が必要で、これはデフォルトオプションが悪いことで有名な地雷原で、シェルに統合されるべきだと仮定してユーザープロファイルディレクトリに保存するから(呼び出す場所に対して相対的なディレクトリを使わない)。これが私のファイル一つのワークフローを危険にさらしたから、普及しているにもかかわらず、諦めざるを得なかった。

デスクトップ用には「passmenu」スクリプトがあって、これをDE/WMのキーにバインドできるよ。

「ノーマルな人たち」?すべては相対的だと思う。俺は1Passwordを使ってて、あとはうまくいくことを願ってる。

ちょっと宣伝。ターミナルでKeepassアーカイブを管理するツール[1]を作ったんだけど、ここで読んでることのいくつかを解決できるかも。TUIがあって、他のコマンドにパイプすることもできるよ。[1]: https://github.com/shikaan/keydex

Keepassでは解決できない唯一のケースは、直接接続せずに2台の別々のマシンでパスワードを作成して、後でそれを統合することだね。

Keepassには、あまり話題にならないけど、複数のボールトを持てて、それらを同時に開いて検索できるという非常に評価されていない機能があるよ(少なくとも、君が言ってた2つのアプリはそれをサポートしてる)。ほとんどのパスワードマネージャーは1つのボールトに基づいていて、すべてのパスワードを最大限のセキュリティが必要だと扱わなきゃいけない問題がある。私の場合、たぶん70%のパスワードは重要じゃないサイト用で、他の誰かがその認証情報を手に入れても大した問題じゃないと思う。でも、そのサイトにログインするたびに長いマスターパスワードを入力しなきゃいけない。Keepassを使えば、その70%を別のボールトに入れて、タイプが早い短いマスターパスワードを使えるから、完全に安全かどうかわからないコンピュータでそのボールトを開くときもあまり心配しなくて済むんだ。

これを試してみようかな。今まではkeepassでローカルファイルだけ使ってたんだ。俺の場合、SynologyのNASにファイルを保存してて、2.5インチのSSDが2つ入った2ベイのやつを使ってる。メモや音楽、その他のものも入れてるし、wgもね。

KeepassXCを使いたいんだけど、妻とクレデンシャルを共有するのが簡単じゃないんだ。専用のボールトを使うこともできるけど、既存のクレデンシャルを共有するためにコピペしなきゃいけないからね。だから今のところ、Vaultwardenに落ち着いてて、意外と安定してるよ。

自分を離れないなら楽しいけど、誰と共有するかには気をつけてね。企業のパスワードマネージャーとしては、誰がどの秘密にアクセスしたかを把握する方法がないから、常にパスワードを変更しなきゃならない。 (面倒なら変更しなくてもいいけど。) (聞かないで。)新しくアクセスが必要な人がいる場合、彼らが必要とするファイルを再暗号化する標準的な方法もない。自分で何かを組み合わせる必要がある。gitを使ってるけど、コミットメッセージは自動生成されてて役に立たない。データを壊した誰かのせいで、以前のバージョンを探す時にDropboxを使っても同じくらいの役立ち具合だよ。誤ってプッシュしたものを消す方法はなくて、gitの履歴を書き換えてみんなに迷惑をかけるか(または個人用の他のクライアントデバイスのために)、それしかない。見た目はシンプルでいいけど、手動ツールでインターフェースできるのも好き(例えば、何が起こっているかを把握するために自分でコミットメッセージを書くとか、300のコミットを避けるために一気に再暗号化する時に)。でも、そのシンプルさが落とし穴でもある。サイトごとのパスワードにhash(site_name+main_password)を使うのと似た感じで、シンプルさは美しいけど実用的な問題がいろいろある。企業環境でのパスワードマネージャーに良い経験がある人いる?理想は、また別のサービスを管理しなくても良くて、サーバーの侵害がビジネスの侵害にならない(つまり、ユーザー間のエンドツーエンド暗号化があって、指紋を確認するようなもの)。今のところ、Bitwardenがその条件を満たしているようだけど、他にもあるかは分からない。

現在の雇用主は1passwordを使っていて、「ボールト」をグループで共有するような便利な機能がいくつかあるし、.envファイルを使って秘密を注入する「op run」コマンドや、CIでパスワードを取得するためのサービスアカウントなどもあるよ。

同意です。

Bitwardenは結構使いやすいよ。うちの組織でも使ってるし、企業利用にはまだ少し粗いところもあるけど、どんどん良くなってる。

実際の経験はまだないけど、企業内のチーム向けにパスワード共有ソリューションの市場を評価したことがある。そこの別の選択肢は https://www.passbolt.com/ で、公開鍵/秘密鍵のアプローチを使ってて、平文のパスワードはローカルマシンから出ないし、共有パスワードは各ユーザーの公開鍵で再暗号化される。

FOKSの上に何か素敵なものを作れそうだと思うよ。(https://foks.pub)

俺と友達は「pa」を会社で使ってて、めっちゃ成功してるよ: https://git.j3s.sh/pa これ、ageを使ってて、複数のキーで暗号化できるんだ。

「企業のパスワードマネージャーとして、誰がどのシークレットにアクセスしたかを知る方法はないから、常に全てのパスワードを変更しなきゃならない。」 異なるキーを使うために異なるディレクトリを設定できるし、各パスワードに対して1つのキーに制限する必要もない。複数のキーを使える。だから、こんな構造を設定できる:

  • admins/.gpg-id "admin\n"
  • techs/.gpg-id "admin\ntech\n" ここでadminとtechは異なるグループのための2つのキー。adminはより多くのアクセス権を持ってる。さらに良いのは:
  • site_foo/.gpg-id "bob\nalice\n"
  • site_bar/.gpg-id "bob\nrobert\n" ここで各従業員は自分のキーを持ってる。だから、従業員が退職したときにどのパスワードを変更する必要があるか、どのパスワードに個々の従業員がアクセスできるかを微調整できる。どのパスワードをどの従業員が知っているかを制御するためにgitサブモジュールを設定できるし、gitを使っているから、個々の従業員がいつどのパスワードにアクセスできたか、時間とともにそのアクセスが変わったかを知ることができる。

OTPを生成するpass-otp拡張もあるよ! https://github.com/tadfisher/pass-otp passのAndroidアプリもすごくいいよ! https://play.google.com/store/apps/details?id=dev.msfjarvis.... termuxでも動くしね。

共有してくれてありがとう。私の解決策は、こんな小さなスクリプトを~/binに置くことだよ:#!/bin/sh set -eu k=$(pass ARG) oathtool -b --totp "$k"

このアプリは古いバージョンのAndroid用に作られたため、あなたのデバイスでは利用できません。 それに、あのアプリはあまりうまく動かないよ、だってちょっと使いにくいGPGアプリが関わってるから。

msfjarvisによるAndroid Password Storeアプリは昨年アーカイブされたよ。agrahnによってフォークされて大幅に更新された。GitHub ReleasesやF-DroidにはAPKがあるけど、Google Playストアにはないよ。 https://github.com/agrahn/Android-Password-Store

Passは何年経っても素晴らしいよ。ちょっと宣伝だけど、GNOMEの検索プロバイダーを作ったから、概要からパスワードを検索できるよ。OTPもサポートしてる。 https://github.com/Fingel/ripasso-gnome-search-provider

ブラウザのパスワードマネージャーにパスキーがあると便利だけど、リカバリーコードやAPIキーのためにパスボールトも役立つよね。しばらくpassを使ってたけど、実際にどんな脅威モデルを解決してるのか分からなかった。GPGエージェントにキーをキャッシュさせると、どんなスクリプト(例えばnpmのpost-install)でもpass lspass my/secretsを実行して、全ての認証情報をダンプできちゃう。そうなると、基本的には追加のステップがあるフルディスク暗号化と同じだから、~/passwords.txtに全部入れておいてもいいかも。キーをキャッシュしないと、秘密が必要なたびに長いGPGパスワードを毎回打たなきゃいけないし。YubiKeyを使ってオンデマンドで解除しようとしたけど、統合がイマイチで、パスワードが必要なときに毎回差し込むのは面倒だった。結局、Bitwardenに切り替えたよ。

リカバリーコードやAPIキーのためにパスボールトも役立つよね これについてはもう知ってるかもしれないけど、Bitwardenにはこの目的で使えるCLIクライアントもあるよ、少なくともカジュアルにはね。

どのパスワードマネージャーにも当てはまることだね。データベースやストアがアンロックされていると(つまりマスターパスワードがキャッシュされているかRAMにある場合)、全てのパスワードが抽出できちゃう。必要ないときはパスワードマネージャーをロックしないとね。実際、Bitwardenではキャッシュされたパスワードが、広い攻撃面を持つブラウザにさらされてる(ランダムなリモートサーバーとのやり取りも含む)。最近、Bitwardenを含むほとんどのブラウザベースのパスワードマネージャーに脆弱性があって、リモート攻撃者がユーザーにパスワードを送信させることができるようになってた。Bitwardenは使ってるけど、主に重要じゃないパスワード用だね。

どうやってかは覚えてないけど、私の環境ではBraveブラウザとFirefox、モバイルでもpassが動いてる。これが唯一のパスワードマネージャーだよ。多分、ブラウザのプラグインだと思う。

パスワードは暗号化されたファイルパーティションのsqliteデータベースに保存してる。俺のスクリプトがパスを取得したら、すぐにパーティションを閉じるようにしてるよ。個別の暗号化ファイル(パスワードごとに1つ)にパスワードを暗号化して、パスファイルを復号化した後にgpgエージェントをクリアするようにスクリプトを組むこともできる。

うまく動かすのにちょっと時間がかかったけど、ここではYubiKeyを使ってるし、おすすめだよ。たまに探して差し込む必要があるけど、全体的にはずっと差しっぱなしでもいいかな。操作ごとにタッチが必要な設定にしてる。

YubiKeyを設定して、GPGキーの使用を認証するためにPINやタッチが必要になるようにできるよ。passに関しての私の主な問題は、YubiKeyでiOSではあまりうまく動かないことだね。

bitwardenは、ロック解除された状態でもパスワードを保護できるの?

USBポートに余裕があれば、ずっと差しっぱなしにできるNanoキーの一つを使えるよ。誰かが私のYubiKeyのPINを盗んでも、全部のパスワードを盗むためには、1000回以上タップさせる必要があるからね。

ここにはたくさんのポジティブな意見があるけど、パスには言及すべき重要な問題もあると思う。 - 本質的に非構造化データだから、一般的に扱うのが難しい。ユーザー名とパスワードがあって、それをスクリプトで使う必要があるなら、必要なスクリプトごとにシェル言語で独自のパーサーを実装しなきゃいけない。 - pass generateで新しいパスワードを生成する際、上記の理由からか、デフォルトでパス値のすべてを置き換えちゃう。例えば、パスワードと秘密の質問の答えがあった場合、generateを使って新しいパスワードを取得すると、秘密の質問の答えが消えちゃう。 - 履歴を確認するのがすごく難しい。しばらく前に使うのをやめたけど、すべてが暗号化されてるからgit diffでは役に立たないし、確かコマンドラインツールはパスワードのレビューや復元がすごく使いづらかった。 - 名前のせいで検索がほぼ不可能。似たようなものを作ってるけど、もう少し広い範囲で使えるようにしてる(コンテナやサンドボックス内で使うことを想定してる) https://github.com/andrewbaxter/passworth

  • 本質的に非構造化データだから、一般的に扱うのが難しい。ユーザー名とパスワードがあって、それをスクリプトで使う必要があるなら、必要なスクリプトごとにシェル言語で独自のパーサーを実装しなきゃいけない。 それはそうだけど、自分の慣習を使うこともできるよ。 > - pass generateで新しいパスワードを生成する際、上記の理由からか、デフォルトでパス値のすべてを置き換えちゃう。例えば、パスワードと秘密の質問の答えがあった場合、generateを使って新しいパスワードを取得すると、秘密の質問の答えが消えちゃう。site/passsite/secret-questionに分けておけばいいよ。ディレクトリツリーを使ってるのはかなりいい感じ。 > 履歴を確認するのがすごく難しい。しばらく前に使うのをやめたけど、すべてが暗号化されてるからgit diffでは役に立たないし、そもそも生成されたパスワードに対してgit diffを実行するのは変なことだよ。重要なのは、パスワードやサイトの最後の変更がいつだったかをgit logで知っておけば、必要ならgit checkout -dで戻せること。 > 名前のせいでターミナルで検索するのがほぼ不可能。$ passは通常、関連するパッケージを示唆するからね。

「pass generate」には、ファイル内のパスワードだけを置き換える-iフラグがあるよ(最初の行だと仮定される)。

構造については、フォルダを作って3つの主要なファイルを用意することで「解決」したよ。具体的には、Websites/foo.com/username、Websites/foo.com/password、Websites/foo.com/emailって感じ。たまに「/notes」っていうファイルを追加して、構造化されてないテキストを入れたり、特別なケース用に「/json」っていうファイルを作ってJSON形式の機械可読なものを入れたりしてる。完璧ではないけど、メタデータが暗号化されてないのはちょっと嫌だけど、全体的にはこの解決策に満足してる。

履歴を確認するのは非常に難しい。しばらく前に使うのをやめたけど、すべてが暗号化されてるから git diff では役に立つ情報が得られないし、確かコマンドラインツールはパスワードのレビューや復元をするのがすごく難しかったと思う。passは .gitattributes を設定して、gpgファイルをカスタムドライバーを通じてテキストに変換するようにgitを設定する。これにより、暗号化された内容のテキスト差分がすぐにできるようになる(少なくとも、これをテストするために設定したストアではね)。 ~/.password-store # cat .gitattributes *.gpg diff=gpg ~/.password-store # cat .git/config # ... [diff "gpg"] binary = true textconv = gpg2 -d --quiet --yes --compress-algo=none --no-encrypt-to --batch --use-agent

ユーザー名には「user:」を行の先頭に置くっていう決まりがあるんだ。ファイルの最初の行にはできないけど、それ以外は順番に依存しないよ。ブラウザのプラグインやAndroidアプリもこれを実装してて、自動入力もこれに基づいてる。メインサイトでも推奨されてるしね。もし「generate」でパスワードを生成したら、それはgitに入ってるから復元可能だよ。passにとって便利なのは、最初の行だけに自動挿入するフラグかもしれないけど、それがなくてもpwgenで十分だし、passの裏側でも使われてる。

クリップボードにパスワードを挿入するための自動化を使いたいなら、ちょっとした構造が必要だよ。パスワードは最初の行に来るし、その次にユーザー名が来る。そこから先は、めちゃくちゃ自由だよ。ここには、オンボーディングのメールが丸ごと入ったpassエントリーが浮いてるんだ…

似たようなことに取り組んでるんだけど…これはシェルスクリプトじゃないんだ…

似たようなことに取り組んでるんだけど、もうちょっと大きな範囲でね(コンテナやサンドボックス内で使うことを想定してる)。 https://github.com/andrewbaxter/passworth > 暗号化されたsqlite3に保存されてるんだけど、暗号化されたsqlite3って言葉に惹かれたよ。READMEにSQLCipherを使ってるって書いてくれるといいな。

passで経験した他の重要な問題はこんな感じだね: - 重要なプロセスが文書化されてない。例えば、別のコンピュータとpassリポジトリを共有するのは明らかじゃない:.password-store/ディレクトリ以上のものをコピーする必要がある... - パッケージ化されてないとインストールが難しい。ヘッドレスNASにpassをインストールしようとしたけど、gpgが必要で、aarch64にクロスコンパイルするのは難しそうだった。 - passgpgの軽量インターフェースだから、GPGの問題を全部抱えてる。gpg-agentでいくつかイライラしたことがある。多くの組織がGnuPGを捨てて、ageみたいなシンプルで良い暗号ツールに切り替えようとしてる。 https://github.com/FiloSottile/age - Androidでのpassは最悪だった。公式パッケージはメンテされてなかったし、フォークはF-Droidにパッケージ化されてなかった。UIも使いにくかった。明らかに良いユニバーサルソリューションがないから、今でもpassを使ってる。FiloSottile/passageはgpgをageに置き換えるだけの最小限の変更だけど、Androidはなし。もっと良い代替はgopassで、全てのUnixでポータブルで、passと互換性があって、ageプラグインもある。でも、Androidのパッケージはまだない。 https://www.gopass.pw

このスレッド全体がカニンガムの法則を体現してるのが好きだね。 https://en.wikipedia.org/wiki/Ward_Cunningham#%22Cunningham'...

最近、約10年使ってたpassから移行したよ。主な理由は2つ。1つ目は、このノートパソコンがすべてのGUIアプリのflatpakバージョンでセットアップされてて、Firefoxのブラウザプラグインが全然動かないんだ。しばらくは、ブラウザにペーストするためにpass -cを使ってたけど、理想的ではなかった。2つ目は、Androidアプリがアーカイブされてることに気づいた。少なくとも1つのフォークがあるけど、今後どうなるかは誰にもわからない。https://github.com/android-password-store/Android-Password-S... 今のところ、vaultwardenをホスティングして、いろんなBitwardenクライアントを使って満足してるよ。

これまでのところ、どうだった?俺も似たような状況で、同じ理由で同じことを考えてるんだけど、オフラインでの体験がどうなのか気になるんだ。接続が悪い時期が多いから、オフラインで認証情報を調べたり更新したりできるのはすごく便利だと思ってる。vaultwardenでどれくらいできるのか分からないし、まだ試す時間が取れてないんだ。

いや、マジで、Androidアプリが棚上げされてるとは気づかなかった。フォークを見てみたけど、あそこではいい仕事してるみたいだね。両方のメンテナが移管について話し合わなかったのはちょっと驚きだな。アクティブなフォークが引き継ぐのが一番いいのに。他に何か問題があったのかな、例えばセキュリティの方針で意見が合わなかったとか。

「しばらくの間、ブラウザに貼り付けるためにpass -cのワークアラウンドを使ってたけど、理想的じゃないね。」 実はこれ、わざとやってるんだ。プラグインを最後にチェックしたとき、Firefox起動時にgpgキーが解除されるように見えたんだよね。パスワードプロンプトの時じゃなくて。あと、プラグイン作成者が勝手に自分のパスワードを送信できるのが嫌だった。Firefoxとpassは信頼できるからそんなことはしないけど、知らない人がやるのはリスクが高すぎる。

最近、passから乗り換えたばかりだよ。君とほぼ同じくらいの期間、約400個のシークレットを保存してた。結局、複数のデバイス間で簡単に同期できるものが欲しかったんだ。最近はもっと本格的に旅行するようになって、スマホやノートパソコンに重要なパスワードを数個だけ保存しておくわけにはいかなくなった。KeePassXCで1つのファイルを同期するのがずっと楽だったし、選べるAndroidアプリも2つあった。手動で全部移すのに3時間くらいかかったけど、その機会に整理してリファクタリングしたから、CSVインポート機能は使わなかった。パスワードマネージャーは「たまに書き込んで、頻繁に読む」アプリだから、3つのデバイスを同期させるために1つのファイルをローカルネットワークで送るのは全然苦じゃないよ。

「しばらくの間、ブラウザに貼り付けるためにpass -cのワークアラウンドを使ってたけど、理想的じゃないね。」 passにはpassmenuもあるよ。それを呼び出すキーを設定すれば、メニューでパスワードを選択してクリップボードにコピーしてくれる。コマンドプロンプトを呼び出してからpass -cを手動で入力する必要がなくなるよ。

俺が10年くらい使ってる別のアプローチがあって、これがすごく気に入ってる。全てのパスワードメタデータは、名前(通常はサイト名)でインデックスされたプレーンなJSONファイルに保存されてる。各エントリーには最低でもユーザー名が含まれてる。オプションでバージョン番号や、長さ(無ければ20)や許可される文字クラス、各文字クラスが必要な数も含まれてる。これらのデータは敏感じゃないから、ファイルを見れば俺のサイトリストが見える。実際のパスワードは保存されてなくて、俺のツールは決定論的なパスワードジェネレーターだから、パスフレーズを入力すると、そのパスフレーズと全メタデータのハッシュからパスワードを生成するんだ。いいところは、バージョン番号を変えるだけで全く新しいパスワードが得られるし、「履歴」もバージョンを戻すことで利用できること。唯一の大きな欠点は、パスワードを共有するのには全く使えないこと。明らかにそれにはパスフレーズを共有する必要があるし、他の誰かが設定したパスワードを「保存」する方法はないから。共有パスワードをメタデータ生成パスワードで暗号化して、別のメタデータに保存するモードを作ることを考えたこともあるけど、その必要があったのはほんの数回だけだった。

パスフレーズを共有するのは、リスクがさらに大きくなる。なぜなら、攻撃される面積が広がって、たくさんの認証情報が漏れることにつながるから。

これ、2日前にSECUSOのパスワードジェネレーターで見つけたんだ: https://secuso.aifb.kit.edu/english/105.php 最初はよくわからなかったけど、決定論的なパスワード生成アプローチを使ってることに気づいた。 余談だけど、SECUSOはすごくいいオープンソースアプリのコレクションがあるよ。

パスワードジェネレーターのアイデアには魅力を感じたよ、主にボールトの不安からね。この大事なボールトなしではリソースにアクセスできないって考えが好きじゃなかった(今でも)。家にいるときは道具があるからいいけど、そうじゃないときは、正しいハッシュ関数を教えてもらえれば、PBKDF2を使ってパスワードを生成できるんだ。でも、メタデータ(例えばパスワードルールに対処するため)を導入すると、そのアイデアの魅力がほとんど失われちゃう。そんなものを公に投稿するのは、ボールトを公開するのと同じくらい気が引けるよ。

これは自分の即席パスワードマネージャーの動きとすごく似てる。既存のツールがあるなんて知らなかったよ。