
노트, 설정, 키, 파일을 위한 암호화된 CLI 금고. 검색하세요, 정리하지 마세요.
이것은 비밀번호 관리자가 아닙니다. 노트 앱도 아닙니다. 그리고 확실히 심해 저서성 비정상 표본 분류학적 기원 기록소도 아닙니다. 하지만 처음 두 가지는 어느 것보다 잘합니다. 농담입니다 (사실 아닙니다).
찾으세요, 정리하지 마세요. 노트, 설정, 키, 비밀 — 터미널에서 5초면 됩니다.
"흔한 잡동사니로 나를 괴롭히지 마라." — 생선 장수
go install github.com/DeprecatedLuar/dredge-cargo/cmd/dredge@latest
git clone만 하면 데이터를 가질 수 있습니다.dredge undo를 사용하세요.판단하지 않겠습니다. 한 번만 표시되는 성가신 API 키, SSH 설정, AI 프롬프트, 비밀번호, 실행 가능한 쉘 스크립트 자체, 이메일 템플릿?, 도트파일 (이상하지만 잘 작동합니다), zip 아카이브, 영화 목록, 빠른 접근을 위한 URL 목록...
심지어 일본어로 된 《체인소 맨》 2장의 합법적인 복사본도 있습니다. (제가 그 특정 것을 가지고 있을 수도 있고 아닐 수도 있습니다)
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-*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의 권장 사항이자 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바이트 논스 사용
→ [12B 논스][암호문 + 16B 인증 태그]
→ items/xKP로 디스크에 기록 (랜덤 ID, 확장자 없음)
따라서 전체 금고는 동일한 파생 키를 공유합니다 (키를 잃으면 데이터를 잃는다는 뜻입니다. 키를 잃지 마세요). 모든 항목은 동일한 키를 사용하며, 각각 고유한 랜덤 논스를 가집니다. 동일한 내용을 두 번 암호화하면 완전히 다른 암호문이 생성됩니다.
~/.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를 읽더라도 비밀번호를 복구할 수 없습니다.
보안"적은 양의 물고기를 잡아도 아예 돌아오지 않는 것보다는 낫다." — 생선 장수
누군가 당신의 개인 git 리포지토리를 클론한 경우:
암호화된 블롭과 .dredge-key를 얻게 됩니다. 솔트는 비밀이 아닙니다. 그 목적은 사전 계산 공격을 실용적이지 않게 만드는 것입니다. 비밀번호가 없으면 항목은 불투명한 이진 데이터입니다. Argon2id는 오프라인 무차별 대입을 비싸게 만듭니다. 강력한 비밀번호를 사용하세요.
누군가 실행 중인 세션에 접근할 수 있는 경우:
파생된 키는 해당 터미널 세션 기간 동안 $XDG_RUNTIME_DIR/dredge/$PPID/.key에 존재합니다. 각 터미널은 자체 격리된 디렉토리를 얻습니다. 터미널을 닫으면 키는 사라집니다. 해당 경로는 사용자 범위(mode 700)이며 RAM 기반입니다. 세션 디렉토리에 읽기 접근 권한이 있는 공격자는 금고를 복호화할 수 있습니다. 홈 디렉토리의 민감한 자격 증명처럼 취급하세요. 누군가 당신의 기기에서 루트 권한을 가지고 있다면, dredge 키는 가장 작은 걱정거리입니다.
누군가 오프라인 기기에 물리적으로 접근할 수 있는 경우:
디스크의 항목은 암호화되어 있습니다. 세션 키는 RAM 기반 저장소에 있으며 재부팅 후에는 유지되지 않습니다. 링크된 항목(.spawned/)은 디스크에 평문으로 존재합니다. 아래 참조.
spawned 파일은 디스크에 지속되는 유일한 평문이며, 명시적으로 항목을 시스템 경로에 링크했기 때문에만 존재합니다. 다른 모든 것은 메모리 내에서만 존재합니다.
--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 설정은 모든 기기에서 동일하지만, 단순히 도트파일에 넣을 수 없었습니다.
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
origin이 설정되지 않은 경우, dredge push/pull/sync는 안내와 함께 오류를 발생시킵니다.dredge init은 덮어쓰지 않습니다.
"나는 수집가입니다 — 여러 가지 것들을 수집합니다; 예술과 유물, 보물과 진실... 그리고 욕망의 주변에 존재하는 호기심들." — 수집가
무언가를 저장해 놓고 필요할 때 어디서 찾을지 모르는 정신적 부담 때문입니다.
중요한 것들(그리고 중요하지 않은 것들도, 그냥 일반적인 것들)이 여기저기 흩어져 있는 것에 화가 났습니다. 6년 전에 만든 이메일 계정에 접속해야 했는데, 긴급히 접근해야 하는 무작위 서비스와 연결되어 있었기 때문입니다... 어쨌든, 많은 도구들이 각자의 장점이 있음에도 불구하고 정보 저장이라는 매우 중요한 측면에서 모두 겹친다는 것을 깨달았습니다. 그래서 그 특정 겹침을 전문으로 하는 도구를 만들었고, 각 도구가 가장 잘하는 일을 하도록 남겨두었습니다.
저는 게을러서 그냥 작동하고 내 마음을 읽어주며, 항목을 추가하거나 지식 베이스에서 검색하는 데 노력이 들지 않는 것을 원했습니다.
한 번 jrnl을 다운로드했는데 아이디어는 정말 마음에 들었지만, 이상한 매개변수와 항목 분리가 없고 모든 것을 매치하는 검색 때문에 실행 방식이 싫었습니다. Dredge는 제가 실제로 원했던 것입니다. (그래서, 네, 거의 개인적인 도구입니다)
dredge에 기여해주신 분들께 큰 감사를 드립니다:
by Luar
| 위치 | 시기 | 수명 |
|---|
| RAM 전용 | 모든 보기, 검색 또는 편집 | 명령어 종료 시 해제 |
$XDG_RUNTIME_DIR/dredge/$PPID/edit-*.txt | dredge edit 중에만 | 에디터 닫힌 후 삭제 |
~/.local/share/dredge/.spawned/<id> | dredge link 후 | dredge unlink 실행 시까지 |
| 명령어 | 설명 | 예제 |
|---|
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 |