1. はじめに
Konstruct(コンストラクト)は、Signal Protocol を基盤とし、プライバシーを重視したエンドツーエンド暗号化メッセンジャーです。本ポリシーでは、当社がどのようなデータを、何のために収集するのか、そして何を収集しないのかを具体的に説明します。Konstruct は、当社が保有するお客様のデータを可能な限り少なくするよう、設計の初期段階から作られています。
基本原則:当社が収集するのは、暗号化されたメッセージをルーティングするために必要な最小限のデータのみです。メッセージの内容はエンドツーエンド暗号化されており、当社のサーバーはそれを読むことができず、読もうともしません。
2. 収集する情報
2.1 アカウント識別子
Konstruct では、電話番号、メールアドレス、パスワード、本名は必要ありません。
- User ID: アカウント作成時にサーバーが生成するランダムな UUID です。あなたの鍵からも、あなたに関する何かからも導出されておらず、そこからあなたに関する情報を取り出すことはできません。
- Device ID: 端末の公開 Identity Key の 32 文字のハッシュです。User ID と異なり決定論的で——その公開鍵を既に持つ者は計算できます——そのため自分の端末どうしの連携や招待リンクに使われ、アカウントの識別子ではありません。
- ユーザー名(任意):検索を有効にした場合に、他のユーザーがあなたを見つけるための公開エイリアスです。サーバーが保存するのはユーザー名の鍵付きハッシュのみで、ユーザー名そのものは保存しません。ユーザー名はいつでも変更または削除できます。
アカウントの作成や Konstruct の利用に、個人を特定できる情報は一切必要ありません。
2.2 暗号鍵セット
Signal Protocol の鍵交換を行うため、お客様のデバイスは次の公開鍵を生成し、サーバーにアップロードします。対応する秘密鍵はデバイスの外に出ることはなく、プラットフォームの保護された鍵ストレージ(iOS Keychain、Android Keystore)に保存されます。
| 鍵 | 種類 | サーバーでの保存 | 用途 |
|---|---|---|---|
| Identity Public Key | X25519(長期) | はい(恒久的) | お客様のデバイスを認証します。X3DH ハンドシェイクで使用されます |
| Signed PreKey | X25519(中期) | はい(定期的にローテーション) | X3DH の鍵合意で使用されます |
| ワンタイム事前鍵(OTPK) | X25519(エフェメラル) | はい(使用されるまで) | 前方秘匿性(Perfect Forward Secrecy)のため、1セッションにつき1つ消費されます |
| 秘密鍵 | — | なし | すべての秘密鍵はお客様のデバイス上にのみ保管されます |
サーバーは残っているワンタイム事前鍵の数を把握しており、残りが少なくなるとデバイスに補充を要求します。OTPK がセッションの確立に使用されると、サーバーから完全に削除されます。
2.3 未配信メッセージのキュー
メッセージを送信すると、送信前にお客様のデバイス上で暗号化されます。サーバーは暗号化されたメッセージを受信者のメールボックスに保持します。デバイスが受信したと報告しても、サーバーはそれを理由にメッセージを削除しません。メールボックスは保持期間のみに基づいて整理されます。各メールボックスにはサイズの上限があり、約7日より古いものはすべて削除されます。したがって、すでに配信されたメッセージも、暗号化されて当社には読めない状態のまま、最長で約7日間、当社のサーバーに残ることがあります。
メールボックスに保存される内容(有効期限まで):
- 暗号化されたメッセージ本文(不透明なバイナリブロブであり、当社は読むことができません)
- 送信者の User ID は、送信者の匿名性(sealed sender)の経路では省かれます(対象となる通信では常に有効です。下記「ステルス」を参照)。代わりに、受信者だけが開封できる封印された証明書が送られます
- 受信者の User ID
- メッセージ ID(UUID)
- タイムスタンプ
- メッセージのシーケンス番号(Double Ratchet アルゴリズムに必要です)
- エフェメラル公開鍵(Signal Protocol のラチェットステップの一部であり、秘密ではありません)
お客様のデバイスがオフラインの場合、メッセージは次に接続するまでメールボックスで待機します。約7日以内に取得されなかったメッセージは、未読のまま削除されます。
ステルス(送信者の匿名性):対象となるユーザー通信(メッセージ、受信確認、通話のシグナリングなど。いくつかの制御用の経路は設計上除外されています)では常に有効です。お客様のデバイスはエンベロープから送信者の User ID を取り除き、署名済みの送信者証明書を受信者の Identity Key 宛てに封印します。誰が送信したかを知ることができるのは受信者のみで、サーバーには分かりません。封印された送信には、スパム対策として Privacy Pass の匿名トークンが付くことがあります。トークンのサーバー側での検証は現在展開中です。ステルスは、送信のタイミング、サイズ、お客様の IP アドレスをネットワーク層から隠すものではありません。
2.4 連絡先との関係
QR コードまたは招待リンクで連絡先を追加すると、サーバーはメッセージのルーティングとストリームの購読を判断するため、その関係の記録を保存します。これにより、Konstruct は既知の連絡先がオンラインになったことをお知らせしたり、その連絡先のメッセージストリームを購読したりできます。この記録は秘匿化されています。双方とも、アカウント ID そのものではなく、アカウント ID の鍵付きハッシュ(HMAC-SHA256)として保存されるため、データベースが流出しても、読み取り可能なソーシャルグラフは得られません。この保護の価値は正確に申し上げておきます。鍵はサーバーが保有しているため、これはグラフを流出から守るものであり、当社から守るものではありません。
2.5 プッシュ通知トークン
iOS では、アプリがバックグラウンドにあるときにメッセージ通知をリアルタイムで届けるため、次のものを使用します(Android ではプッシュサービスを使用せず、アプリが独自の接続を維持します)。
- Apple APNs デバイストークン:サーバーに保存され、「新着メッセージ」の起動シグナルを送るためだけに使用されます。
- Apple PushKit VoIP トークン:別に保存され、音声通話の着信招待があったときにアプリを起動するためだけに使用されます。APNs トークンと同様に、メッセージや通話の内容は含まれません。
- プッシュ通知にメッセージの内容が含まれることは一切ありません。通知に含まれるのは汎用的なシグナルのみで、これを受けてお客様のデバイスが接続し、暗号化されたメッセージを取得します。通話の場合は、着信を表示します。
2.6 セッション認証
- セッショントークン:アクセストークン(有効期間24時間)とリフレッシュトークン(有効期間90日)がお客様の接続を認証します。どちらも、サインアウトまたはアカウント削除の際に失効されます。
2.7 音声通話・ビデオ通話
音声通話とビデオ通話はエンドツーエンド暗号化されています。通話のセットアップ(WebRTC のセッション記述(SDP)と ICE の接続候補)は、チャットと同じエンドツーエンド暗号化されたメッセージ経路でやり取りされるため、当社のサーバーは読むことができません。通話の音声と映像には WebRTC の DTLS-SRTP を使用します。メディアの暗号鍵は、このエンドツーエンド暗号化されたシグナリングの中で交換・認証されるため、メディアは2台のデバイス間でエンドツーエンドに暗号化され、当社のサーバーも、当社が利用するリレーも復号できません。当社のサーバーには、通話が音声通話として始まるのかビデオ通話として始まるのかが伝えられます。これは、受信者の端末が適切な形式で着信を知らせるためです。通話中のカメラのオン・オフはサーバーには送信されません。リレーは、転送する暗号化トラフィックの量から、ビデオと音声を区別できます。
通話を接続するため、2台のデバイスは直接の経路を探すべく、ネットワークアドレスの候補(標準的な WebRTC の ICE)を交換します。直接接続ができない場合、暗号化されたメディアは TURN サーバー経由で中継されます。リレーは、自身では読めない暗号化されたメディアを転送するだけですが、参加者のネットワークアドレスは見えます。この接続メタデータは通話のルーティングに必要なものであり、メッセージの内容とは関連付けられません。iOS では、着信時に第2.5項の PushKit VoIP トークンを通じてアプリが起動されます。プッシュ自体に通話の内容は含まれません。Android では、プッシュを使わず、アプリ自身の接続で通話が届きます。TURN サーバーはオランダで稼働しています。
2.8 メディア添付ファイル
写真、動画、ファイル、ボイスメッセージを送信すると、添付ファイルはアップロード前にお客様のデバイス上で圧縮され、暗号化されます(ファイルごとに新しい鍵を使用した AES-256-GCM)。復号鍵は、受信者宛てのエンドツーエンド暗号化されたメッセージの中だけで運ばれ、メディアサーバーに送られることも、保持されることもありません。サーバーが保存するのは、ランダムなメディア ID で識別される不透明な暗号化ブロブのみで、その内容を読むことはできません。
暗号化されたメディアオブジェクトは、アップロードから約7日後に自動的に削除されます(ダウンロードされたかどうかにかかわりません)。受信者のデバイスは、この期間内にそれを取得して復号します。当社は平文のメディアを保存しません。各オブジェクトについてサーバーが把握しているのは、暗号化されたブロブ本体、その ID、パディング後のサイズクラス、暗号文のハッシュ、アップロード時刻と有効期限のみです。
2.9 収集しない情報
次の情報は、明示的に収集も保存もしません。
- 電話番号
- メールアドレス
- パスワード
- 本名
- メッセージの内容(エンドツーエンド暗号化されており、当社はアクセスできません)
- メッセージ履歴(存在するのは第2.3項に記載の暗号化されたメールボックスのみで、当社は読むことができません)
- 位置情報
- 配信確認を超える入力中インジケーターや既読通知
- サードパーティの分析ツールやトラッキング SDK
2.10 IP アドレスと接続メタデータ
オンラインサービスに接続すると、ネットワーク層でお客様の IP アドレスがそのサービスのサーバーに知られます。これは避けられないことであり、Konstruct も例外ではありません。ただし、当社はお客様の生の IP アドレスをデータベースに書き込みません。デバイス登録の制限や Proof of Work チャレンジには、アドレスのソルト付き一方向ハッシュのみを使用します。メッセージ送信と鍵バンドル取得の頻度を制限するため、サーバーはアドレスそのもの(IPv6 の場合はその /64 ネットワーク)をインメモリのカウンターに短時間保持し、約1分で失効します。IP アドレスとアカウントの対応付けは保存しません。
当社は、お客様のアドレスやそのハッシュタグを、行動プロファイルの作成、メッセージ内容との関連付け、広告のための共有には使用しません。ただし、ソルト付きハッシュは露出を低減するものであり、完全に匿名化するものではありません。IPv4 のアドレス空間は小さいため、秘密のソルトを保持する者は候補アドレスを照合できる可能性があります。ハッシュ化により、当社が保存するあらゆるデータから生のアドレスは除かれますが、接続元のネットワークを当社のインフラが特定できないことを保証するものではありません。
ネットワークアドレスを経路上から完全に排除したい場合は、設定で検閲対策を有効にするか、VPN または Tor をご利用ください。ただし、お客様の接続を終端する地点には、その接続の見かけ上の送信元アドレスが引き続き見えます。
3. トラフィック分析への対策
Konstruct はパディングを行い、iOS ではさらに送信タイミングのランダムなジッターを加えています。これにより、ネットワーク上の観測者や当社のサーバーが、サイズや正確なタイミングから送信内容を推測することを難しくします。メッセージは固定サイズの単位にパディングされます。添付ファイル(写真、動画、ボイスメッセージ、ファイル、プロフィール写真)はサイズクラスにパディングされるため、サーバーが保存するのは正確なファイルサイズではなくサイズの範囲であり、ファイルが大きくなるのは最大で12%、通常は約3%です(最小のファイルは4 KB までパディングされます)。また、ファイルの種類がサーバーに伝えられることもありません。これらの対策は初期設定で有効であり、設定は不要です。
当社は、スケジュールに従ってダミーのカバートラフィックを送信することを、意図的に行っていません。常時のカバートラフィックには、常時接続と時刻を決めた送信が必要で、バッテリーとデータ通信量を消耗します。モバイルクライアントでは維持できず、これを無理に行えば、メタデータ保護のわずかな強化と引き換えに、実際の使い勝手を損なうことになります。パディングと送信ジッター(上記)が、モバイルに対する当社の答えです。常時のカバートラフィックは、常時オンラインのデスクトップクライアントでのみ実行可能で、デスクトップ限定の選択肢として残されていますが、モバイルでお約束するものではありません。動作していないものを動作していると謳うくらいなら、カバートラフィックを提供しないほうがよいと当社は考えています。
これとは別に、検閲対策はネットワーク層の難読化レイヤーで、直接の TLS が制限またはブロックされている場合に、お客様の接続が通常の HTTPS トラフィックに紛れ込めるようにするものです。これは検閲を回避するための仕組みであり、メタデータを隠すものではありません。お客様の接続をすでに観測できるネットワーク上の観測者が、メッセージのタイミングやサイズを推測することを、それだけで防ぐものではありません。
4. スパム対策:Proof of Work
電話番号やメールアドレスを使わずにスパムを防ぐため、Konstruct は、登録時、および頻度制限を超えた後の送信時に、お客様のデバイスに小規模な Proof of Work の計算を行わせます。これはクライアント側の計算で、正当な利用にはごくわずかな負担しかかけず、大量のスパムには計算上の高いコストを課します。個人データは一切関与しません。
5. データの利用方法
| データ | 目的 |
|---|---|
| User ID | お客様のデバイスの認証およびメッセージのルーティング |
| 公開鍵セット | Signal Protocol のエンドツーエンド暗号化における鍵交換の実現 |
| 未送信メッセージのキュー | 配信されるまで暗号化されたメッセージを保管するため |
| 連絡先との関係 | メッセージのルーティングおよびストリームの購読 |
| APNs トークン | バックグラウンドプッシュ通知の配信 |
| PushKit VoIP トークン | 着信の招待時にアプリを起動するため |
| セッショントークン | gRPC 接続の認証 |
当社は、収集したデータを、広告、プロファイリング、分析、またはメッセージングサービスの運営以外のいかなる目的にも使用しません。
6. データの保管とセキュリティ
6.1 インフラストラクチャ
- ホスティング:DigitalOcean の VPS(オランダ)
- 永続ストレージ:PostgreSQL データベース(アカウントデータ、鍵セット、連絡先との関係)
- 一時ストレージ:Redis(セッショントークン、未送信メッセージのキュー)
- 管轄:オランダ/欧州連合(EU)— GDPR が適用されます
6.2 暗号化
- 通信中:クライアントとサーバー間のメッセージ交換は、iOS では利用可能な場合に QUIC 上の gRPC 双方向ストリームで行われ、自動的に HTTP/2 + TLS 上の gRPC へフォールバックします(Android は HTTP/2 + TLS を使用します。境界は 443 番ポートの Caddy で、TLS 1.2 または 1.3 です)。制御用 RPC および認証も、同じ暗号化されたトランスポートスタックを使用します
- 保存時:メッセージおよびメディアの内容は、デバイス上の鍵で暗号化された状態でのみ保存されます。データベースのバックアップは、バックアップ用ストレージへ送信される前に暗号化されます(第7.1項)
- エンドツーエンド: Signal Protocol ベース——X3DH / PQXDH 鍵合意(X25519 とポスト量子 ML-KEM-1024 の組み合わせ)と ChaCha20-Poly1305 AEAD による Double Ratchet。デバイスのプリキーは Ed25519 とハイブリッド Ed25519 + ML-DSA-65(ポスト量子)の二重に署名され、両方がなければセッションは確立されません。ハイブリッド鍵自体は現在も Ed25519 で署名されています。メディア添付はファイルごとの鍵で AES-256-GCM 暗号化されます。
6.3 お客様のデバイスに保存されるもの
お客様のデバイスは、オペレーティングシステムによって保護されたストレージに、メッセージ履歴の全体をローカルに保存します(iOS ではデータ保護、Android ではアプリ専用のストレージで、鍵は Android Keystore に保管されます)。これには次のものが含まれます。
- 会話履歴の全体
- メディアの添付ファイル
- 連絡先リストおよび表示名
- 暗号セッションの状態(Keychain / Keystore)
- メッセージの下書き
これらのデータはお客様の管理下にあります。アプリを削除すると、すべてのローカルデータが完全に消去されます。
6.4 保存期間
| データの種類 | 保存 |
|---|---|
| 未送信メッセージ | 保存期間により削除されます。メールボックスの容量上限に達するか、遅くとも約 7 日以内に削除され、配信時には削除されません |
| メディアの添付ファイル(暗号化済み) | アップロードから約 7 日後に自動削除されます(オブジェクトの経過時間に基づき、ダウンロードの有無を問いません) |
| ワンタイム事前鍵 | 使用時にサーバーから削除されます |
| セッショントークン | アクセストークンは 24 時間、リフレッシュトークンは 90 日間です。サインアウトまたはアカウント削除時に失効します |
| APNs トークン | アカウントが削除されるか、トークンが更新されるまで保持されます |
| PushKit VoIP トークン | アカウントが削除されるか、トークンが更新されるまで保持されます |
| ユーザー名のハッシュおよび User ID | アカウントが削除されるまで保持されます |
| Signed PreKey | ローテーション時に置き換えられ、古い鍵は削除されます |
| 連絡先との関係 | 現在のところ、連絡先を削除した場合も、アカウントを削除した場合も削除されません(匿名化された記録。第8.3項を参照) |
7. データの共有と第三者
当社は、お客様のデータを販売または貸与することはなく、広告、プロファイリング、その他サービスの運営と無関係な目的のために共有することもありません。サービスの運営には、以下に挙げる事業者が必要です。各事業者には、その役割に必要な最小限の情報のみが渡され、いずれの事業者もメッセージの内容を受け取りません。
7.1 インフラストラクチャ提供事業者
- DigitalOcean(オランダ):サーバーを提供します。アプリケーションデータおよび暗号鍵にはアクセスできません。
- Hetzner Storage Box(ドイツ):データベースおよびキューのバックアップ(毎日分 7 件、毎週分 4 件)を保管します。バックアップは送信前に暗号化され、Hetzner は鍵を保有しません。バックアップには、メールボックス内の暗号化されたメッセージ、匿名化された連絡先の関係、ユーザー名のハッシュが含まれます。メディアはバックアップされません。
- TURN サーバー(オランダ)および検閲回避用サーバー:読み取ることのできない暗号化されたトラフィックのみを中継し、接続元のネットワークアドレスを確認できます。検閲回避用サーバーの稼働場所は公開していません。
- Apple APNs:お客様のデバイスのプッシュトークンと、一般的な通知シグナル(メッセージの内容を含まない)のみを受け取ります。Apple のプライバシーポリシーに従います。
7.2 法令の遵守
当社は、権限を有する機関からの有効な法的命令に基づき、データの開示を求められることがあります。ただし、次のとおりです。
- 当社はお客様のメッセージを復号することができません(エンドツーエンド暗号化)
- 当社が保持するメタデータは最小限です。メッセージの内容も、データベース内の生の IP アドレスも(短時間のレート制限カウンターについては 第2.10項に記載)、行動のプロファイリングも保持しません
- 法律で禁止されていない限り、影響を受けるユーザーに通知します
8. お客様の権利
8.1 匿名での利用
お客様は、個人を特定できる情報を一切提供することなく Konstruct をご利用いただけます。User ID はサーバーが発行するランダムな UUID であり、お客様に関する情報は何もエンコードされていません。
8.2 お客様のデータへのアクセス
お客様は、いつでも、下記の連絡先へご連絡いただくことにより、アカウントに関連付けられたメタデータの写しを請求できます。
8.3 アカウントの削除
お客様は、アプリの設定からアカウントを削除できます。削除すると、次のようになります。
- ユーザー名のハッシュ、お客様の User ID、および公開鍵セットはサーバーから削除されます。デバイス ID とハッシュコミットメントは、追記専用で記録の削除ができない鍵透明性ログに残ります
- 匿名化された連絡先関係の記録は、現在のところ削除されません
- お客様の APNs トークンおよび PushKit VoIP トークンは削除されます
- メールボックス内のメッセージは通常の保存期間(最長約 7 日)に従って削除され、バックアップからはローテーションに伴って削除されます(最長約 4 週間)
- 削除は 24 時間以内に完了します
すでに受信者へ配信されたメッセージは、受信者のデバイス上にのみローカルに保存されており、配信後は当社の管理が及びません。
8.4 ユーザー名
お客様は、アカウント設定からいつでもユーザー名を追加、変更、または削除できます。
9. 最低年齢
Konstruct は、App Store の年齢レーティング 16+ に合致し、16 歳以上のユーザーを対象としています。16 歳未満の方を対象とするものではなく、また意図しておらず、当社は 16 歳未満の方のデータを故意に収集することはありません。Konstruct は上記の最小限のルーティング用メタデータのみを保持し、メッセージの内容を保持しないため、いずれのアカウントに関連付けられるデータも、設計上限られています。16 歳未満の方が Konstruct を利用していると思われる場合は、当社までご連絡ください(第12条)。適切に対応いたします。
10. お客様のデータの管理責任者
Konstruct は企業ではなく、独立したプロジェクトです。GDPR に基づくデータ管理者は、プロジェクトのメンテナーである Maxim Eliseyev(マキシム・エリセエフ)であり、連絡先は第12条に記載のアドレスです。Konstruct は Data Protection Officer の選任が必要となる規模ではなく、選任もしていません。第8条に基づくご請求は同じアドレスに送られ、同じ担当者が対応します。法人が設立された場合や責任者が交代した場合など、これらに変更があるときは、本条も併せて変更し、その旨を第11条に定める方法でお知らせします。
11. 本ポリシーの変更
重要な変更がある場合、当社は次の方法でユーザーにお知らせします。
- アプリ内通知
- 本文書の「最終更新日」の更新
変更後も Konstruct を引き続きご利用いただいた場合、改定後のポリシーに同意したものとみなします。
12. お問い合わせ
プライバシーに関するご質問、データへのアクセス請求、その他ご不明な点は、次の連絡先までお寄せください。
- メール: maxim.elis@icloud.com
- ウェブサイト: konstruct.cc
概要
| 電話番号もメールアドレスも不要です | エンドツーエンド暗号化(Signal Protocol) |
| 完全な匿名利用に対応しています | メッセージは暗号化された状態でのみ保管され、保存期間に従って削除されます(最長約 7 日) |
| トラッキングも分析用 SDK もありません | トラフィックの難読化を内蔵しています |
| 秘密鍵がデバイスの外に出ることはありません | 最小限のメタデータのみ |
| 第三者へのデータ販売は一切ありません | GDPR の管轄(EU:サーバーはオランダ、バックアップはドイツ) |