해킹 소식은 이제 낯설지 않습니다. 회사 하나가 뚫리면 이름과 전화번호, 주고받은 메시지가 통째로 팔려 나갑니다. 크립톤 제로(Krypton Ø)는 우리 서버도 언젠가 뚫릴 수 있다고 보고 만들었습니다. 그래서 물어야 할 것은 뚫릴 수 있느냐가 아니라, 뚫렸을 때 무엇을 가져갈 수 있느냐입니다.
손에 넣는 것
- 잠긴 글과 봉투. 글과 답, 사진, 동영상, 링크 미리보기는 글쓴이의 폰에서 잠긴 채 서버에 옵니다. 글마다 그 열쇠는 읽는 사람마다 따로 봉인한 봉투에 담기고, 그 봉투는 읽는 사람의 폰만 열 수 있습니다.
- 공개 열쇠. 원래 공개하는 열쇠입니다. 나에게 보낼 것을 봉인하는 데 쓰일 뿐, 무엇을 여는 데는 쓰지 못합니다.
- 잠긴 되찾기 백업. 백업을 여는 비밀은 둘로 나뉘어 있습니다. 반은 우리 서버에, 나머지 반은 종이에 적은 18개 단어에 있습니다. 서버를 통째로 가져가도 단어 없이는 열리지 않습니다.
- 계정과 이어지지 않은 우편함. 글과 대화, 카드는 계정과 이어지지 않은 우편함으로 오가고, 우편함 번호는 30일마다 바뀝니다.
없는 것
- 전화번호와 이메일. 처음부터 받지 않습니다. 가입도 로그인도 내 폰의 열쇠만으로 합니다.
- 내 이름. 암호화된 프로필 카드 안에 봉인된 채 오갑니다.
- 내 Fam 목록. 내 폰에 있습니다. 서버에는 열 수 없는 암호화 백업만 있고, 크립톤 제로는 연락처를 올리지 않습니다.
- 누가 누구를 데려왔는지, 누가 누구에게 무엇을 보냈는지. 서버에 남기지 않습니다.
- 누가 누구에게 전화했는지. 전화는 두 사람만 쓰는 우편함으로 봉인된 채 울리고, 서버는 그것을 기록하지 않습니다.
- 개인 열쇠. 내 폰의 보안 코어, 아이폰 키체인이나 안드로이드 키스토어에 있고 폰 밖으로 나가지 않습니다.
나중에 열면 되지 않나요
훔친 암호문을 쌓아 두었다가 언젠가 양자 컴퓨터로 열려는 공격자도 있습니다. 읽는 사람에게 열쇠를 건네는 바깥 층은 X25519 와 ML-KEM-768 을 함께 써서 봉인하므로, 둘 다 깨야 합니다. 글 자체는 256비트 XChaCha20-Poly1305 로 잠그는데, 이것은 양자 컴퓨터 앞에서도 충분한 세기를 지킵니다. 게다가 글과 답마다 열쇠가 따로라, 하나를 깨도 다음 것은 열리지 않습니다.
서버를 조작하면 되지 않나요
서버를 손에 넣은 사람이 자기 열쇠를 슬쩍 끼워 넣어, 새 글이 자기에게 봉인되게 하려 할 수 있습니다. 공개 열쇠는 계정의 서명에 묶여 있어서, 바꿔 끼운 열쇠는 서명 확인에서 걸리고 폰이 받아들이지 않습니다. 통화도 같습니다. 두 폰이 연결 정보에 각자 서명하고, 중간에 무엇이든 바뀌면 통화가 이어지지 않습니다.
되찾기로 계정을 빼앗는 것도 조용히는 안 됩니다. 되찾기에는 18개 단어와 PIN 이 모두 있어야 하고, 48시간을 기다려야 끝납니다. 그동안 원래 폰에 그 요청이 보이고, 거기서 취소할 수 있습니다.
그래도 알 수 있는 것
이 부분도 밝혀 두는 게 맞다고 생각합니다.
- 요청이 서버에 닿는 순간 서버는 IP 주소와 시각을 봅니다. 그 순간에는 우편함과 계정이 이어질 수 있고, 서버를 실시간으로 지켜보거나 접속 기록을 읽는 사람도 그것을 볼 수 있습니다.
- 크립톤 제로 팀이 직접 들인 사람은, 팀이 들였다는 사실을 서버가 갖고 있습니다.
- 통화 소리는 WebRTC 표준으로 두 폰 사이에서 암호화되는데, 이것은 아직 양자 내성이 아닙니다.
어떤 서버도 지키지 못하는 것
우리 서버가 뚫려도 글은 잠긴 채입니다. 다만 폰에서 일어나는 일은 서버 설계로 막을 수 없습니다. 잠금을 푼 폰을 남에게 건넨 경우, 이미 악성 앱에 넘어간 폰, 화면을 겨눈 다른 카메라가 그렇습니다.
그래서 크립톤 제로 서버가 언젠가 뚫린다 해도, 거기 있는 것은 암호문이 대부분이고 그 밖의 것은 거의 없습니다. 그림과 함께 본 전체 설계는 보안 설계에 있습니다.