
dredge-cargo v0.10.3
暗号化されたCLIボールト:メモ、設定、キー、ファイルを管理。整理ではなく検索。
これはパスワードマネージャーではありません。ノートアプリでもありません。そして深海の底生異常標本分類学的原産地登録簿でも絶対にありません。しかし、最初の2つはどちらよりも良くこなします。冗談です(本当に冗談じゃない)。
整理するな、検索せよ。メモ、設定、キー、機密 — ターミナルから5秒。
「ありふれたガラクタで私を煩わせるな。」 — 魚屋
go install github.com/DeprecatedLuar/dredge-cargo/cmd/dredge@latest
あなたがまだ見たことのないクールな機能
- 暗号化ストレージ — リポジトリをクローンしても、完全に意味不明の暗号文だけが得られます。パスワードなしではリポジトリに何が入っているかすらわかりません。(AES-256-GCM + Argon2idを使用)
- インスタント検索 — 独自のファジー検索アルゴリズムを作りました。怠け者なので、300件以上のエントリの中から目的のものをミリ秒で見つけられて、自分で考えなくて済むようにしたかったからです。
- 何でも保存 — メモ、スクリプト、dotfiles、画像、zipアーカイブ。ファイルとして存在するものであれば、何でもdredgeに保存できます。
- ライブファイルリンク — クールな機能です。任意のアイテムをシステムパスにシンボリックリンクして、直接またはdredge経由で読み書きできます。変更はリポジトリと双方向に同期されます。
- Git対応 — あなたが所有するプライベートリポジトリ。
git cloneするだけでデータが手に入ります。 - セッションパスワード — ターミナルセッションごとに1回だけプロンプト表示。その後はターミナルを閉じるまでパスワードなしで使用できます。(詳細はセキュリティのセクションをご覧ください)
- ゴミ箱 + 取り消し — 削除したアイテムはゴミ箱へ移動します。誤って削除した場合は
dredge undoで元に戻せます。
dredgeに何を保存するか?
あなたを批判するつもりはありません。煩わしいAPIキー(一度しか表示されないもの)、SSH設定、AIプロンプト、パスワード、そのまま実行できるシェルスクリプト、メールテンプレート?、dotfiles(変わってますが問題なく動作します)、zipアーカイブ、映画リスト、クイックアクセス用のURLリスト...
日本語で書かれた『チェンソーマン』第2話の合法的なコピーさえも。(私は特にその話を持っているかもしれません、いや持っていないかもしれません)
インストール
Go
go install github.com/DeprecatedLuar/dredge-cargo/cmd/dredge@latest
$GOPATH/bin(通常は ~/go/bin)が PATH に含まれていることを確認してください。
ユニバーサル
curl -sSL https://raw.githubusercontent.com/DeprecatedLuar/the-satellite/main/satellite.sh | bash -s -- install DeprecatedLuar/dredge-cargo:dredge
その他のインストール方法
手動インストール
- リリースページからお使いのOS向けのバイナリをダウンロード
- 実行権限を付与:
chmod +x dredge-* - PATHに移動:
mv dredge-* ~/.local/bin/dredge
ソースからビルド
git clone https://github.com/DeprecatedLuar/dredge-cargo
cd dredge-cargo
go build -o dredge ./cmd/dredge
mv dredge ~/.local/bin/
クイックスタート
# 既存のGitリモートで初期化
dredge init yourusername/vault # GitHubの省略記法
# または: dredge init [email protected]:you/vault.git
# 最初のアイテムを追加
dredge add "OpenAI Key" -c "sk-..." -t keys api # -cフラグがない場合はエディタが開きます
# 検索
dredge search openai
# Gitにプッシュ
dredge push
使用方法
# 何でも追加
dredge add My SSH Config -t ssh dotfiles --import ~/.ssh/config
dredge add "Master Architect Prompt" --import prompt.md -t ai prompts
dredge add "Watchlist" -c "Dune 2, Oppenheimer..." -t lists
dredge add "project-backup" --import project.tar.gz # バイナリファイルもOK :D
# 検索 — 覚えていることを入力するだけ
dredge search prompt
dredge search aws key
dredge search ssh
# 表示、編集、削除
dredge view <id>
dredge edit <id>
dredge rm <id>
dredge undo # 元に戻す
# 検索結果には番号が振られます — 番号を入力して表示
dredge search ssh # 表示: 1. [xKP] SSH Config 2. [mNq] SSH Key
dredge 1 # 直接表示
# Git同期
dredge push
dredge pull
dredge sync # pull + push
仕組み
「深淵に何が潜んでいるのか想像もつかない。」 — 灯台守
では、まとめます:
使用する主要な暗号技術は2つ、Argon2idともちろんAES-256、特にGCMバリアントです。
Argon2idは、RFC 9106の推奨であり、2015年PHCの勝者だからです。以上です。 AESのGCMバリアントは、暗号化データすべてに改ざんを不可能にするフィンガープリントを付与するからです。以上です。
現在、すべてのデータは ~/.local/share/dredge/ に暗号化ファイルとして保存されています。このディレクトリはGitリポジトリでもあります(少なくとも現時点では)。そのため、dredge push でコミットしてプッシュすると、バックアップとしてすべてが保存されます。各アイテムは、ランダムな3文字のIDを持つ独立した暗号化ブロブです。ファイル名が漏れないようにしたため、誰かがデータを見ても何を見ているのかわかりません。
暗号化パイプライン
あなたのパスワード
+ 16バイトのランダムソルト ← ソルトは .dredge-key に保存されます
→ Argon2id (64 MB メモリ · 4 スレッド · 1 イテレーション)
→ 32バイトのマスターキー (ソルト + パスワード = 実際のキー)
マスターキー + アイテムコンテンツ (TOML: タイトル、タグ、コンテンツ)
→ AES-256-GCM、操作ごとに新たなランダム12バイトのnonceを使用
→ [12B nonce][暗号文 + 16B 認証タグ]
→ items/xKP としてディスクに書き込まれる (ランダムID、拡張子なし)
したがって、ボールト全体で同じ派生キーが共有されます(つまり、キーを失うとデータを失います。キーを失わないでください)。すべてのアイテムは同じキーを使用し、それぞれに独自のランダムnonceがあります。同じコンテンツを2回暗号化すると、まったく異なる暗号文が生成されます。
保存場所
~/.local/share/dredge/ ← ボールト (Gitリポジトリ)
├── .git/
├── .gitignore ← .spawned/ と links.json を除外
├── .dredge-key ← ソルト + 暗号化された検証文字列
├── items/
│ ├── xKP ← 暗号化されたアイテム
│ ├── mNq ← 暗号化されたアイテム
│ └── ...
├── .spawned/ ← リンクされたアイテムの平文コピー
└── links.json ← シンボリックリンクマニフェスト
すべての暗号化ファイルと .dredge-key はGitリポジトリに保存されます。平文ファイル(システムから読み取り可能にしたいと決めたもの)は追跡されません。好きなように扱ってください。
セッションモデル
ターミナルで最初のコマンドを実行すると、派生した32バイトのキーが $XDG_RUNTIME_DIR/dredge/$PPID/.key にキャッシュされます(ルートのみアクセス可能)
同じターミナル内での以降のすべてのdredgeコマンドは、キャッシュされたキーを使用します。つまり、パスワードのプロンプトは表示されなくなります。各ターミナルは、親PIDに基づいた独立したディレクトリを取得します。そのため、ターミナルが死ぬとキーはディスクから消えます。
より詳細な技術情報
鍵導出 — Argon2id: RFC 9106推奨パラメータ (64 MB メモリ、4 スレッド、1 イテレーション)。.dredge-key 内のソルトは秘密である必要はありません。ファイルがあってもパスワードのブルートフォースを非常に高コストにするだけです。あなたのパスワードが安全を守るので、何をすべきかはおわかりでしょう。
暗号 — AES-256-GCM: すべての暗号化にフィンガープリントを付けます。機密性と完全性の両方を提供します。暗号文を改ざんしても、復号化はガベージを生成せず、復号化に失敗してエラーを出力します。
パスワード検証: .dredge-key には、マスターキーで暗号化された文字列 dredge-vault-v1 が含まれています。新しいセッションごとに、dredgeはこれを復号化してパスワードが正しいかどうかを検証します。そのため、dredge-vault-v1 が得られなければパスワードは間違っており、操作の途中で間違ったパスワードに気付くのではなく、約100msで失敗します。
キャッシュされるもの: セッションファイルは、派生した32バイトのキー(パスワード + ソルト)を保存します。パスワード自体は保存しません(そこまで愚かではありません)。そのため、アクティブなセッション中に誰かが .key を読んでも、パスワードを回復することはできません。
セキュリティ
「小さな漁獲でも帰れる方が、まったく帰れないよりはましだ。」 — 魚屋
脅威モデル(このセクションはAIで作成しましたが、正しい内容です)
誰かがあなたのプライベートGitリポジトリをクローンした場合:
暗号化されたブロブと .dredge-key を入手します。ソルトは秘密ではありません。その目的は事前計算攻撃を非現実的にすることです。パスワードがなければ、アイテムは不透明なバイナリデータです。Argon2idはオフラインでのブルートフォースを高コストにします。強力なパスワードを使用してください。
誰かが実行中のあなたのセッションにアクセスした場合:
派生キーは、そのターミナルセッションの間、$XDG_RUNTIME_DIR/dredge/$PPID/.key に存在します。各ターミナルは独立したディレクトリを取得します。ターミナルを閉じればキーは消えます。そのパスはユーザースコープ(モード700)であり、RAMバックアップです。セッションディレクトリへの読み取りアクセスを持つ攻撃者は、ボールトを復号化できます。ホームディレクトリにある機密の認証情報と同じように扱ってください。誰かがあなたのマシンでroot権限を持っているなら、dredgeキーはあなたの心配事の中で最も小さなものです。
誰かがオフラインのマシンに物理的にアクセスした場合:
ディスク上のアイテムは暗号化されています。セッションキーはRAMバックアップストレージにあり、再起動後は保持されません。リンクされたアイテム(.spawned/)はディスク上に平文で存在します — 以下を参照。
平文が存在する場所
| 場所 | いつ | ライフタイム |
|---|---|---|
| RAMのみ | 表示、検索、編集のたび | コマンド終了時に解放 |
$XDG_RUNTIME_DIR/dredge/$PPID/edit-*.txt | dredge edit 実行中のみ | エディタ終了後に削除 |
~/.local/share/dredge/.spawned/<id> | dredge link 実行後 | dredge unlink を実行するまで |
スパウンファイルはディスク上に残る唯一の永続的な平文であり、アイテムをシステムパスに明示的にリンクしたためにのみ存在します。その他はすべてメモリ内のみです。
注意点
--password/DREDGE_PASSWORD: パスワードをインラインで渡すと、シェル履歴やpsの出力に露出します。環境変数は子プロセスに漏洩する可能性があります。共有環境では両方を避けてください。--vault/DREDGE_VAULT: 変更を永続化せずに、単一コマンドでアクティブなボールトを上書きします。複数のボールトを使用したスクリプティングに便利です。- リンクされたアイテム: リンクされたアイテムの平文は、シンボリックリンク先(例:
~/.ssh/config)に存在します。Gitで追跡されませんが、ディスク上に平文で存在します。
リンクコマンド
保存されたアイテムをファイルシステム上のパスにリンクします:
dredge link <id> ~/.ssh/config
このコマンドは、~/.ssh/config にシンボリックリンクを作成し、dredgeが管理する平文コピーを指し示します(ファイルはディスクに露出するため、使用可能になります)。ファイルを直接編集するか、dredge edit などを使用するか、好きな方法で編集でき、すべての変更は自動的に暗号化ストアに同期されます。
自動修復: シンボリックリンクの名前を変更した場合(例:mv ~/.ssh/config ~/.ssh/config-backup)、dredgeは新しいパスを自動的に検出して追跡します。削除されたシンボリックリンクはセッション開始時にクリーンアップされます。
新しいマシンでの操作:
git clone [email protected]:you/vault.git ~/.local/share/dredge
dredge link <id> ~/.ssh/config
# 同じSSH設定、同じキー、すべてのマシンでGitが更新を追跡
これこそが、dredgeを作った本当の理由です。私のSSH設定はすべてのマシンで同一ですが、dotfilesの中にただ放り込むわけにはいきませんでした。
全コマンド一覧
| コマンド | 説明 | 例 |
|---|---|---|
add / a / new / + | アイテムを追加(-cフラグがない場合はエディタが開く) | dredge add "OpenAI Key" -c "sk-..." -t keys |
search / s | アイテムを検索 | dredge search aws key |
list / ls | 全アイテムを一覧表示 | dredge ls |
view / v | アイテムを表示 | dredge view xKP または dredge 1 |
cat / c | 生のコンテンツを出力(パイプ用) | dredge cat xKP | bash |
edit / e | アイテムを編集 | dredge edit xKP |
rm | 削除(ゴミ箱に移動) | dredge rm 1 2 3 |
undo | 最後に削除したアイテムを復元 | dredge undo |
link / ln | アイテムをシステムパスにリンク | dredge link xKP ~/.ssh/config |
unlink | リンクを削除 | dredge unlink xKP |
mv / rename | アイテムIDの名前変更 | dredge mv xKP abc |
export | ファイルアイテムをディスクにエクスポート | dredge export xKP ./output/ |
copy / cp | アイテムの内容をクリップボードにコピー | dredge copy xKP |
lock | ボールトをロック(セッションキーをクリア) | dredge lock |
init / use | ボールトを初期化またはアクティブ化 | dredge init ~/vaults/work |
push / pull / sync | Git同期(変更を自動コミット) | dredge sync |
drop | コミットされていない変更を破棄 | dredge drop xKP または dredge drop --all |
status | 保留中の変更を表示 | dredge status |
passwd | ボールトのパスワードを変更 | dredge passwd |
update | 最新バージョンに更新 | dredge update |
Git同期(wlad031 作)
Git同期はプレーンな git を使用し、任意のリモートで動作します(GitHub/GitLab/Gitea など)。
dredge init はオプションのGitリモートを受け入れます。省略した場合、dredgeはローカルのみのGitリポジトリを初期化します(リモートなし)。
自動コミット動作: push、pull、sync は、リモートと調整する前に、同期されていない未コミットの変更をコミットで保存します。リモートバージョンを優先するためにローカルの変更を破棄する必要がある場合は、dredge drop を使用してください。
自動履歴保持: push と sync は dredge.toml のポリシーを適用します。アイテムのメタデータとバイナリストレージは、アイテムごとのバージョン数と暗号化バイト数の独立した制限を持ち、history.deleted.retain_for は削除されたIDが復元可能な期間を制御します。ポリシーが何も削除しない場合、Dredgeは通常のプッシュを行います。圧縮が必要な場合、Dredgeは置換履歴を検証し、正確な force-with-lease を使用します。同時のリモート更新は上書きされずに安全に停止します。pull は圧縮や force-push を行いません。
保持された履歴は dredge history、dredge history deleted、または dredge history <id> で確認できます。削除された暗号化アイテムは dredge history restore <id> で復元できます。パスワード変更は履歴ブロブを再暗号化しないため、古いパスワードで作成された復元バージョンは現在のパスワードでは復号化できない可能性があります。
受け入れられるリモート形式:
# GitHubの省略記法(https://github.com/<owner>/<repo>.git に展開)
dredge init owner/repo
# HTTPS
dredge init https://github.com/owner/repo.git
dredge init https://gitlab.com/group/repo.git
# SSH(scp形式)
dredge init [email protected]:owner/repo.git
dredge init [email protected]:group/repo.git
# SSH URL
dredge init ssh://[email protected]/owner/repo.git
# ローカルパスリモート(上級者向け)
dredge init /srv/git/dredge-vault.git
- Dredgeはリモートリポジトリを自動で作成しません。
originが設定されていない場合、dredge push/pull/syncはガイダンス付きでエラーになります。- すでにGitリモートが設定されている場合、
dredge initは上書きしません。
なぜ作ったか
「私は収集家だ — 多くのものの:芸術と工芸品、宝物と真実…そして欲望の周辺に位置する好奇心。」 — コレクター
何かを保存したものの、必要なときにどこにあるかわからないという精神的負荷。
重要なもの(そして重要でないものも、単に全般的なもの)があちこちに散らばっていることにうんざりしていました。6年前に作ったメールアカウントにアクセスしなければならなかったのは、理由もなく緊急にアクセスする必要があったランダムなサービスにリンクされていたからです…とにかく、多くのツールにはそれぞれの特徴があるものの、情報を保存するという非常に重要な側面で重複していることに気づき、その特定の重複に特化し、各ツールが最も得意とすることを任せるツールを作りました。
私は怠け者なので、ただ動作し、私の心を読み、エントリの追加やナレッジベースからの取得に労力を要さないものが欲しかったのです。
かつて jrnl をダウンロードし、そのアイデアはとても気に入りましたが、奇妙なパラメータのせいで実行には満足できませんでした。アイテムの分離がなく、すべてにマッチする検索でした。Dredgeは私が実際に欲しかったものです。(つまり、ほぼ個人的なツールです)
コントリビューター
dredgeに貢献してくれた皆さん、本当にありがとう:
by Luar