S4Agora

이 앱을 이루는 것들.

대화를 지키는 암호부터 기기 안에서 도는 번역까지, S4Agora 를 움직이는 기술입니다.

암호

libsignalv0.93.11:1 대화의 X3DH · Double Ratchet · Sealed Sender. Signal 이 만들고 쓰는 그 구현체입니다.
OpenMLS0.8.1그룹 대화의 MLS(RFC 9420) 구현. 그룹·채널이 이 위에 있습니다.
Argon2idRFC 9106비밀번호 해시. 서버는 비밀번호를 원문으로 갖지 않습니다.
Apple CryptoKit기기 안 저장물의 대칭 암호화(AES-GCM · ChaCha20-Poly1305).
Secure Enclave마스터 키를 감싸는 열쇠가 기기 하드웨어에 묶여 있습니다. 저장된 파일을 통째로 복사해 가도 열리지 않습니다.
양자내성 키 교환PQXDH양자컴퓨터가 나온 뒤에도 오늘의 대화를 되돌려 읽지 못하도록, 키를 주고받을 때 양자내성 알고리즘을 함께 씁니다.
암호 방식 표기메시지마다 어떤 암호로 봉해졌는지 적혀 있습니다. 새 암호로 갈아타기 쉽고, 약한 암호로 끌어내리려는 시도는 막힙니다.

통화

RingRTC · WebRTCSignal 의 통화 스택. 단말끼리 직접 연결합니다.
CallKit · PushKit잠긴 화면에서도 전화처럼 받습니다. 푸시 본문에는 내용이 실리지 않습니다.
coturn직접 연결이 막히는 망에서만 중계합니다. 중계 구간도 암호문 그대로입니다.

번역 · 음성 · 시각

MADLAD-400candle저희가 만든 번역 모델입니다. 87개 언어를 기기 안에서 처리합니다. 모델 전체를 메모리에 올리지 않고 필요한 부분만 읽어 오래된 기기에서도 돌아갑니다.
Apple Translation운영체제가 이미 할 수 있는 22개 언어는 운영체제에 맡깁니다. 저희 모델은 나머지를 맡습니다.
ONNX Runtime신경망 음성 합성(TTS). 통역 결과를 소리로 냅니다.
Speech · Vision음성 인식과 사진 속 글자 읽기(OCR). 둘 다 기기 안에서 끝납니다.

여행

MapKit · Look Around경로와 거리 모습을 보여 줍니다. 제3자 지도 서비스를 쓰지 않아 정보가 닿는 곳이 늘지 않습니다.
WeatherKit날씨. 같은 이유로 운영체제 것만 씁니다.
위치 정보길찾기 · 날씨를 쓰는 동안에는 위치가 애플에 전달됩니다. 지도와 날씨는 기기 안에서 만들 수 없기 때문입니다. 쓰지 않으면 전달되지 않습니다.

앱

Swift 6데이터가 뒤엉켜 생기는 오류를 컴파일 단계에서 걸러냅니다. 실행 중에 터질 일이 그만큼 줄어듭니다.
인증서 고정앱이 미리 아는 인증서로만 서버에 연결합니다. 기기에 악성 인증서가 깔려도 통신 경로에 끼어들 수 없습니다.
ImageIO사진의 EXIF 제거와 썸네일 생성. 원본을 그대로 올리지 않습니다.

서버

RustEdition 2024메모리를 잘못 다뤄 생기는 취약점이 구조적으로 막힙니다. 서버 전체가 이 언어 하나로 되어 있습니다.
rustlsTLS. OpenSSL 을 쓰지 않습니다.
PostgreSQL계정과 채널 목록. 메시지 테이블은 없습니다.
MinIO암호화된 첨부물 보관. 서버는 복호할 열쇠를 갖지 않습니다.
OpenBao운영에 쓰는 열쇠를 따로 보관합니다. 설정 파일에 열쇠를 적어 두지 않습니다.
restic암호화 원격 백업. 백업 저장소도 스위스입니다.
거점 구조여러 나라에 서버를 나눠 둘 수 있는 구조입니다. 한 곳이 멈춰도 나머지가 이어받습니다.

넣지 않은 것

외부 도구 하나가 「기록을 남기지 않는다」는 약속을 통째로 무너뜨립니다. 그래서 처음부터 넣지 않았습니다.

  • 사용자 행동 분석 도구
  • 광고
  • 외부 글꼴 서버
  • 제3자 지도 · 날씨 서비스
  • 직접 만든 암호

이 웹페이지에도 분석 스크립트와 외부 폰트가 없습니다. 소스를 열어 보시면 바로 확인됩니다.

오류 수집

제3자 크래시 도구를 쓰지 않는 대신, 앱이 멈췄을 때 그 정보를 저희 서버로 직접 보냅니다. 오가는 내용은 아래와 같습니다.

보내는 것오류가 난 시각 · 플랫폼 · 심각도 · 오류 종류와 메시지 · 어느 파일 몇 번째 줄에서 멈췄는지 · 무엇을 하던 중이었는지 · 앱 판과 빌드 번호 · OS 판 · 기기 모델명(예: iPhone13,3) · 앞뒤를 잇기 위한 뜻 없는 임의의 숫자 하나.
보내지 않는 것아이디 · IP 주소 · 메시지 내용 · 기기를 특정할 수 있는 식별자. 모델명은 어떤 기종에서 문제가 생기는지 알기 위한 것이라 특정 기기를 가리키지 않습니다. 저장할 칸 자체가 없습니다.
보관 기간90일이 지나면 자동으로 지워집니다. 서버가 여섯 시간마다 스스로 정리합니다.
왜 필요한가어디서 무엇이 잘못됐는지 알아야 고칠 수 있습니다. 같은 오류가 여러 번 들어오면 한 원인으로 묶어 먼저 처리합니다.