홈으로 돌아가기

ONYX 메신저: 인터넷 없이 E2EE와 LAN

ONYX — XChaCha20-Poly1305의 E2EE와 UDP 브로드캐스트를 통한 LAN 모드를 지원하는 크로스플랫폼 자체 호스팅 메신저. 멀티 디바이스 지원, 그룹/채널을 위한 외부 인스턴스. 데스크톱과 모바일에서 60 FPS 최적화된 Flutter 클라이언트.

ONYX: LAN과 완전 E2EE 암호화 메신저
Advertisement 728x90

ONYX: E2EE와 오프라인 LAN 모드를 갖춘 자체 호스팅 메신저

ONYX는 배포 용이성과 강력한 기능 사이에서 완벽한 균형을 제공합니다: 마리아DB와 레디스를 백엔드로 사용하는 Node.js 서버, 그리고 안드로이드, 윈도우, 맥OS, 리눅스용 플러터 기반 클라이언트를 지원합니다. 전체 엔드투엔드 암호화(X25519 및 XChaCha20-Poly1305)를 지원하며, 인터넷 없이도 UDP 브로드캐스트를 통해 통신 가능한 독특한 오프라인 LAN 모드를 제공합니다.

아키텍처 및 기술 스택

서버는 Express와 웹소켓(express-ws + ws)을 기반으로 동작하며, 데이터 저장에는 마리아DB, 세션 및 캐시에는 레디스를 사용합니다. 파일은 AWS SDK v3를 활용한 S3 호환 저장소에 저장됩니다. 전송 프로토콜은 wss://과 HTTP/REST를 포함합니다. 암호화는 키 교환에 X25519, 메시지 전송에 XChaCha20-Poly1305, LAN 내 미디어 전송에는 AES-256-GCM을 사용합니다.

XChaCha20-Poly1305가 AES-GCM보다 우수한 점:

Google AdInline article slot
  • AES-NI 지원 여부와 무관하게 일정 시간 내 실행됨.
  • 노운스 길이가 192비트(기존 96비트 대비)로 확장되어 장시간 세션에서 충돌 위험 감소.

암호화된 패킷 형식: [공개키 32B] [노운스 12B] [암호문] [MAC 16B].

LAN 모드: 자동 탐지 및 오프라인 메시징

클라이언트는 5초마다 255.255.255.255:45678로 UDP 패킷을 브로드캐스트하며, 다음 JSON 형식의 정보를 포함합니다:

{
  "username": "alice",
  "timestamp": 1710000000000,
  "pubkey": "<X25519 공개키, base64>"
}

수신 클라이언트는 내부 테이블을 업데이트하여 사용자명 → IP, 사용자명 → 공개키 매핑을 생성합니다. mDNS, 수동 IP 입력, 추가 핸드셰이크 없이도 즉시 암호화가 시작됩니다.

Google AdInline article slot

미디어는 포트 45679를 통해 약 32KB 단위로 전송되며, 각 청크는 독립적으로 AES-256-GCM으로 암호화됩니다. 첫 번째 청크 도착과 동시에 복호화 및 렌더링이 시작됩니다.

다중 디바이스 동기화: 완전한 E2EE 보호

새로운 디바이스를 추가할 때, 신뢰할 수 있는 기기로부터 인증 요청을 합니다. 승인 후 키 교환이 이루어지며, 서버는 평문을 전혀 접하지 않습니다.

개인 대화에서는 서버가 각 사용자 디바이스에 메시지의 암호화된 사본을 전송합니다(각 디바이스의 공개키별로 하나씩). 들어오는 메시지만 다른 디바이스 간 동기화되며, 나가는 메시지는 발신 디바이스에서만 확인 가능합니다. 이 설계는 보안을 유지하면서 기본적인 동기화 기능을 제공합니다.

Google AdInline article slot

키 유도: HKDF-SHA256를 사용하며, 라벨은 (onyx-lan-v2는 LAN용, 개별 대화용 별도 라벨).

플러터로 구현된 크로스플랫폼 클라이언트

네 가지 플랫폼에서 동일한 코드베이스를 사용합니다. 스카이/임펠러 기반 플러터는 DOM 오버헤드 없이 60FPS 부드러운 성능을 보장합니다. 데스크톱 최적화 기능에는 다음과 같은 항목이 포함됩니다:

  • fps_booster, fps_optimizer, fps_stimulator
  • message_load_optimizer, chat_preloader

데스크톱 전용 기능:

  • 시스템 트레이 및 최소화 지원
  • IPC를 통한 싱글 인스턴스 앱
  • 드래그 가능한 커스텀 타이틀바
  • 윈도우즈용 네이티브 알림

E2EE 이상의 보안 기능

  • 플러터 세이프 스토리지 기반 PIN 및 생체 인식
  • 프록시 지원 (proxy_manager.dart)
  • 안전한 저장소: 키체인 / 안드로이드 키스토어
  • 세션 관리: 신뢰할 수 있는 기기에서 세션 조회 및 삭제 가능

계정은 사용자 이름과 비밀번호만 필요하며, 전화번호나 이메일은 필수 아님. 사용자 이름은 영구적이고, 앱 내에서 여러 계정을 지원하며, 모든 데이터 삭제 기능도 제공됩니다.

그룹, 채널, 자체 호스팅 인스턴스

ONYX 서버를 통해 내장된 그룹과 채널 기능 제공 — 동기화 목적의 E2EE는 적용되지 않음.

외부 자체 호스팅 옵션:

  • 로컬 네트워크: 인터넷 없이 파일 공유 및 채팅 가능
  • VPS 기반 개인 커뮤니티: 초대 제한 접근
  • 초대 기반 구독이 가능한 공개 채널

연결 방법: external_server_join_screen에서 서버 주소 입력. 배포 방법: ONYX 서버.

그룹: 양방향. 채널: 관리자 전용.

로컬 '즐겨찾기' 저장소

노트, 카테고리(비밀번호, 미디어, 링크) 전용 탭. 서버에 저장되지 않고, 로컬에만 저장되며 동기화도 불가.

주요 특징:

  • 오프라인 LAN: UDP 브로드캐스트 + 청크 기반 미디어 전송
  • E2EE 스택: X25519, XChaCha20-Poly1305, 세션 키
  • 다중 디바이스: 디바이스별 암호화, 안전한 인증 절차
  • 플러터: 모든 플랫폼에서 최적화된 60FPS UI
  • 자체 호스팅: 그룹 및 채널용 외부 인스턴스 지원

프로젝트는 현재 베타 상태이며, 개인 소통 및 오프라인 지역 네트워크에 적합합니다.

— Editorial Team

Advertisement 728x90

다음 읽기