
dredge-cargo v0.10.3
Зашифрованное CLI-хранилище для заметок, конфигов, ключей и файлов. Ищи, не организуй.
Это НЕ менеджер паролей. НЕ приложение для заметок. И уж точно НЕ реестр таксономического происхождения аберрантных бентосных глубоководных образцов. Но первые два оно делает лучше любого из них. Шучу (не совсем).
Ищите, не организуйте. Заметки, конфиги, ключи, секреты — за пять секунд из вашего терминала.
"Не беспокойте меня обычным хламом." — Рыбак
go install github.com/DeprecatedLuar/dredge-cargo/cmd/dredge@latest
Крутые функции, которых вы ещё не видели
- Зашифрованное хранилище — Клонируйте репозиторий и получите абсолютно непонятную абракадабру. Вы даже не сможете понять, что находится в репозитории без пароля. (Я использовал AES-256-GCM + Argon2id)
- Мгновенный поиск — Я сделал собственный алгоритм нечёткого поиска, потому что я ленив и хочу получить нужную запись среди 300 других за миллисекунды, не задумываясь.
- Храните что угодно — заметки, скрипты, dot-файлы, изображения, zip-архивы. Если это файл и он существует, его можно сохранить в dredge.
- Привязка живых файлов — Отличная функция: создайте симлинк любого элемента на системный путь, чтобы читать и редактировать напрямую или через dredge. Любые изменения синхронизируются в обе стороны с репозиторием.
- Поддержка Git — приватный репозиторий, который принадлежит вам. Просто
git cloneего — и ваши данные у вас. - Сессионный пароль — Один запрос на сессию терминала. После этого вы можете использовать dredge без пароля до закрытия терминала. (прочитайте раздел безопасности, чтобы лучше понять)
- Корзина + отмена — удалённые элементы попадают в корзину. Так что просто используйте
dredge undo, если случайно что-то удалили.
Что хранить в dredge?
Я не осужу вас. Надоедливые API-ключи, которые показываются только один раз, SSH-конфиги, AI-промпты, пароли, буквально shell-скрипты, которые можно выполнить, шаблоны писем?, dot-файлы (странно, но будет работать нормально), 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
Другие способы установки
Установка вручную
- Загрузите бинарный файл для вашей ОС из релизов
- Сделайте исполняемым:
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 # бинарные файлы тоже :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
Как это работает
"Не могу представить, что там в глубине." — Смотритель маяка
Итак, резюмирую:
Я остановился на двух основных крипто-технологиях: Argon2id и, конечно, AES-256, а именно вариант GCM.
Argon2id, потому что это РЕКОМЕНДАЦИЯ из RFC 9106 и победитель PHC 2015 года. Вот и всё. Вариант GCM AES, потому что он делает все зашифрованные данные невозможными для подделки из-за создания отпечатков. Тоже всё.
Пока что я храню всё в виде зашифрованных файлов в ~/.local/share/dredge/. Этот каталог также является git-репозиторием (по крайней мере пока). Так что dredge push коммитит и отправляет всё для резервного копирования. Каждый элемент представляет собой отдельный зашифрованный блоб со случайным трёхсимвольным ID. Я решил, что никакие имена файлов не должны быть раскрыты, поэтому даже если кто-то увидит ваши файлы, они понятия не будут иметь, на что смотрят.
Конвейер шифрования
Ваш пароль
+ 16-байтовая случайная соль ← соль хранится в .dredge-key
→ Argon2id (64 MB памяти · 4 потока · 1 итерация)
→ 32-байтовый мастер-ключ (соль + пароль = настоящий ключ)
Мастер-ключ + содержимое элемента (TOML: заголовок, теги, содержимое)
→ AES-256-GCM с новым случайным 12-байтовым nonce для каждой операции
→ [12B nonce][шифротекст + 16B тег аутентификации]
→ записывается на диск как items/xKP (случайный ID, без расширения)
Таким образом, всё ваше хранилище использует один и тот же производный ключ (это означает, что если вы потеряете ключ, вы потеряете данные, пожалуйста, не теряйте ключ). Каждый элемент использует один и тот же ключ, каждый со своим случайным nonce. Если зашифровать одно и то же содержимое дважды, получатся совершенно разные шифротексты.
Где что находится
~/.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 (доступ только root).
Все последующие команды dredge в ТОМ ЖЕ терминале используют кэшированный ключ. Это значит, что вас больше не будут запрашивать пароль. Каждый терминал получает свой изолированный каталог на основе PID родительского процесса. Ключ исчезает с диска после закрытия терминала.
Более глубокие технические детали
Вывод ключа — Argon2id: Рекомендованные параметры RFC 9106 (64 MB памяти, 4 потока, 1 итерация). Соль в .dredge-key не является секретом, она лишь гарантирует, что подбор вашего пароля перебором будет очень дорогим, даже имея файл. Ваш пароль — это то, что вас защищает, так что вы знаете, что делать.
Шифр — AES-256-GCM: По сути, создаёт отпечатки для каждого шифрования. Вы получаете и конфиденциальность, и целостность. При попытке подделки шифротекста дешифрование не даст мусор — оно просто провалится и запросит помощи.
Проверка пароля: .dredge-key содержит строку dredge-vault-v1, зашифрованную вашим мастер-ключом. При каждой новой сессии dredge расшифровывает её, чтобы проверить, правильный ли пароль. Если вы не получите dredge-vault-v1, пароль неверный, и операция завершится неудачей примерно за 100 мс, а не обнаружит неверный пароль в середине операции.
Что кэшируется: Файл сессии хранит производный 32-байтовый ключ (пароль + соль), а не сам пароль (я не настолько глуп). Таким образом, даже если кто-то прочитает .key во время активной сессии, он не сможет восстановить из него ваш пароль.
Безопасность
"Лучше вернуться с маленьким уловом, чем не вернуться вообще." — Рыбак
Модель угроз (я сделал этот раздел с помощью ИИ, но он верен)
Кто-то клонирует ваш приватный git-репозиторий:
Они получат зашифрованные блобы и .dredge-key. Соль не секретна — её цель сделать предвычисленные атаки непрактичными. Без вашего пароля элементы — непрозрачные бинарные данные. Argon2id делает офлайн-перебор дорогим. Используйте надёжный пароль.
Кто-то имеет доступ к вашей запущенной сессии:
Производный ключ живёт в $XDG_RUNTIME_DIR/dredge/$PPID/.key на время сессии терминала. Каждый терминал получает свой изолированный каталог — закройте терминал, ключ исчез. Этот путь доступен только пользователю (режим 700) и находится в памяти. Атакующий с доступом к вашему каталогу сессии может расшифровать ваше хранилище. Относитесь к нему как к любым чувствительным учётным данным в вашем домашнем каталоге. Если кто-то имеет root-доступ к вашей машине, ваш ключ dredge — наименьшая из ваших проблем.
Кто-то имеет физический доступ к вашему выключенному устройству:
Элементы на диске зашифрованы. Ключ сессии находится в хранилище на базе RAM и не переживает перезагрузку. Привязанные элементы (.spawned/) — открытый текст на диске — см. ниже.
Где существует открытый текст
| Расположение | Когда | Время жизни |
|---|---|---|
| Только в RAM | Каждый просмотр, поиск или редактирование | Освобождается при завершении команды |
$XDG_RUNTIME_DIR/dredge/$PPID/edit-*.txt | Только во время dredge edit | Удаляется после закрытия редактора |
~/.local/share/dredge/.spawned/<id> | После dredge link | До выполнения dredge unlink |
Файл .spawned — это единственный постоянный открытый текст на диске, и он существует только потому, что вы явно привязали элемент к системному пути. Всё остальное существует только в памяти.
Оговорки
--password/DREDGE_PASSWORD: Передача пароля в командной строке раскрывает его в истории оболочки и выводеps. Переменные окружения могут просочиться в дочерние процессы. Избегайте этого в общих средах.--vault/DREDGE_VAULT: Переопределение активного хранилища для одной команды без сохранения изменения. Полезно для скриптов, работающих с несколькими хранилищами.- Привязанные элементы: Открытый текст привязанного элемента находится по цели симлинка (например,
~/.ssh/config). Он не отслеживается git, но находится на диске в открытом виде.
Команда link
Привяжите любой сохранённый элемент к пути в вашей файловой системе:
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-конфиг одинаков на каждой машине, но я не мог просто засунуть его в свои dot-файлы.
Все команды
| Команда | Описание | Пример |
|---|---|---|
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-remote. Если его опустить, dredge инициализирует локальный git-репозиторий (без удалённого).
Поведение авто-коммита: push, pull и sync сохраняют синхронизированные незакоммиченные изменения в коммите перед согласованием с удалённым репозиторием. Если вам нужно отменить локальные изменения, чтобы приоритизировать версию с удалённого репозитория, используйте dredge drop.
Автоматическое сохранение истории: push и sync применяют политику из dredge.toml. Метаданные элементов и бинарное хранилище имеют независимые лимиты на количество версий на элемент и зашифрованные байты, в то время как history.deleted.retain_for контролирует, как долго удалённые ID остаются восстанавливаемыми. Если политика ничего не удаляет, Dredge выполняет обычный push. Если требуется уплотнение, Dredge проверяет историю замещения и использует точный force-with-lease; одновременное обновление с удалённого репозитория безопасно останавливается, а не перезаписывается. pull никогда не уплотняет и не force-пушит.
Просмотрите сохранённую историю с помощью dredge history, dredge history deleted или dredge history <id>. Восстановите удалённый зашифрованный элемент с помощью dredge history restore <id>. Смена пароля не перешифровывает исторические блобы, поэтому восстановленные версии, созданные под старым паролем, могут не расшифроваться текущим паролем.
Допустимые форматы удалённого репозитория:
# Сокращение GitHub (разворачивается в https://github.com/<владелец>/<репозиторий>.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-remote,
dredge initне будет его перезаписывать.
Зачем
"Я коллекционер — многих вещей: искусства и артефактов, сокровищ и истин… и диковинок, занимающих периферию желания." — Коллекционер
Умственное напряжение от сохранения чего-то и незнания, где это найти, когда оно понадобится.
Меня бесило, что важные вещи (и неважные тоже, просто вещи в целом) разбросаны повсюду; мне приходилось заходить в почтовый ящик, созданный 6 лет назад, потому что он был привязан к какому-то случайному сервису, к которому мне срочно понадобился доступ безо всякой причины… В любом случае, я понял, что многие инструменты, несмотря на свои фишки, пересекаются в очень важном аспекте — хранении информации, поэтому я сделал инструмент, специализирующийся именно на этом пересечении, и оставляет инструменты делать то, что они умеют лучше всего.
Я ленив, поэтому хотел что-то, что просто работает и читает мои мысли, не требует усилий для добавления записи или извлечения её из базы знаний.
Я как-то скачал jrnl, и мне очень понравилась идея, но не понравилась реализация из-за странных параметров; у него буквально не было разделения на элементы, а поиск находил всё. Dredge — это то, что я на самом деле хотел. (так что да, по сути личный инструмент)
Участники
Большое спасибо ребятам, которые внесли вклад в dredge:
от Luar