← SECURITY 목록으로
2026-09-10

물리적 보안키 - YUBIKEY (4)

아이폰에서 언제든지 APY(age-plugin-yubikey 방식 암호화)를 만들고 싶어서, 웹앱으로 만들어봤다. 복호화는 맥북이나 리눅스에서 해야 한다.

(3)편에서 막혔던 지점을 다시 봤다

지난 편에서 "PIV/스마트카드 통신 API 자체가 브라우저에 없다"는 걸 확인하고 결국 제작을 보류했었다. 근데 그건 어디까지나 복호화 얘기였다. 다시 짚어보니, 암호화는 완전히 다른 문제였다 — 유비키 공개키(age1yubikey1...) 문자열 하나만 있으면, 하드웨어와 아무런 통신 없이도 그냥 순수 수학으로 끝나는 작업이었다. 유비키를 그 자리에 꽂을 필요가 아예 없다는 뜻이다.

그래서 방향을 바꿨다. "아이폰에서 언제 어디서나 암호화" + "복호화는 실제 유비키가 꽂힌 맥북/리눅스에서만" — 이 조합이면 (3)편에서 부딪혔던 iOS 제약을 아예 우회할 수 있었다.

vault2 허브에 두 번째 버튼으로 넣었다

기존 vault(QR+age) 허브 페이지 옆에, 유비키 공개키로 암호화하는 페이지를 새 버튼으로 추가했다. 파일 하나, 공개키 하나 넣으면 끝.

vault2 허브의 YubiKey + AGE 버튼 YubiKey + AGE 암호화 페이지

근데 이게 표준 방식이 아니었다

age1yubikey1... 공개키는 age 스펙에 원래 있는 X25519 방식이 아니라, age-plugin-yubikey라는 플러그인이 자기만의 방식(piv-p256 스탠자)으로 만든 거였다. 그래서 기존에 쓰던 age 암호화 라이브러리로는 애초에 처리가 안 됐다.

결국 이 플러그인의 실제 공개 소스 코드(str4d/age-plugin-yubikey, age-core)를 직접 읽어서 — P-256 타원곡선 ECDH, HKDF 솔트·라벨 값, ChaCha20-Poly1305 래핑, 태그 계산법까지 — 그대로 재현해서 구현했다. 라이브러리의 진짜 Encrypter/Decrypter로 왕복 테스트를 돌려서 로직이 맞는지 먼저 확인했고, 그다음 진짜 유비키를 꽂고 실제 복호화까지 성공시켰다. 기억에 의존한 짐작이 아니라 소스코드를 직접 대조해서 만든 거라 안심이 된다.

사용법까지 페이지 안에 넣었다

처음엔 그냥 암호화 버튼 하나만 있었는데, 막상 쓰려니 맥북에서 뭘 어떻게 설치하고 어떤 명령어를 쳐야 하는지 매번 찾아봐야 했다. 그래서 "사용법 HOW TO" 버튼을 눌러 펼쳐지는 매뉴얼을 페이지 안에 통째로 넣었다 — 설치, 공개키 확인, 슬롯 번호 확인, identity 파일 만들기, 맥북에서 복호화까지 단계별로, 명령어마다 복사 버튼까지 달아서.

페이지 안에 펼쳐지는 사용법 매뉴얼

이제 언제 어디서나 암호화를 해서 저장할 수 있다니, 산뜻하구만.

조회 0
댓글 0