この暗号化を自分で実装する必要はありません。 Chat XDK が処理します。このページは理解のためのものであり、API チェックリストではありません。
全体像
X Chat は次のような階層化された暗号化システムを使用します:- メッセージは会話鍵で暗号化されます(高速な対称暗号化)
- 会話鍵は各参加者の identity 公開鍵を使って暗号化されます(非対称鍵交換)
- メッセージは、署名鍵で署名されるので、受信者は誰が送信したのか、そして何も変更されていないことを検証できます
鍵の種類の説明
X Chat は 3 種類の鍵素材を使用しており、それぞれ特定の目的があります。1. Identity キーペア
目的: ユーザー間で会話鍵を安全に交換すること
誰かが会話にあなたを追加するとき、彼らはあなたの identity 公開鍵を使って会話鍵を暗号化します。あなたの identity 秘密鍵だけがそれを復号できます。
公開鍵の半分はプラットフォームの公開鍵API を通じて登録および検出されます(API リファレンスの Encryption keys を参照)。秘密鍵の半分は Chat XDK 内に留まります(たとえば 安全な鍵バックアップ や慎重に保護された鍵 blob 経由)。
2. 署名キーペア
目的: メッセージを作成したのがあなたであることを証明すること
メッセージを送信するとき、あなたの署名秘密鍵で署名されます。受信者はあなたの署名公開鍵(同じく公開鍵 API を通じて公開されます)を使って検証します。Chat XDK はメッセージの暗号化の一部として署名を行い、送信者の公開鍵素材を渡した場合は復号時に検証することもできます。
3. 会話鍵
目的: 特定の会話内でメッセージ(およびメディア)を暗号化・復号すること
会話鍵は会話がセットアップされたときや、鍵がローテーションされたときに生成されます。各参加者は identity 公開鍵で暗号化された、鍵の暗号化コピーを受け取ります。自分のコピーを一度復号したら、未加工の会話鍵を保持し、高速なメッセージ(およびメディア)暗号化に使用します。会話のためにこれらのコピーをセットアップすることは、Chat XDK と会話鍵エンドポイントを組み合わせて行われます — Getting Started で解説されています。
暗号化の仕組み(概念的に)
メッセージの送信
1
平文から始める
あなたが入力: “Hello, how are you?”
2
会話鍵を取得する
アプリは、正しい鍵バージョンについて、このチャットの未加工の会話鍵(セットアップまたは以前の鍵配布イベントから)を使用します。
3
メッセージを暗号化する
Chat XDK は会話鍵でメッセージを暗号化します。結果はその鍵がなければ役に立たない暗号文です。
4
メッセージに署名する
Chat XDK は暗号化されたペイロードにあなたの署名秘密鍵で署名し、あなたがまさにこの内容を作成したことを証明します。
5
X に送信する
アプリは、Chat API のメッセージ送信エンドポイントを介して暗号化されたペイロードと署名を X に送信します。X は平文として読み取れないバイトを保存し配信します。
メッセージの受信
1
暗号化されたデータを受信する
アプリは X から暗号文を受信します — Webhook またはアクティビティストリーム経由、または履歴のために会話イベントを読み取ることで。
2
会話鍵を取得する
キャッシュされた未加工の鍵を使うか、これが新規または鍵ローテーション後の場合は鍵配布(鍵変更)イベントからあなたのコピーを復号して取得します。
3
署名を検証する
Chat XDK は送信者の署名公開鍵(および関連する identity バインディング)を使って署名をチェックするので、誰が送ったか、そして変更されていないことを知ることができます。
4
メッセージを復号する
Chat XDK は会話鍵で復号します。これで “Hello, how are you?” を読むことができます。
鍵配布の説明
エンドツーエンド暗号化における中心的な課題は鍵配布です: X(または観察者)が鍵を平文で見ることなく、参加者が会話鍵をどうやって受け取るか。初期鍵セットアップ
会話がメッセージング用に準備される際:- ランダムな会話鍵が生成されます(Chat XDK 内)
- 各参加者について、その鍵は彼らの identity 公開鍵で暗号化されます
- それらの暗号化コピーは X の Chat API 経由で保存および配信されます
- 各参加者は自分のコピーを identity 秘密鍵で復号します(Chat XDK 内)
鍵変更イベント
会話鍵がローテーションされる(たとえばメンバーシップが変更された)とき、参加者は各メンバー用の新しい暗号化コピーを含む鍵変更イベントを受け取ります。 あなたのアプリは次のようにすべきです:- ライブイベントや会話履歴で鍵変更素材に気づく
- 新しい会話鍵(およびバージョン)を復号して保存する
- 以降の送信には最新バージョンを使用する
安全な鍵バックアップ: 分散鍵ストレージ
あなたの identity と署名の秘密鍵は慎重に保存されなければなりません。X Chat には安全な鍵バックアップシステム(Juicebox で実装)が含まれており、単一のサーバーに完全な秘密を渡すことなく、パスコードを使ってデバイス間で鍵を復元できます。従来の鍵ストレージの問題点
安全な鍵バックアップがどう解決するか
安全な鍵バックアップは秘密分散とパスコード保護を組み合わせます:- 秘密鍵はシェアに分割されます
- シェアは独立した realm(別々のサーバー)が保持します
- 単一の realm だけでは鍵を再構築するのに十分な情報がありません
- 復元にはパスコードと十分な数の realm の協力が必要です
- 間違ったパスコードはレート制限されて推測を遅らせます
通常のパスでは鍵バックアップサーバーを手動で設定する必要はありません。Chat XDK にはバックアップクライアントが含まれており、realm 設定は X API から公開鍵レコード上の
juicebox_config として提供されます(このフィールド名は、基盤となる実装である Juicebox に由来します)。初回のパスコード保存と後のアンロックは Chat XDK 呼び出しです — Getting Started の 既存の鍵で初期化する および 鍵を作成して登録する を参照してください。一部のアプリ(特にサーバーとボット)は安全な鍵バックアップの代わりにエクスポートされた鍵 blob を使用します;その素材はパスワードのように保護してください。署名の説明
すべての X Chat メッセージには、以下をサポートするデジタル署名が含まれます:- 真正性 — 送信者の署名秘密鍵で生成されたこと
- 完全性 — 暗号化されたコンテンツが署名後に変更されていないこと
署名の仕組み(概念的に)
署名対象の何かが変更されると、検証は失敗します。その鍵の有効な署名を生成できるのは、署名秘密鍵を持つ人だけです。
アプリでの利用
Chat XDK は送信メッセージを暗号化するときに署名し、受信メッセージを復号するときに(公開鍵 API からの)送信者の公開鍵素材に対して検証します。検証はデフォルトで必須です: SDK は明示的にチェックを無効にしない限り、検証されていない署名付きイベントを拒否します(推奨されません)。詳細は Chat XDK リファレンスにあります。署名付き状態変更(アクション署名)
メッセージだけが署名対象ではありません。会話の状態を変更するすべての呼び出し — 会話鍵の追加やローテーション、グループの作成、メンバーの追加 — は、1 つ以上のアクション署名を伴う必要があります: 送信者は変更が正確に何をするかを記述したペイロードに署名し(鍵変更の場合、そのペイロードには新しい会話鍵自体が含まれます)、署名が欠落または不正な形式の場合、API はリクエストを拒否します。 サーバーは平文の会話鍵を保持しないため、鍵変更の署名を暗号学的にチェックできません。受信したリクエストと、署名され、エンコードされた変更の説明が一致することを検証します。暗号学的なチェックはエッジで行われます: 各受信者の Chat XDK は、鍵変更イベントを復号する際に、送信者の署名公開鍵に対して署名を検証します。Chat XDK のprepare メソッドはこれらの署名を生成してくれます — グループの作成とメンバー追加は2 つ(鍵変更とグループアクション)を返し、両方を送信する必要があります。
署名はイベントの内容にバインドされ、不変です: 署名が検証できないイベントは、将来的に有効になることはありません。それらの扱い方については トラブルシューティング を参照してください。
セキュリティプロパティ
X Chat が保護する対象
X Chat が保護しない対象
用語集
次のステップ
Getting Started
鍵、送信、受信をステップバイステップで実装
Chat XDK Reference
暗号化 SDK のメソッドと型
Introduction
製品概要とアーキテクチャ
Real-time events
暗号化イベントがどのように配信されるか