암호화 모델
.rkvey v5 형식: 프리앰블, 컴파트먼트별 AEAD, append-only 커밋, 비밀 분리.
.rkvey v5 형식(Rust Key Vault)은 HKDF 및 AEAD 모범 사례에 따른 다층 암호화 모델을 구현합니다. 개념적 흐름: 마스터 비밀번호 → 마스터 키 → 하위 키 → 암호화된 컴파트먼트.
각 항목은 컴파트먼트(메타데이터, 보호된 비밀, 매니페스트, 첨부 파일)로 나뉘며 각각 고유 HKDF 키를 갖습니다. 한 컴파트먼트를 복호화해도 다른 것은 드러나지 않습니다.
QubKey v5 암호화 모델
마스터 비밀번호
사용자 입력(UTF-8) - 일반 텍스트로 저장되지 않음
아르곤2id
소금
16바이트(프리앰블)
메모리
64MB
반복
3
병행
4
산출
256비트
마스터 키
256비트 · 볼트 루트 키
HKDF-SHA256
정보="hdr"
헤더 키
header_key
HKDF-SHA256
정보="idx"
인덱스 키
index_key
HKDF-SHA256
정보="구획"
구획 열쇠
구획_열쇠
항목당(v5)
HKDF(master_key, salt=file|entry_id, info=kind|sub_id) → 구획 키
암호화된 구획
키 유도
유도는 마스터 비밀번호를 사용 가능한 암호 키로 변환합니다. Argon2id는 의도적으로 시간과 메모리를 소비(약 500ms, 64MB)하여 오프라인 무차별 대입을 억제합니다. v5에서는 각 항목 컴파트먼트가 HKDF로 고유 키를 받습니다.
사용자 입력 → 마스터 비밀번호(UTF-8)
Argon2id → 무작위 Salt가 있는 master_key(256비트)
HKDF-SHA256 → B-Tree용 index_key
HKDF-SHA256 → 항목 및 컴파트먼트 유형별 compartment_key(메타데이터, 비밀, 첨부…)
| 매개변수 | 값 | 설명 | 기본값 |
|---|---|---|---|
Variant | Argon2id | OWASP 권장 하이브리드 — GPU 및 사이드 채널 공격 저항 | — |
Memory | 64 MB | 유도당 메모리 — 병렬 공격 하드웨어 비용 증가 | 65536 KB |
Iterations | 3 | 메모리 반복 — 보안/성능(약 500ms) | — |
Parallelism | 4 | 병렬 스레드 | — |
Output | 32 bytes | 유도 키 길이 | — |
Salt | 16 bytes | 프리앰블의 무작위 Salt | — |
AEAD 암호화
AES-256-GCM(기본)
- 최신 CPU의 AES-NI 하드웨어 지원
- Nonce: 12바이트, 인증 태그: 16바이트
- 이론적 한도: 키당 약 64GB 암호화 데이터
선택 시기: AES 하드웨어 가속이 있는 머신, 일상 사용.
대부분 플랫폼에서 최적 성능을 위한 기본 암호.
XChaCha20-Poly1305(선택)
- 확장 Nonce: 24바이트(충돌 확률 무시 가능)
- 하드웨어 의존 없음 — 모든 CPU에서 일정한 성능
- 장기 보관 금고에 권장
선택 시기: 아카이브 금고, AES-NI 없는 머신, ChaCha20 선호.
고급 금고 설정에서 활성화 가능.
파일 구조
구조 설명(v5):
preamble— 매직 바이트, 형식 버전, Argon2id Saltheader.enc— 암호화된 금고 메타데이터(이름, 생성일, 설정)index/— 비밀 복호화 없이 O(log n) 검색 가능한 암호화 B-Treecompartments/— 유형별 AEAD 블록: 메타데이터, 보호 비밀, 매니페스트, 첨부append/— 커밋 영역: 새 컴파트먼트 + 인덱스 스냅샷 + 검증된 푸터
무결성 및 커밋
복원력
Append-only 커밋은 중단 시 무결성을 보장합니다:
- 새 컴파트먼트를 파일 끝에 추가
- 암호화 인덱스 스냅샷 기록
- 디스크 동기화(fsync)
- 검증된 푸터로 커밋 완료(일관성 지점)
실제 시나리오: 항목 편집 중 정전으로 쓰기가 중단된 경우. 재시작 시 QubKey는 최신 유효 푸터를 찾습니다 — 데이터 손실이나 조용한 손상 없음. 오래된 공간이 과다하면 주기적 압축으로 깨끗한 파일을 작성합니다.
컴파트먼트별 격리
HKDF-SHA256으로 각 컴파트먼트는 마스터 키에서 항목 ID와 컴파트먼트 유형으로 유도된 고유 compartment_key를 갖습니다. 실무적 의미:
- 항목 표시 시 메타데이터만 복호화; 비밀은 명시적 표시까지 마스킹
- 첨부는 개별 로드(다운로드/미리보기), 금고 해제 시 로드하지 않음
- B-Tree 인덱스는 데이터와 별도
index_key사용 - 비밀 변경 시 변경되지 않은 첨부 파일을 반드시 재작성하지 않음
이 격리는 .rkvey v5 형식에 네이티브로 구현되어 있습니다.
암호 프리미티브
| 프리미티브 | 용도 | 라이브러리 |
|---|---|---|
| Argon2id | 비밀번호 → 키 유도 | argon2 (RustCrypto) |
| HKDF-SHA256 | 키 → 하위 키 유도 | hkdf (RustCrypto) |
| AES-256-GCM | AEAD 암호화 | aes-gcm (RustCrypto) |
| XChaCha20-Poly1305 | AEAD 암호화(대안) | chacha20poly1305 (RustCrypto) |
| HMAC-SHA256 | 파일 무결성 | hmac (RustCrypto) |
| CSPRNG | 난수 생성 | getrandom (OS) |