보안 아키텍처
Rust/Tauri 스택, .rkvey v5 형식, 컴파트먼트, 지연 복호화, 위협 모델.
QubKey 보안은 계층형 아키텍처와 심층 방어(Defense in Depth) 원칙에 기반합니다. 파일 시스템, .rkvey v5 형식, 암호화, Rust 애플리케이션 코어가 저장부터 잠금 해제까지 모든 단계에서 비밀을 보호합니다.
각 계층은 상호 보완적인 보장을 제공합니다. 시스템 수준 보호(예: 디스크 암호화 없음)가 부족해도 애플리케이션과 암호화 계층은 계속 금고를 보호합니다. 형식 v5에서는 항목의 비밀이 표시하거나 복사할 때만 복호화됩니다 — 금고를 열거나 목록을 볼 때는 복호화되지 않습니다.
인터페이스(React + Tauri)
- 둥근 천장
- 폴더
- 찾다
- 발전기
- 일회용 코드
- 계기반
- 동조
- 공유
- 브라우저 확장
러스트 코어(QubKey Core)
- .rkvey v5 형식
- Argon2id 파생
- 인증된 암호화
- 검색 색인
- 안전한 커밋
- 메모리 지우기
- 충돌 복구
파일 시스템의 .rkvey v5 파일
- 전문
- 암호화된 헤더
- 암호화된 색인
- 비밀 수납공간
- 첨부파일
- 커밋 기록
보안 계층
잠금 해제 흐름
잠금 해제는 엄격한 파이프라인을 따릅니다: 마스터 비밀번호가 Rust 코어로 전달되고, Argon2id가 마스터 키를 유도하며, 하위 키가 헤더와 B-Tree 인덱스를 복호화합니다. 항목 컴파트먼트(비밀, 첨부)는 암호화된 채로 필요할 때만 읽습니다. 잠금 시 모든 키와 비밀이 메모리에서 삭제됩니다.
마스터 비밀번호 + 소금
.rkvey 서문(일반 텍스트)
- Rust 코어(Tauri IPC)에 입력 — WebView에 노출되지 않음
- 프리앰블에 저장된 무작위 솔트(16바이트)
아르곤2id
- 64MB RAM · 3 반복 · p=4 (기본값 `KdfParams`)
- GPU/ASIC 저항
- 플랫폼에 따라 ~250~500ms로 보정됨
마스터 키
256비트 · `KeyManager::derive_master_key`
하위 키 파생
HKDF-SHA256(마스터, 솔트=파일|항목, 정보=종류)
header_key
보안 헤더
index_key
B-트리 인덱스
구획_열쇠
구획
AEAD 암호 해독
- AES-256-GCM 또는 XChaCha20-Poly1305
- 헤더 · 색인 · 구획(요청 시)
잠금 해제 후 메모리
- 목록/보기: 메타데이터만
- 요청 시에만 암호 및 첨부 파일이 해독됩니다.
잠그다
- `KeyManager::clear_keys()` + 초기화
- 비밀이 지워지고 클립보드가 지워졌습니다.
위협 모델
QubKey는 로컬 비밀번호 관리자에서 가장 흔한 위협 시나리오를 위해 설계되었습니다. 표는 공격 벡터와 내장 대응(.rkvey v5 형식)을 설명합니다.
| 위협 | 벡터 | QubKey 대응 |
|---|---|---|
| 무단 파일 접근 | .rkvey 도난 또는 복사 | AEAD 암호화 + Argon2id 유도 |
| 네트워크 유출 | 클라우드 가로채기 / MITM | Local-first: QubKey는 비밀을 업로드하지 않음 |
| 데이터 손상 | 쓰기 중 충돌 | 검증된 append-only 커밋 + 시작 시 복구 |
| 금고 변조 | 수동 파일 수정 | 컴파트먼트별 AEAD 인증 + 체크섬 |
| 메모리 덤프(탐색 중) | 금고 해제, 목록 / 보기 | 표시할 때까지 비밀은 암호화 유지 |
| 약한 마스터 비밀번호 | 오프라인 무차별 대입 | 보정된 Argon2id(약 500ms) + 엔트로피 측정 |
| 비밀번호 재사용 | 다른 사이트 유출 | 보안 대시보드(로컬 탐지) |
| 클립보드 유출 | 비밀 복사 | 클립보드 타임아웃(30초) + 잠금 시 삭제 |
| 사이드 채널 공격 | 암호 작업 타이밍 | 상수 시간 구현(RustCrypto) |
모범 사례
이 모델은 QubKey가 아키텍처로 직접 다루는 위협을 다룹니다. 최적의 보호를 위해 QubKey와 시스템 모범 사례를 병행하세요: 디스크 암호화 활성화, 최신 OS, 강력한 마스터 비밀번호.
내장 보호
| 영역 | QubKey가 데이터를 보호하는 방법 |
|---|---|
| 저장 데이터(at rest) | AEAD(AES-256-GCM / XChaCha20), Argon2id 키, 컴파트먼트별 독립 키 |
| 금고 무결성 | 검증된 append-only 커밋, 체크섬, 원자적 쓰기 |
| 기밀성 | Zero-Knowledge: 비밀은 기기에서 암호화 유지 |
| 지연 복호화 | 목록·보기에 비밀 없음; 표시/복사는 필요 시에만 |
| 키 유도 | 보정된 Argon2id(약 500ms, 64MB)로 마스터 비밀번호 보호 |
| 애플리케이션 | 격리된 Rust 코어, Tauri IPC UI, 잠금 시 Zeroization |
| 브라우저 확장 | 로컬 Native Messaging — 확장은 마스터 비밀번호를 받지 않음 |
| 동기화 | 선택적 암호화 다중 기기 동기화(클라우드 또는 셀프 호스트), 또는 암호화 .rkvey 파일(클라우드, USB, NAS) |
신뢰 아키텍처
Zero-knowledge
QubKey는 여러 상호 보완적 수준에서 신뢰를 구성합니다:
-
접근은 사용자가 통제 — 마스터 비밀번호와 필요 시 복구 키가 금고 접근을 제어합니다. QubKey는 읽거나 재설정할 수 없습니다.
-
시스템 통합 — QubKey는 OS 보안을 활용합니다: 파일 권한, 디스크 암호화(FileVault, BitLocker, LUKS), 안전한 저장소(Keychain, Credential Manager), 프로세스 격리.
-
Rust / UI 분리 — 모든 암호화는 Rust 코어에서 컴파일 타임 메모리 안전과 함께 실행됩니다. React UI는 Tauri IPC로 통신; WebView는 마스터 비밀번호에 직접 접근할 수 없습니다.
-
신중한 메모리 처리(v5) — 잠금 해제 시 헤더와 인덱스만 복호화. 비밀과 첨부는 명시적 동작(표시, 복사, 다운로드)까지 암호화 유지. 잠금 시: Zeroization 및 클립보드 비우기.
-
브라우저 확장 — 로컬 Native Messaging; 확장은 마스터 비밀번호를 받지 않습니다.
보호 기능
자동 잠금
설정 가능한 비활성 시간 후 금고 잠금(기본: 5분). Zeroization 및 클립보드 삭제를 트리거합니다.
지연 복호화
항목 비밀은 표시하거나 복사할 때만 복호화됩니다. 목록과 보기에는 보호 필드가 표시되지 않습니다.
Zeroization
잠금 시 RAM에서 비밀 삭제(Rust zeroize 크레이트); 캐시 비우기, 필요 시에만 일시적 복호화.
클립보드 타임아웃
30초 후 클립보드 자동 삭제. 금고 설정에서 변경 가능.