무엇을 암호화
모든 JSONL line 이 append 전에 Fernet (AES-128-CBC + HMAC-SHA256) 로 암호화. passphrase 가 local OS keystore 에 (security find-generic-password -s {service-name} -a {account-name}). passphrase 의 SHA-256 이 Fernet key 결정적으로 derive — passphrase 아는 어느 Mac 이든 어느 암호화 JSONL 든 read. Keychain entry 없는 peer Mac 은 암호화 file 을 blob-backup endpoint 로 opaquely 저장.
가림막 — peace of mind
threat model 정직하게 명명: 가림막. Pathfinder preview, shoulder surf, 예상 못 한 곳으로 가는 fleet sync 같은 우발적 노출은 막아. 하지만 filesystem과 Keychain에 접근할 수 있는 단호한 attacker까지 막진 못해. 그런 척도 안 해.
plain + 암호화 공존
read path 가 첫 byte 로 auto-detect: { 가 plain JSON, g 가 Fernet base64. 한 JSONL 이 마이그레이션 동안/후 둘 다 carry 가능, read 가 어느 쪽이든 처리.
가림막이라는 이름 덕분에 운영 결정도 선명해져. backup Mac은 key 없이 blob을 보관할 수 있고, 복원할 때만 승인된 Keychain에서 passphrase를 받아. 반대로 이미 로그인된 계정과 Keychain을 장악한 공격자까지 이 층 하나로 막겠다고 말하진 않아. 그 위협은 account, device, access control 문제야.
암호화 migration은 형식보다 복구가 먼저야. plain line과 Fernet line이 섞인 중간 상태를 reader가 받아들이면 한 번에 전부 다시 쓰다가 파일을 잃는 위험을 피할 수 있어. writer는 새 형식을 쓰고 reader는 전환 기간의 둘을 읽어. 완전히 옮겼다는 검증 뒤에만 오래된 경로를 걷어 내.
사실 peace of mind는 약한 목표가 아니야. 대화 archive가 Finder preview에 우연히 펼쳐지지 않는 것만으로도 실제 생활의 불안을 줄여. 다만 그 이득의 이름을 정확히 붙여야 다음 사람이 이 가림막을 금고로 착각하지 않아.