현장 노트

# 뒤의 키: 공유 링크가 서버를 배제하는 방법

공유된 대화는 저희 서버에 저장되지만, 저희는 그것을 열 수 없습니다. 그 작동 방식, 비밀번호가 하는 역할, 그리고 링크로는 보호할 수 없는 것.

공유한다는 것은 대개 링크를 저장하는 쪽에 내 글을 넘겨준다는 뜻입니다. Undergrove의 공유 링크는 서버가 읽을 수 없는 사본을 보관하도록 만들어졌습니다. 그 방법은 오래되고 단순하지만, 알아 둘 만한 한계가 있습니다.

# 뒤의 부분

대화를 공유하면 브라우저는 새로운 무작위 키를 만들고, 사본을 AES-GCM으로 암호화한 뒤 암호문만 업로드합니다. 키는 링크의 # 뒤에 들어갑니다. 브라우저는 페이지를 불러올 때 주소의 이 부분을 서버로 보내지 않으므로, 키는 링크를 받은 사람에게는 전달되지만 저희에게는 전달되지 않습니다.

저희는 암호문을 1일, 7일 또는 30일 동안 보관합니다. 저희가 보는 것은 그 ID와 크기, 그리고 생성 및 열람 시각입니다. 사본을 여는 페이지는 암호문을 가져와 주소 표시줄에서 키를 읽고, 탭 안에서 복호화합니다.

비밀번호도 함께

링크에 비밀번호를 요구하게 할 수도 있습니다. 그러면 사본을 여는 키는 두 가지 모두에서 만들어집니다. 비밀번호는 PBKDF2-SHA256으로 600,000회 반복해 스트레칭한 뒤 HKDF를 통해 링크의 키와 결합됩니다. 링크나 비밀번호 하나만으로는 열 수 없으며, 비밀번호는 이미 받아 둔 사본을 상대로 탭 안에서 확인되므로 저희는 비밀번호를 볼 수 없습니다.

한 번만 열기와 열람 시각

링크를 한 번만 열리게 할 수도 있습니다. 서버는 처음 읽힐 때 사본을 삭제하고 열린 시각만 남기므로, 링크는 처음부터 없었던 것이 아니라 이미 사용되었다고 알려 줄 수 있습니다. 페이지는 암호문을 가져오기 전에 확인을 요청하므로, 채팅 앱의 링크 미리보기 때문에 링크가 소진되지 않습니다.

링크가 특정 날짜에 열리게 할 수도 있습니다. 그때까지 서버는 암호문을 넘겨주지 않습니다. 이것은 암호 기술이 아니라 서버가 약속을 지키는 것일 뿐입니다. 사본은 이미 저장되어 있고, 그 키도 이미 링크 안에 있습니다.

링크로는 보호할 수 없는 것

  • 링크 전체를 가진 사람은 누구나 사본을 읽을 수 있습니다. 링크를 대화 그 자체처럼 다루세요.
  • 채팅 앱과 이메일 앱은 보낸 메시지를 링크와 # 뒷부분까지 모두 포함해 저장합니다.
  • 사본을 복호화하는 페이지는 저희가 제공하는 코드입니다. /verify는 그 코드를 빌드의 공개 매니페스트와 비교합니다.

개인정보 페이지에는 각 링크에 대해 저장되는 내용이, 위협 모델에는 누가 무엇을 볼 수 있는지가 정리되어 있습니다.

다른 현장 노트

  1. 증명이 입증하는 것과 입증하지 못하는 것

    브라우저는 한 단어라도 보내기 전에 Tinfoil의 엔클레이브를 확인합니다. 그 확인으로 무엇이 입증되고, 어디에서 멈추며, 아직 브라우저에서 확인할 수 없는 것은 무엇인지 살펴봅니다.

  2. 읽지 못하는 릴레이에도 여전히 보이는 것

    저희 릴레이는 열 수 없는 암호문을 전달합니다. 그렇다고 아무것도 보지 않는 것은 아닙니다. 릴레이가 실제로 보는 것의 목록과 그 이유.