Hwip Docs
CLI & SDK

암호화

푸시가 이 머신에서 어떻게 봉인되는지, 평문으로 남는 것은 무엇인지, 보호가 어디서 끝나는지.

종단간 암호화는 항상 켜져 있다. 스위치도, 설정할 것도 없다. 푸시의 제목·본문·URL, 질문, 답, 다른 컴퓨터로 보내는 메시지는 어느 요금제에서든 암호문으로 이 호스트를 떠난다.

예외는 채널 구독자에게 보내는 푸시(hwip notify --channel)와 서버가 직접 쓰는 상태 알림이다. 채널 푸시는 구독자가 봉인된 푸시를 열 수 없어서 서버가 평문으로 뿌린다(CLI가 보낼 때마다 stderr로 그렇다고 알려준다). 서버가 읽을 수 있는 것의 전체 목록은 서버가 보는 것에 있다.

동작 방식

푸시 본문과 긴 본문 첨부는 AES-256-GCM으로 암호화된다. 이 호스트는 첫 사용 때 만든 자기 ECDH P-256 키쌍을 ~/.hwip/device-keys.json에 둔다. 개인 키는 머신을 떠나지 않는다. 백엔드는 공개 키만 저장하고 개인 키 업로드는 거부한다.

푸시는 한 번 암호화되고, 그 AES 키는 계정이 키와 함께 등록한 기기마다 따로 그 기기의 공개 키에 대한 ECDH로 감싼다. 제목과 URL도 본문과 함께 암호문 안으로 들어간다.

라이브 경로(터미널 프레임, 키 입력, 화면 스냅샷, diff, 세션 기록)는 기기 키 하나씩에 봉인하는 두 번째 봉투를 쓴다. ECDH P-256, 메시지 목적별 HKDF-SHA256, AES-256-GCM이다. 암호화에 실패한 프레임은 평문으로 보내지 않고 버린다.

앱이 없으면 푸시도 없다

푸시는 읽을 앱이 있어야 한다. 계정에 로그인한 iPhone 앱이 없으면 hwip notify와 hwip ask는 아무것도 보내지 않고 그렇다고 알려준다(NO_APP_DEVICE). 앱은 로그인돼 있지만 이번 전송을 봉인하지 못하면 푸시는 E2E_REQUIRED와 사유와 함께 거부된다. 평문 대체 경로는 없다.

고정된 키와 키 변경

Hwip 앱의 컴퓨터 화면: 신뢰한 키 지문과 Forget this key 버튼.

계정의 모든 기기는 처음 보이는 순간 ~/.hwip/trusted-devices.json에 고정(pin)된다. 기기가 나중에 다른 키를 등록하면(앱 재설치 같은 경우) 고정이 교체되고, stderr에 한 줄이 나가며, 변경이 ~/.hwip/key-changes.json에 기록되어 사람이 다음 hwip verify·hwip trust·hwip test에서 보게 된다. 키가 바뀌었다고 거부하지는 않는다.

키를 눈으로 확인하려면 지문을 비교한다:

hwip trust                 # 이 컴퓨터의 지문과 고정된 기기들
hwip trust <deviceId>      # 계정이 지금 그 기기에 올려둔 키를 고정
hwip trust --reset         # 모든 고정 해제. 각 기기는 다시 보일 때 고정된다

앱은 각 기기 페이지에 같은 키에 대해 같은 지문을 보여준다.

질문 맥락

봉인된 질문에는 그 질문을 던진 세션이 바꾼 내용(HEAD 기준 git diff, 새 파일 포함, .gitignore된 파일은 제외)과 터미널의 마지막 60줄이 함께 간다. 둘 다 먼저 비밀처럼 보이는 문자열을 가리고, 같은 기기들에 봉인하며, 질문을 열 때 앱이 가져간다. 가리기는 최선 노력이다. 규칙이 모르는 형태의 비밀은 그대로 남는다.

프로젝트 하나 또는 전체에서 끌 수 있다:

hwip ask-context off             # 이 프로젝트
hwip ask-context off --global    # 모든 프로젝트
hwip ask-context on              # 둘 다 되돌림

HWIP_ASK_CONTEXT=0은 한 번의 실행에서만 끈다.

위협 모델

수동적 백엔드, 즉 유출된 스냅샷이나 테이블을 읽는 운영자에 대해서는 저장된 암호문과 감싼 키가 쓸모없으므로 푸시 내용이 비공개로 남는다. 알아둘 한계가 넷 있다:

  • 능동적인 악의적 운영자는 막지 못한다. 수신자 공개 키는 같은 서버의 GET /devices에서 오며 서명이 없다. 자기 키를 실은 기기 레코드를 끼워 넣거나 알고 있는 기기에 다른 키를 올려두는 백엔드는 메시지 키를 자기 몫으로 감싸게 만들어 그 뒤에 보내는 내용을 읽는다. 고정은 교체되고 한 줄이 알려줄 뿐, 막지는 않는다. hwip trust로 지문을 비교하는 것이 확인 방법이다.
  • 전방 비밀성이 없다. 한 발신자·기기 쌍의 ECDH 비밀은 고정이라, 어느 한쪽 개인 키가 털리면 그 쌍에 감싼 과거 푸시가 전부 열린다.
  • senderPublicKey는 서명되지 않는다. 바꿔치기하면 푸시를 복호화할 수 없게 된다. 이 방향은 유출 대신 닫히는 쪽으로 실패한다.
  • 한 컴퓨터의 OS 사용자 둘은 기기 id를 공유한다. 각자 자기 키를 쓰므로 기기 목록에서 서로의 키를 덮어쓰고, 앱은 그때마다 키 변경 경고를 띄운다.

컴퓨터 간 메시지

hwip agent send는 항상 대상 컴퓨터에 메시지를 봉인하고, 대상의 listener는 폰이 보낸 명령과 같은 검사를 거쳐 타이핑한다. 페어링은 필요 없다. 두 컴퓨터가 같은 계정에 있고 대상에서 hwip listener(또는 hwip cc)가 돌고 있으면 된다. 봉인할 수 없는 메시지는 보내지 않는다.

listener

hwip listener는 자기 앞으로 온 암호화된 파일 푸시와, 키가 검증되는 기기에서 온 봉인된 agent.command 푸시를 연다. 그 밖의 암호화된 푸시는 무시한다. listener가 키를 가진 기기를 한 번 보고 나면 평문 명령과 평문 화면 요청을 거부한다. 원격 조종을 본다.

이 페이지에서