뉴스 · Blackbear의 보안
공유해도 봉인은 그대로
대부분의 제품은 공유하는 순간 슬그머니 암호화를 포기해요. 두 사람이 같은 문서를 써야 하는 순간, 서버에서 복호화하고 그걸 기능이라고 부르는 게 가장 쉬운 길이거든요. 우리는 쉬운 길을 택하지 않았어요.
Blackbear는 우리에게 키를 넘기지 않고도 파일, 폴더, 실시간 편집을 공유해요. 그 아래에서 어떻게 작동하는지 설명할게요.
권한은 서명된 문서예요
모든 공유 공간은 권한 스키마를 따라요. 구성원 한 사람 한 사람과 그들이 할 수 있는 일을 적어 둔 작은 정책 문서예요. 이 문서는 소유자의 기기가 서명해요. 새 버전은 항상 이전 버전의 해시에 연결되고, 세대 번호를 하나씩 올려요.
내 기기가 어떤 공간의 한 버전을 본 뒤에는 그보다 오래된 버전을 거부해요. 버전 8이 버전 7로 바뀌는 일은 없어요. 완전히 새 기기는 비교할 기록이 없으니 처음 받은 것에서 시작하고, 그 첫 확인 이후로는 래칫이 유지돼요. 서버는 정책을 배포할 뿐이에요. 정책을 작성할 수도, 기록이 있는 기기에서 되감을 수도 없어요.
하나의 키를 사람마다 봉인해요
공유 공간에는 콘텐츠 키가 있어요. 아무도 이 키를 드러난 채로 주고받지 않아요. 키는 구성원 각자의 공개 키로 하나씩 봉인되고, 서버는 그 봉인된 사본들을 저장해요. 서버는 사본을 모두 가지고 있어도 그중 어느 것도 열 수 없어요.
위조할 수 없는 역할
읽기, 댓글, 편집, 관리, 소유. 모든 역할 부여에는 그 역할을 부여한 사람의 서명이 달려 있어요. 데이터베이스 행을 고친다고 누군가의 권한이 올라가지는 않아요.
내보내면 키가 바뀌어요
누군가를 내보내면 세대가 넘어가요. 콘텐츠 키가 교체되고 남은 모든 사람에게 다시 봉인돼요. 그 순간부터 공유되는 모든 것은 떠난 사람에게 보이지 않아요.
솔직하게 나머지 절반도 말해야겠죠. 이미 동기화한 것은 이미 그 사람의 것이에요. 어떤 프로토콜도 기기 안으로 들어가 데이터를 돌려받을 수는 없어요. 자기 철회 기능이 그걸 해 준다고 말하는 사람은 무언가를 팔려는 거예요.
실시간 편집은 중계되는 암호문이에요
실시간 협업은 암호화된 CRDT 업데이트를 서버를 통해 스트리밍해요. 서버는 구성원 지문, 키 세대, 크기를 봐요. 스트림의 순서를 정하고 구성원들에게 나눠 보내요. 함께 편집하는 사람의 커서 아래에 나타나는 글자는 우리 쪽이 아니라 그 사람의 기기에서 열려요.
작성자는 서명으로 남아요
내 동작은 내 프로필 키로 서명돼요. Pax는 Pax 자신의 키로 서명해요. 내가 쓴 것과 내 어시스턴트가 쓴 것은 따로 설정하지 않아도 암호학적으로 구분돼요.
내 사람들은 돈을 내지 않아요
공유한다고 상대방이 돈을 낼 필요는 없어요. 콘텐츠 봉인은 무료든 유료든 모든 구성원에게 똑같이 작동해요. 그리고 무료 게스트도 유료 호스트가 후원하는 공간에 온전히 참여해요. 다른 모든 사람과 같은 접근 규칙 아래에서 메시지를 보내고, 함께 편집하고, 통화에 참여해요. 그 밑에 깔린 규칙은 간단해요. 중계되는 모든 연결에는 호스트가 적어도 한 명 있어야 하고, 서버가 그걸 증명할 수 없으면 거부해요.
이것으로 시리즈를 마쳤어요. 내 콘텐츠는 이동하기 전에 내 기기에서 봉인돼요. 우리 서버는 메타데이터에 대한 짧고 공개된 목록만 가지고 있어요. 그리고 공유는 봉인을 깨뜨리는 대신 넓혀 가요.
더 읽을거리
- Public-key cryptography — 한 사람에게 봉인하는 원리
- Conflict-free replicated data types — 실시간 공동 편집을 떠받치는 수학
- Yjs — 우리 실시간 편집의 바탕이 된 CRDT 엔진
- Hash chains — 권한을 몰래 되감을 수 없는 이유
- Digital signatures — 역할을 위조할 수 없는 이유
Blackbear의 보안
- 1. 우리가 읽을 수 없는 것
- 2. 우리 서버가 볼 수 있는 것
- 3. 공유해도 봉인은 그대로 (지금 읽는 글)