계정 없는 페어링: Peering이 신뢰할 대상을 정하는 방법
대부분의 원격 데스크톱 도구는 두 기기가 같은 사람의 것인지 회사가 판단하도록 가입을 요구합니다. Peering은 회사를 건너뛰고 대신 여러분에게 여섯 자리 숫자로 묻습니다.
모든 기기는 그 자체로 하나의 신원입니다
Peering은 Mac이나 iPhone에서 처음 실행될 때 P-256 키 쌍을 만들고, 개인 키를 그 기기의 Keychain에 보관합니다. 이 키가 그 기기의 영구적인 신원입니다. 사용자 이름도, 비밀번호도, 사본을 가진 서버도 없습니다. 앱이 시작될 때마다 그 키로 새 자체 서명 인증서에 서명하며, 다른 기기는 인증서가 아니라 키를 고정해 둡니다.
자체 서명 인증서는 그 자체로는 아무것도 증명하지 못하기 때문에 이 점이 중요합니다. 인증서는 “이 키가 이 인증서를 만들었다”고 말할 뿐, “이것이 거실에 있는 그 Mac이다”라고 말하지 않습니다. 키를 실제 기기와 연결해 주는 무언가가 필요하고, 그 무언가가 바로 여러분입니다.
여섯 자리 숫자
iPhone이 Mac을 처음 만나면 두 화면에 여섯 자리 코드가 표시됩니다. 두 코드가 일치하는지 확인하세요. 일치하면 각 기기가 상대의 키를 저장합니다. 일치하지 않으면 둘 사이에 누군가 있는 것이므로 거절합니다.
이 코드는 무작위가 아니며 비밀번호도 아닙니다. 핸드셰이크 전체의 짧은 해시입니다. 양쪽 기기 ID, 양쪽의 새 일회용 키, 양쪽의 일회용 난수, 그리고 Mac의 신원 키가 들어갑니다. 구체적으로는 이 필드들에 대한 SHA-256의 첫 4바이트를 십진수 여섯 자리로 줄인 값입니다. 공격자가 연결을 중계하면 Mac과 iPhone은 각각 서로 다른 기록을 보게 되고, 따라서 다른 숫자를 보게 됩니다.
먼저 약속하는 이유
여섯 자리 코드는 값이 백만 개뿐이라, 영리한 공격자는 양쪽이 우연히 같은 숫자를 보일 때까지 일회용 키를 계속 바꿔 볼 수 있습니다. 프로토콜은 커밋과 공개 단계로 이 문을 닫습니다.
- 각 쪽이 먼저 자신의 일회용 키와 난수의 해시를 보냅니다.
- 두 해시가 모두 도착한 뒤에야 양쪽이 실제 값을 공개합니다.
- 각 쪽이 공개된 값을 앞서 받은 해시와 대조합니다.
공격자는 아무것도 보기 전에 먼저 약속해야 하므로 값을 맞춰 조정할 수 없습니다. 남는 것은 눈먼 추측뿐이며, 시도마다 코드가 일치할 확률은 백만 분의 일이고, 실패한 시도는 눈으로 확인할 수 있는 불일치로 드러납니다.
QR 단축 경로
Mac의 QR 코드를 스캔하면 눈으로 비교할 것이 없습니다. QR에는 Mac 화면을 보고 있는 사람만 가질 수 있는 16바이트 비밀이 들어 있습니다. iPhone은 이것으로 증명값(핸드셰이크에 대한 HMAC)을 계산하고, Mac은 이를 페어링하는 사람이 Mac 앞에 실제로 있다는 증거로 받아들입니다. 이 증명이 없으면 Mac은 자신의 사용자에게 직접 승인을 요청합니다.
페어링 이후의 신뢰는 키 비교입니다
이후의 모든 연결은 양쪽이 자신의 키를 제시하는 TLS 1.3 세션입니다. iPhone은 Mac의 키를 메시지에 적힌 내용이 아니라 실제로 받은 인증서에서 가져오며, 저장된 키와 상수 시간으로 비교합니다. 키가 다르면 연결하지 않습니다. 처음 한 번 이후에는 사용자에게 아무것도 묻지 않습니다.
Mac이 “이미 당신을 알고 있다”고 주장하지만 iPhone에 그 Mac의 저장된 키가 없다면, iPhone은 거부합니다. 낯선 사람도 똑같이 쉽게 할 수 있는 말이므로 그 주장은 아무것도 증명하지 않습니다.
실제 따라 하는 방법은 페어링 가이드에 있습니다. 연결이 만들어진 뒤에 일어나는 일은 릴레이가 볼 수 있는 것을 보세요.
자주 묻는 질문
Peering을 쓰려면 계정이나 이메일 주소가 필요한가요?
아니요. 각 기기가 자신의 키를 만들어 자신의 Keychain에 저장합니다. 페어링은 양쪽 화면에서 비교하는 여섯 자리 코드로 이루어집니다.
여섯 자리 페어링 코드는 무엇을 막아 주나요?
iPhone과 Mac 사이에 끼어든 제3자를 막습니다. 코드는 핸드셰이크 전체에서 만들어지므로, 중간자가 있으면 두 화면의 코드가 달라져 불일치를 눈으로 확인할 수 있습니다.