TL;DR

  • Inkline은 Gmail에서 보낸 이메일에 Touch ID 승인과 Secure Enclave 서명을 연결한 영수증을 첨부하며, 수신자는 계정 없이 브라우저에서 오프라인 검증 가능함.
  • Chrome 확장 프로그램, Swift 헬퍼 앱, Node 공증 서버가 역할을 나누며, 공증 서버는 이메일 본문이 아닌 콘텐츠 해시만 확인함.
  • 영수증은 등록된 키가 Touch ID 확인 후 해당 내용을 승인했다는 사실을 증명하지만, 문구를 작성한 사람까지 증명하지는 않음.
  • v0.2.1(macOS 27+)부터 하드웨어 인증이 필수이며, Apple App Attest 인증이 없는 등록과 공동 서명을 공증 서버가 거부함.
  • inkline-verify는 의존성 없이 오프라인 영수증 검증을 제공하며, 메일 발송은 검증 체인에 실패해도 차단되지 않음.

Inkline

  • 영수증 검증 서비스인 Inkline은 Gmail에서 보내기를 누르면 정확한 메시지를 보여주고 Touch ID 확인을 요청함.
  • 이메일에는 영수증으로 연결되는 작은 푸터가 붙으며, 영수증은 사람이 해당 문구를 확인하고 승인했다는 암호학적 증거임.
  • 누구나 계정 없이 브라우저에서 오프라인으로 영수증을 검증할 수 있음.
  • 검증 체인에서 문제가 발생해도 메일 발송은 차단되지 않으며, 스탬프 없이 발송되고 실패 이유는 콘솔에 기록됨.

작동 방식

  • Gmail에서 보내기를 누르면 다음 절차가 진행됨.
  • Chrome 확장 프로그램이 클릭을 가로채 메시지를 추출하고, 네이티브 메시징(native messaging)으로 헬퍼 앱에 전달함. 확장 프로그램은 신뢰하지 않는 연결 통로로 설계되어 텍스트만 전달하며 영수증을 위조할 수 없음.
  • 신뢰 기반인 Swift 네이티브 헬퍼 앱이 이메일을 직접 정규화하고 확인 창에 표시함. Touch ID 센서를 한 번 터치하면 칩 밖으로 나가지 않는 Secure Enclave 키가 콘텐츠에 서명하며, 실시간 지문 일치 후에만 서명이 이뤄짐.
  • 헬퍼 앱에는 전달받은 해시에 서명하는 코드 경로가 없음.
  • 의존성이 없는 소형 Node 공증 서버가 서명과 새 일회용 논스(nonce)를 확인한 뒤 공동 서명하고 영수증을 발급함. 서버는 이메일을 보지 않고 콘텐츠 해시만 처리함.
  • 확장 프로그램은 발신 이메일에 영수증 링크가 포함된 작은 푸터를 추가함. 수신자는 검증 페이지를 열어 메시지를 붙여 넣으며, 검증은 전적으로 브라우저에서 이뤄지고 공증 서버에 접속하지 않음.

저장소 구성

  • extension/: Manifest V3 기반 Chrome 확장 프로그램
  • helper/: 신뢰 기반인 Swift 헬퍼 앱
  • notary/: Node 공증 서버
  • verifier/: 정적 검증 페이지, verify.inklineverify.com에서 제공
  • shared/ 및 canonical/: 정규화 명세, 공유 코덱, 골든 테스트 벡터로 구성되며 JavaScript와 Swift 구현이 바이트 단위로 일치하도록 유지함.

영수증이 증명하는 내용 — 정확한 범위

  • 유효한 영수증은 등록된 키가 Touch ID 확인 후 해당 콘텐츠에 서명했고 공증 서버가 이를 증명했다는 사실을 입증함.
  • 영수증은 문구를 누가 작성했는지는 증명하지 않고, 사람이 해당 문구를 승인했다는 사실만 증명함.

현재 제공 내용

  • 현재 제공 버전은 v0.2.1(macOS 27+)이며, 하드웨어 인증 등급이 필수임.
  • Apple App Attest는 등록 시 서명 키가 서명된 헬퍼 앱 내의 진짜 Secure Enclave에서 생성됐음을 인증함.
  • 모든 스탬프에는 발송마다 새로 생성되는 인증이 포함되며, 공증 서버는 공동 서명 전에 이를 검증함. 인증이 없으면 등록과 공동 서명이 거부됨.
  • 이전 릴리스에서 발급된 영수증도 계속 검증 가능하며, 검증 페이지는 모든 스탬프에 하드웨어 인증이 적용되기 전에 발급된 영수증임을 표시함.
  • 호스팅 공증 서버와 승인 API는 별도의 서비스 저장소에서 운영되며, 여기의 notary/는 영수증 프로토콜의 참조 구현임.

자체 코드에서 영수증 검증

  • npm install inkline-verify로 패키지를 설치할 수 있음.
  • packages/inkline-verify는 공증 서버와 공개 검증 페이지가 사용하는 동일한 shared/ 모듈을 제공함.
  • 승인 영수증에는 verify(receipt), 이메일 스탬프에는 verify(receipt, { email })을 사용함.
  • 오프라인에서 의존성 없이 검증 가능함.

설치

  • 자세한 내용은 INSTALL.md에 있음.
  • 간단한 설치 절차는 Releases에서 서명된 헬퍼를 다운로드하고 ./install.sh를 실행한 다음, chrome://extensions에서 extension/을 불러오는 방식임.

개발 및 테스트

  • npm test는 공증 서버와 공유 암호화 모듈을 골든 벡터로 테스트함.
  • cd helper && swift test는 동일한 벡터를 사용해 Swift 정규화를 테스트함.
  • node notary/src/main.js는 :8787에서 로컬 공증 서버를 실행함.

라이선스

  • MIT 라이선스이며 자세한 내용은 LICENSE에 있음.