미국 운전면허 PDF417 바코드의 ECDSA 서명에서 공개키 복구, 리포니아만 6개월 만에 검증 문서 공개
- 미국 운전면허증 뒷면 AAMVA PDF417 바코드의 주별 Z 서브파일(버지니아 ZV, 뉴욕 ZN, 캘리포니아 ZC)에 ECDSA P-256 서명이 들어 있고, 서명과 서명 대상 메시지만 있으면 공개키를 수학적으로 복구할 수 있음
- 캘리포니아의 ZC 서브파일은 CBOR-LD로 압축한 W3C Verifiable Credential이고 ecdsa-xi-2023 cryptosuite로 서명하며, did:web:credentials.dmv.ca.gov가 내려주는 P-256 공개키 #vm-vcb-1로 검증하는데 유효/폐기 테스트 바코드가 든 오픈소스 검증기도 함께 공개했음
- 리포니아 DMV는 2025년 10월 1일 새 면허 디자인을 발표하며 디지털 서명 추가를 알렸지만, 서명 대상 필드와 공개키 위치를 설명한 문서를 낸 건 약 6개월 뒤인 다음 해 4월이었음
- Canadian Bank Note는 뉴욕, 버지니아, 노스캐롤라이나, 사우스캐라이나, 위스콘신 5개 주 면허에 서명을 넣어 뒀고, 그동안 외부에서 검증할 방법은 없었음
- CBN의 서명은 Ascii85로 감싼 DER SEQUENCE 안의 256비트 정수 r, s 쌍이고 카드에 따라 70, 71, 72바이트로 길이가 달라지는데, 이런 길이 변동 자체가 ECDSA 서명이라는 증거이며 여러 서명이 공유하는 후보 키가 실제 공개키임
Hacker News opinions
HN 들어오면 내가 알고 싶었는지도 몰랐던 걸 배우게 되더라.
근데 지금 제출 글 부제목이 '서명 키 복구'로 되어 있는데, 글엔 공개키를 알아낸다는 얘기에 없음. 공개키로는 남들 눈에 유효한 서명을 만들 수 없잖아. 내가 뭘 놓친 거임?
아니, 부제목이 틀렸음. ECDSA 서명 방식 때문에 공개키가 복구되는 거임.
제출자가 글쓴이보다 이쪽을 잘 모르는 듯. 글 위에 recovered public keys라고 적혀 있음.
지에 응용하면 재밌겠다. 일련번호에 서명 붙인 QR을 넣으면 위조가 훨씬 어려워질 텐데.
알려진 일련번호와 서명을 그대로 복사하면 끝임. 정적 데이터라 고치긴 어려워도 베끼기는 쉬움. 여권처럼 NFC 챌린지-응답을 써야 함.
사진 자체가 바코드에 서명 있지 않으면 거의 의미 없음. 진짜 ID 몇백 장만 유출돼도 머리색, 눈, 피부색, 키, 무게 조합이 다 커버됨.
그렇게 유출된 ID용 인증서 폐기 목록 같은 게 생기려나.
여권은 이 문제를 몇십 년 전에 NFC로 해결했음. 칩에 사진을 넣고, 검증자가 준 난수를 이 서명하게 함. 요즘 암호은 거의 공짜고 스마트폰이면 다 읽음.
PDF417 1100바이트 정도밖에 안 들어가서 사진은 무리임. 여권 칩은 32KB는 기본으로 넣음.
예전에 가짜 ID 썼는데 스캔이 된다는 게 엄청 큰 장점이었음. 편의점은 다 스캔하고 나이도 안 봄.
난 진짜 ID 받으면 참조 바를 혀서 스너가 못 읽게 함. 생일은 손으로 치면 되지.
공개키를 공개하는 게 나쁘다고 보는 사람이 있다는 게 이해 안 됨. 그게 공개키의 목적인데.
글쓴이가 나쁘다고 한 적 없음. 'These are public keys, which are meant to be published'라고 써 있음.
키 비유 자체가 별로임. 공개키는 주소, 개인키는 비밀번호로 부르는 게 낫지. 주소로 보내고, 주소를 알면 서명도 확인하고.
서명 전에 필드를 0으로 채워서 서명하고 그 위에 실제 서명을 덮어다니. 암호 계층이 서명 대상 구조를 알면 안 되는데 이건 좀 별로임.
반론하자면 실제 암호 알고리즘은 내용 인지 패딩이 어느 정도 필요함. 대안으로 든 비트필드 방식이 오히려 더 망치기 쉬움.
이 글엔 Verifiable Credential 라이브러리 만든 사람에게 공을 돌려야 함. 벤더가 아니라.
영국이 하려는 것보다 씬 나은 설계임. 정부가 만든 것도 아닌 제3자 앱을 깔아야 하는지 모르겠음.