ユーザーとアプリ開発者への重要な警告
プロダクトとドキュメントに掲載すべき文言
アプリが DM 関連の OAuth スコープ(dm.read、dm.write、および関連スコープ)を要求する場合、OAuth 同意画面には次のような明確なプロダクト文言を添えてください。
- 公式クライアント SDK 経路を使う場合、暗号鍵はユーザーの端末に留まります。
- ユーザーは X Chat の PIN を、それをバックエンドに転送する Web サイトに入力するべきではありません。
- 正当な統合は Chat XDK を使い、PIN によるリカバリーと暗号処理をローカルで実行します(ブラウザーの場合:WASM + セキュアキーバックアップ)。
- 秘密鍵を取得した悪意あるアプリはそれらを持ち出せます。今日の時点で、純粋にクライアント側に保持されるルート鍵に対する「この鍵を取り消す」というサーバー側の仕組みは存在しません。ユーザーがルート鍵をあなたに渡す必要が生じないように設計してください。
センシティブな鍵素材とみなされるもの
アプリ種別に応じた鍵の経路の選択
クライアントアプリはセキュアキーバックアップを優先すべきです。サーバーやボットではエクスポート済みの鍵ブロブがよく使われます。詳細は はじめに を参照してください。
秘密鍵と PIN のルール
やるべきこと
- PIN は信頼できるクライアント UI 内でのみ収集し、同じ端末上で Chat XDK(
unlock/setup)に渡してください。 - 鍵はメモリ上に必要な期間だけ保持してください。アンロック後は同じ Chat インスタンスをセッション中再利用し、ログアウト時には
lock()またはfree()を呼び出します。 - API が許すなら PIN のバッファをゼロクリアしてください(例:JS では
Uint8Arrayとして PIN を渡し、unlockの後にクリアできるようにする)。 - ボットの鍵ブロブはシークレットマネージャー(または HSM)に保管し、保存時に暗号化し、IAM を制限し、プロセスの認証情報を頻繁にローテーションしてください。
- ログには注意を払い、PIN、秘密鍵、鍵ブロブ、アンラップ済みの会話鍵、セキュアバックアップのフルレスポンスは決してログに残さないでください。
- クライアントを守ってください: XSS、悪意ある拡張機能、汚染された依存関係は、ネットワーク経路がクリーンでもメモリ上の鍵を読み取れます。
やってはいけないこと
- PIN や鍵ブロブをメール、スクリーンショット、チケットに載せないでください。
- 秘密鍵や PIN をクエリ文字列、アナリティクス、エラートラッカー、CDN のログに置かないでください。
- 「バックエンドを単純にするため」にエンドユーザーの秘密鍵を送信しないでください。
- OAuth の取り消しと鍵の取り消しを混同しないでください。アプリの接続解除は、ユーザーが既にエクスポート済みだったり、敵対的なクライアントに入力してしまった鍵を消去しません。
- 本番の UI アプリで、生の
export_keysの出力をlocalStorageや暗号化されていない IndexedDB に保存しないでください。
ブラウザーのセッション永続化
本番のブラウザーアプリは、セキュリティ第一、その次に UX を最適化すべきです。
社内デモでは利便性のために
localStorage に鍵をエクスポートすることがあります。使い捨てのプロトタイプでは問題ありませんが、本番のパターンではありません。次を優先してください。
- リロード後の
createChat+unlock(pin)。 - SPA ナビゲーションのためにアンロック済みインスタンスを保持するモジュールレベルまたはフレームワークのコンテキスト。
- タブがログアウトするか、ユーザーがアプリをロックしたときの
lock()。
OAuth スコープと暗号鍵
これらは別々のコントロールプレーンです。- OAuth は API 呼び出しを認可します(会話一覧、暗号文の投稿、イベント取得)。
- 秘密鍵はメッセージ内容への暗号アクセスを認可します。
- 必要な DM スコープだけを要求する。
- DM アクセスが必要な理由を説明する。
- 暗号処理を端末上で実行し、OAuth が PIN 収集の経路にならないようにする。
- ログアウト時にトークンの保持をやめる。別途
lock()でチャット鍵もクリアする。
運用チェックリスト
- UI フローのサーバーリクエストボディに PIN や秘密鍵のフィールドがないこと
- クライアントにはセキュアキーバックアップ(
setup/unlock)、ボットのブロブにはシークレットマネージャー - アンロック済みの Chat インスタンスを 1 ユーザーセッションにスコープし、ログアウト時にクリアする
- ロギングと APM からシークレットが除去されていること
- チャットをアンロックできるあらゆるページで CSP と XSS 対策を実施
- ユーザー向け文言:PIN をサードパーティと共有しないこと
- インシデント計画:ボットのブロブが漏えいした場合、鍵をローテーション/再登録し、過去の暗号文は古い鍵の保有者に露出したものとして扱う
関連ドキュメント
- WASM で UI アプリを構築する — クライアントアーキテクチャ
- 暗号化入門 — アイデンティティ鍵、会話鍵、セキュアキーバックアップ
- はじめに — 鍵を登録し、メッセージを送信する
- Chat XDK — API リファレンス
- 基礎: セキュリティ — OAuth と API 認証情報の衛生管理