내 앱
키를 보관하고, 보내는 모든 것을 암호화하고, 받는 것을 복호화합니다. 메시지 기록은 여기에만 있고 다른 어디에도 없습니다.
아는 것: 주고받는 모든 것. 원래 여러분의 것이니까요.
작동 방식
아키텍처와 프로토콜을 쉬운 말로 둘러봅니다. 각 장은 기본 개념으로 시작하며, 기술적인 내용은 ‘기술적인 세부 사항’을 펼쳐 보세요.
장 1
Crocodile은 역할을 나누어, 여러분의 말은 대화 상대만 볼 수 있고 낯선 사람이 운영하는 부분은 절대 볼 수 없게 합니다.
키를 보관하고, 보내는 모든 것을 암호화하고, 받는 것을 복호화합니다. 메시지 기록은 여기에만 있고 다른 어디에도 없습니다.
아는 것: 주고받는 모든 것. 원래 여러분의 것이니까요.
음성 방이나 스페이스마다 한 멤버의 앱이 선택되어 암호화된 트래픽을 나머지에게 전달합니다. 다른 사람과 똑같은 멤버일 뿐입니다.
아는 것: 멤버의 IP 주소와 누가 말하는지. 무슨 말을 하는지는 절대 모릅니다.
자원봉사자가 운영하는 전화 교환대입니다. 프로필과 스페이스를 저장하고, 누가 온라인인지 알려 주고, 호스트를 고릅니다. 하나의 네트워크로 연결되어 있습니다.
아는 것: 프로필, 멤버십, 누가 온라인인지. 무슨 말을 하는지는 절대 모릅니다.
새 앱이 어디서 시작할지 알 수 있게 해 주는 조정 서버의 전화번호부입니다. 사람에 대해서는 아무것도 모릅니다.
아는 것: 서버 목록만.
장 2
Crocodile을 설치하면 앱이 컴퓨터에서 32바이트의 무작위 비밀 값을 만듭니다. 여기서 두 개의 키가 나옵니다. 하나는 내가 게시하는 것에 서명하는 키, 다른 하나는 암호화된 메시지를 받는 키입니다. 사용자 ID는 서명 키의 지문입니다.
ID가 키에서 계산되므로 서버가 다른 키를 끼워 넣어 나를 사칭할 수 없습니다. 훔쳐 갈 비밀번호도, 고객 지원을 속여 받아 낼 재설정도 없습니다. 비밀 값은 복구 키로 한 번만 표시되며, 시스템 키체인으로 암호화되어 기기에 보관됩니다.
K7QF-M2XA-…-9PD4Ed25519X25519 + ML-KEM-768hash(🔑) → 4gq7…xk2m장 3
앱은 디렉터리에서 조정 서버 목록을 내려받아 각 서버의 응답 속도를 측정하고 가장 빠른 서버에 연결합니다. 두 번째 서버는 대기하고 있다가, 서버가 다운되면 앱이 즉시 전환합니다.
가장 먼저 서버가 자신의 신원을 증명하고, 앱과 서버가 그 연결에 쓸 키를 합의합니다. 그 이후에는 둘이 주고받는 메타데이터조차 HTTPS 위에서 한 번 더 암호화되므로, 집에 있는 서버에서도 안전하게 운영할 수 있습니다.
장 4
내 프로필, 내가 만든 스페이스, 그 초대, 멤버 목록은 모두 작성자가 서명한 작은 레코드입니다. 서버는 이를 저장하고 공유하며, 모든 서버와 모든 앱이 서명을 검증합니다. 서버는 레코드 전달을 거부할 수는 있어도, 수정하거나 지어낼 수는 없습니다.
조정 서버들은 서로를 찾아 네트워크를 이룹니다. 각 레코드는 해시로 선택된 여러 서버에 보관되고, 이 서버들이 변경 사항을 서로 복사하므로 어느 서버가 다운되어도 네트워크는 계속 작동합니다.
profile:4gq7…xk2m장 5
사람들이 음성 방에 들어오거나 스페이스를 열면, 조정 서버는 모두의 연결 상태(네트워크가 얼마나 열려 있는지, 업로드 속도, 컴퓨터, 배터리 사용 여부)를 보고 가장 적합한 멤버를 호스트로 고릅니다. 그다음으로 적합한 멤버가 백업입니다.
모두가 호스트의 앱에 연결하고, 호스트는 암호화된 오디오를 전달합니다. 부담을 줄이기 위해 각 청취자에게는 가장 큰 소리로 말하는 몇 명만 보냅니다. 오디오는 전달되는 동안 절대 평문으로 드러나지 않습니다. 호스트는 봉인된 패킷을 나를 뿐입니다.
호스트가 나가거나 연결이 끊기면 백업이 넘겨받고 모두가 백업에 다시 연결합니다. 대개는 아무도 눈치채지 못합니다.
모두가 호스트에 연결합니다.호스트가 나감: 백업이 넘겨받습니다.
장 6
모든 것은 기기를 떠나기 전에 암호화되고, 키는 대화에 참여한 사람만 가지고 있습니다. 메시지가 전달되는 동안 무슨 일이 일어나는지 살펴보세요.
앱은 메시지에 서명해 다른 사람이 그것이 나에게서 왔음을 증명할 수 있게 하고, 길이로 아무것도 드러나지 않도록 패딩하고, 대화 멤버만 가진 키로 암호화한 뒤, 그 자체로도 암호화된 연결로 보냅니다. 중간에 누가 있든 보이는 것은 표준 크기의 뒤죽박죽 바이트뿐입니다.
키는 검증된 기존 방식인 X25519와 새로운 양자 내성 표준 ML-KEM-768을 결합한 하이브리드 방식으로 교환됩니다. 공격자는 둘 다 깨야 합니다. 누군가 오늘 암호화된 트래픽을 기록해 두었다가 양자 컴퓨터로 해독할 날을 기다릴 수 있기 때문에 이 점이 중요합니다.
삭제됨이 메시지다음
각 멤버의 키는 래칫처럼 돌아갑니다. 메시지를 보낼 때마다 앞으로만 나아가는 체인의 다음 키로 바뀌고 이전 키는 삭제됩니다. 오늘 키를 훔친 사람도 어제의 메시지는 읽을 수 없습니다. 30분마다 그리고 누군가 나갈 때마다 모두가 새로운 무작위 키로 새 체인을 시작하므로, 훔친 키도 금세 쓸모없어집니다.
목소리는 1초에 약 50개의 작은 프레임으로 나뉘어, 마이크 바로 다음, 네트워크에 닿기 전에 암호화됩니다. 암호화할 수 없는 프레임은 버려지고 절대 평문으로 전송되지 않습니다. 음성은 고정 비트레이트를 사용하므로 패킷 크기로 무슨 말을 하는지 알 수 없습니다.
장 7
사무실이나 대학의 엄격한 방화벽처럼 일부 네트워크는 컴퓨터 간 직접 연결을 막습니다. 이럴 때 Crocodile이 알려 주며, 조정 서버가 트래픽을 중계하도록 허용할 수 있습니다.
릴레이는 이미 종단 간 암호화된 패킷을 전달할 뿐입니다. 크기와 타이밍은 보지만 내용은 보지 못합니다. 허용은 한 번에 1시간 동안 유지되며, 여전히 필요할 때만 갱신됩니다.
장 8
어떤 서버도 기록을 보관하지 않으므로, Crocodile 앱끼리 메시지를 주고받습니다. 오프라인인 사람에게 메시지를 보내면 이렇게 됩니다.
메시지가 앱의 보낼 편지함에 들어가고 작은 시계가 표시됩니다.
두 사람이 모두 온라인이 되는 순간, 앱이 친구의 기기용으로 봉인한 메시지를 전달합니다.
친구의 앱이 수신을 확인하면 시계가 사라집니다. 스페이스에서는 메시지를 놓친 멤버가 호스트와 백업에게서 따라잡습니다.
원하면 서버가 다이렉트 메시지를 최대 7일 동안, 기기별로 봉인해(서버는 읽을 수 없음) 보관하고, 전달되면 삭제합니다.
장 9
새 컴퓨터에 짧은 코드가 표시됩니다. 이미 로그인된 컴퓨터에 그 코드를 입력하고, 두 화면에 같은 6자리 보안 코드가 표시되는지 확인하세요. 일치하면 계정이 암호화되어 전송되고 새 기기를 쓸 수 있습니다.
보안 코드는 두 기기의 키를 모두 포함하므로, 누군가 중간에서 하나를 바꿔치기하려 하면 코드가 달라져 알아챌 수 있습니다.
코드 일치: 안전하게 연결할 수 있습니다
보안 관련 글에서 만나게 될 용어를 한두 문장으로 설명합니다.