키 관리
Anon은 민감한 키 자료를 디스크에 평문으로 저장하지 않고, 각 작업이 필요한 최소 키 권한만 사용하도록 설계된 계층형 키 구조를 사용합니다.
키 계층
Device authenticator (passkey / password)
│
▼
Root secret ← PRF / Argon2id; session memory
│
HKDF derivation
/ \
/ \
Railgun IDB CryptoKey
key (AES-GCM)
PRF 키(루트)
패스키로 인증하면 인증 장치가 의사 난수 함수(PRF)를 제공하여 패스키 자격 증명에 연결된 결정적 비밀값을 출력합니다. 저장과 동기화 방식은 인증 장치에 따라 달라집니다. 이 PRF 출력이 키 계층의 루트입니다. 디스크에 기록되지 않으며 세션 동안 메모리에만 존재합니다.
비밀번호로 인증하면 Argon2id가 비밀번호와 저장된 솔트로부터 같은 역할을 하는 루트 비밀값을 도출합니다.
HKDF 도출
Anon은 PRF 키에서 HKDF(HMAC 기반 키 도출 함수)로 두 개의 키를 도출합니다.
- Railgun 키(
anon:railgun:full:v1) — 잔액 복호화(조회)와 zk-SNARK 증명 생성(지출)에 모두 사용하는 단일 키입니다. 인증 시 로드되어 세션 동안 메모리에 유지됩니다. - IDB CryptoKey(
anon:secrets:indexeddb:v1) — IndexedDB의 민감한 데이터인 니모닉과 계정 데이터를 암호화·복호화하는 AES-256-GCM 키입니다. 인증 시 로드되어 세션 동안 메모리에 유지됩니다.
KeyVault(메모리 캐시)
KeyVault는 세션의 활성 키를 보관하는 메모리 내 싱글턴입니다. 다음 특성이 있습니다.
- 인증에 성공하면 키가 채워집니다
- 디스크에 기록되지 않습니다
- 로그아웃하거나 창을 닫으면 자동으로 제거됩니다
- 지출 키가 필요하지 않은 백그라운드 페이지의 접근 패턴으로부터 보호됩니다
데이터 저장 위치
| 데이터 | 저장 위치 | 암호화 |
|---|---|---|
| 암호화된 니모닉 | IndexedDB | IDB CryptoKey를 사용하는 AES-GCM |
| IDB CryptoKey | Chrome 저장소 | PRF에서 도출한 키로 암호화 |
| 공개 주소 | Chrome 저장소 | 평문: 본래 공개되는 정보 |
| Railgun 키 | 메모리만 | 영구 저장하지 않음 |
| IDB CryptoKey(복호화됨) | 메모리만 | 영구 저장하지 않음 |
| PRF 키 | 메모리만 | 영구 저장하지 않음 |
복구
기기에 접근할 수 없게 되면 12단어 니모닉 문구로 지갑을 복원할 수 있습니다. 니모닉은 모든 키를 다시 생성합니다. 오프라인의 안전한 장소에 보관하세요.