【ITニュース解説】EnterChat: An Open-Source End-to-End Encrypted Messaging Platform
2026年10月13日に「Dev.to」が公開したITニュース「EnterChat: An Open-Source End-to-End Encrypted Messaging Platform」について初心者にもわかりやすく解説しています。
ITニュース概要
EnterChatは、Flutterアプリ、Node.js/TypeScript製API、PostgreSQLで構築されたオープンソースのメッセージングプラットフォームだ。強固なエンドツーエンド暗号化を実装し、自己ホスト可能。本格的なシステム開発を学ぶ初心者に、リアルな実装を提示する。
ITニュース解説
EnterChatは、メッセージのやり取りを安全に行うための、オープンソースで自己ホスト可能なエンドツーエンド暗号化メッセージングプラットフォームである。システムエンジニアを目指す皆さんにとって、このプロジェクトは「実際のメッセージングシステムがどのように作られているか」を学ぶ上で非常に貴重な教材となるだろう。
安全なメッセージングアプリを開発することは、見た目以上に多くの複雑な課題を伴う。例えば、ユーザー間で安全に暗号鍵を交換する方法(鍵交換)、過去のメッセージが将来的に解読されないようにする仕組み(前方秘匿性)、メッセージをリアルタイムで確実に届け、相手がオフラインの場合にはキューに保存して後で配信する仕組み、写真や動画などのメディアファイルを安全にアップロードする機能、新しいメッセージが届いたことを知らせるプッシュ通知、友達を見つけるための連絡先検索、そして決済や不適切なコンテンツの監視といった多岐にわたる機能が必要とされる。これらの全てにおいて、最も重要なのは、メッセージを管理するサーバー側がメッセージの内容を一切読み取れないようにすることだ。多くのチュートリアルが基本的なチャット機能とFirebaseのようなクラウドサービスとの連携で終わる中、EnterChatはこれらの課題に正面から取り組み、完全なプラットフォームとして提供されている。
EnterChatの構成は大きく三つの部分に分かれている。一つ目はユーザーが直接利用するモバイルアプリで、これはGoogleが開発したUIフレームワークであるFlutterを使って構築されている。二つ目はアプリからのリクエストを受け付け、データ処理を行うバックエンドの「APIゲートウェイ」だ。これはNode.jsとTypeScriptという技術で開発されている。三つ目は全てのデータを保存するデータベースとしてPostgreSQLが使われ、さらにDockerやnginxといったインフラ周りの設定も含まれている。
このプラットフォームの核となる機能は、強力な「エンドツーエンド暗号化」である。これはメッセージが送信者のデバイスで暗号化され、受信者のデバイスでのみ復号される仕組みを指す。サーバーは暗号化されたメッセージを受け渡すだけで、その内容を知ることはできない。EnterChatでは、この暗号化の仕組みがモバイルアプリの内部で実装されている。具体的には、まずX25519という技術を使って、各ユーザーのデバイスが自身の「身分証明書」となる鍵のペアを生成する。そして、その鍵といくつかの準備用の鍵をまとめた「鍵バンドル」をサーバーにアップロードする。初めてメッセージを送信する際、送信者のアプリは受信者の鍵バンドルをサーバーから取得し、お互いの鍵を使って秘密の共通鍵を生成する。この共通鍵を使って、メッセージはAES-256-GCMという非常に強力な暗号方式で暗号化されるのだ。この仕組みには、たとえ過去の鍵が漏洩してもそれ以前のメッセージが安全に保たれる「前方秘匿性」や、メッセージが正規の送信者から来たことを保証する「認証」の仕組みも含まれている。これらの鍵素材は、デバイス内に安全に保存されるように配慮されている。
APIゲートウェイは、アプリからのリクエストを処理するバックエンドの中心部分である。Node.jsとTypeScript、そしてExpressというフレームワークで作られており、「ヘキサゴナルアーキテクチャ」という、システムの中心にあるビジネスロジックと外部の技術(データベースや外部サービスなど)が明確に分離された設計思想に基づいている。これにより、システムの変更や拡張が容易になり、テストもしやすくなるというメリットがある。このゲートウェイには、認証、メッセージ、チャット、グループ、通話、メディア、決済といった、実に19もの異なるドメインモジュールが含まれており、それぞれのモジュールが独自のHTTPルート(URL)やアプリケーションロジックを持っている。例えば、メッセージ送信の際には、zodというライブラリを使って送信されるデータの形式や内容が厳密にチェックされ、clientMessageIdというユニークな識別子を使って、ネットワークの不具合などで再送しても同じメッセージが二重に投稿されないように「冪等性」が保証されている。ユーザー認証にはJWT(JSON Web Token)が使われ、パスワードはbcryptで安全にハッシュ化されている。また、express-rate-limitやhelmetといったライブラリを使って、不正なアクセスや攻撃からシステムを守るためのセキュリティ対策も最初から組み込まれている。
データベースにはPostgreSQLが使われており、infra/migrations/ディレクトリには、データベースの構造(スキーマ)を変更するための19ものSQLファイルが管理されている。これらは、ユーザー情報、デバイス、セッション、連絡先、チャットの履歴、メディアファイル、グループ、通話記録、通知、不正な操作を記録する監査ログ、OTP認証情報、ソーシャル機能、プッシュ通知のトークン、メッセージの配信状況(送信済み、既読など)、そしてエンドツーエンド暗号化のための鍵バンドル情報、さらには決済や収益化に関するテーブルまで、メッセージングプラットフォームに必要なあらゆるデータ構造を網羅している。このようにデータベースの変更履歴をマイグレーションファイルとして管理することで、開発チーム内でのデータベース構造の変更がスムーズに行え、本番環境へのデプロイも安定して行えるようになる。
メッセージングサービスにとって、メッセージをリアルタイムで送受信できることは非常に重要だ。EnterChatでは、モバイルアプリ側とバックエンド側でリアルタイム通信の仕組みがしっかりと連携している。モバイルアプリはwebsocket_manager.dartというファイルで、WebSocketというプロトコルを使ってバックエンドと常時接続を維持する。接続が切れても自動で再接続を試みたり、定期的に「生きてるよ」という信号(ハートビート)を送ったりして、安定した通信を保つようになっている。バックエンドでは、REST APIとは別にWebSocket専用のポートが用意されており、Redisという高速なデータストアを使って、ユーザーのオンライン状態、入力中を示すインジケーター、メッセージの配信レシートといったリアルタイム性の高い情報がやり取りされる。メッセージの配信レシートは、単なる真偽値ではなく、「送信済み」「サーバー到達済み」「既読」といった状態遷移を伴うステートマシンとして設計され、専用のデータベースマイグレーションで管理されている点も、その設計の深さを示している。
認証プロセスは、電話番号とOTP(ワンタイムパスワード)の組み合わせで行われる。モバイルアプリは電話番号を入力する画面、OTPを検証する画面、そしてプロフィールを設定する画面へとユーザーを誘導し、バックエンドはTwilioのようなサービスと連携してOTPを送信・検証する。メッセージングサービスは単なるユーザーの集合ではなく、複数のデバイス(スマートフォン、タブレットなど)を介して利用されるため、各デバイスの登録とセッション管理も重要視されている。
EnterChatは、単なるデモプロジェクトの域を超え、本格的なメッセージングプラットフォームに必要な多くの「ロングテール」な機能も実装している。例えば、flutter_webrtcライブラリを利用した音声通話・ビデオ通話機能、SNSのような「ストーリー」機能や新しい友達を見つける「発見」機能、AWS S3のようなクラウドストレージを利用したメディアファイルのアップロード機能、さらにはRazorpayやStripeといった決済サービスと連携した収益化のための「ステッカーストア」やサブスクリプション、ウォレット機能までが含まれている。また、不適切なユーザーをブロックしたり、システムの操作ログを記録したりするモデレーション・安全管理機能も実装されており、019_competitor_features.sqlというマイグレーションファイルが示すように、競合製品の機能に匹敵するレベルを目指して設計されていることがうかがえる。
このEnterChatは、Firebaseのようなマネージドサービスに依存する一般的なチャットチュートリアルとは一線を画している。Firebaseは認証、データベース、プッシュ通知といった多くの機能をGoogleに任せることで手軽に開発できるが、EnterChatはこれら全てを自前で実装している。独自のAPIゲートウェイ、独自のPostgreSQLスキーマ、そしてサーバーが介在できないクライアントサイドのエンドツーエンド暗号化により、サービス全体のコントロールを完全に自らが持つことが可能だ。ユーザーはDockerとDocker Composeを使って簡単にこのプラットフォーム全体を自身の環境で実行できるため、マネージドサービスへのロックインを避けることができる。
現在のEnterChatはバージョン0.1.0という初期段階ではあるが、ここで述べた全ての機能が実際にコードとして実装されている、まさに「動作するコードベース」である。E2EEの設計はクライアント側で実装され、簡易化されたX3DHであることを正直に文書化している。バックエンドモジュールも検証、認証、リポジトリ層を備えた本格的なコードで書かれており、データベーススキーマも完成している。現在のアーキテクチャは自己ホスト可能なクライアントサーバー型だが、将来的には「分散型」の実現もロードマップに含まれている。セキュリティ監査や負荷テストなど、プロダクションシステムとしてさらに堅牢にするための課題も明確にされており、その透明性も特筆すべき点だ。
システムエンジニアを目指す皆さんにとって、EnterChatのリポジトリは、鍵交換、冪等な送信(二重投稿を防ぐ仕組み)、メッセージのパーティション分割(大量のデータを効率的に管理する方法)、ヘキサゴナルバックエンドといった、実際のメッセージングシステムを構築する上での「難しい部分」がどのように実装されているかを学ぶための素晴らしい学習リソースとなるだろう。GitHub上で公開されているこのプロジェクトのコードを実際にクローンし、Docker環境で起動し、特にe2e_crypto_engine.dartファイルで暗号化の仕組みを読み解くことは、深い学びにつながるはずだ。