1. はじめに

Konstruct(コンストラクト)は、Signal Protocol を基盤とし、プライバシーを重視したエンドツーエンド暗号化メッセンジャーです。本ポリシーでは、当社がどのようなデータを、何のために収集するのか、そして何を収集しないのかを具体的に説明します。Konstruct は、当社が保有するお客様のデータを可能な限り少なくするよう、設計の初期段階から作られています。

基本原則:当社が収集するのは、暗号化されたメッセージをルーティングするために必要な最小限のデータのみです。メッセージの内容はエンドツーエンド暗号化されており、当社のサーバーはそれを読むことができず、読もうともしません。

2. 収集する情報

2.1 アカウント識別子

Konstruct では、電話番号、メールアドレス、パスワード、本名は必要ありません。

アカウントの作成や 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日間、当社のサーバーに残ることがあります。

メールボックスに保存される内容(有効期限まで):

お客様のデバイスがオフラインの場合、メッセージは次に接続するまでメールボックスで待機します。約7日以内に取得されなかったメッセージは、未読のまま削除されます。

ステルス(送信者の匿名性):対象となるユーザー通信(メッセージ、受信確認、通話のシグナリングなど。いくつかの制御用の経路は設計上除外されています)では常に有効です。お客様のデバイスはエンベロープから送信者の User ID を取り除き、署名済みの送信者証明書を受信者の Identity Key 宛てに封印します。誰が送信したかを知ることができるのは受信者のみで、サーバーには分かりません。封印された送信には、スパム対策として Privacy Pass の匿名トークンが付くことがあります。トークンのサーバー側での検証は現在展開中です。ステルスは、送信のタイミング、サイズ、お客様の IP アドレスをネットワーク層から隠すものではありません。

2.4 連絡先との関係

QR コードまたは招待リンクで連絡先を追加すると、サーバーはメッセージのルーティングとストリームの購読を判断するため、その関係の記録を保存します。これにより、Konstruct は既知の連絡先がオンラインになったことをお知らせしたり、その連絡先のメッセージストリームを購読したりできます。この記録は秘匿化されています。双方とも、アカウント ID そのものではなく、アカウント ID の鍵付きハッシュ(HMAC-SHA256)として保存されるため、データベースが流出しても、読み取り可能なソーシャルグラフは得られません。この保護の価値は正確に申し上げておきます。鍵はサーバーが保有しているため、これはグラフを流出から守るものであり、当社から守るものではありません。

2.5 プッシュ通知トークン

iOS では、アプリがバックグラウンドにあるときにメッセージ通知をリアルタイムで届けるため、次のものを使用します(Android ではプッシュサービスを使用せず、アプリが独自の接続を維持します)。

2.6 セッション認証

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.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 インフラストラクチャ

6.2 暗号化

6.3 お客様のデバイスに保存されるもの

お客様のデバイスは、オペレーティングシステムによって保護されたストレージに、メッセージ履歴の全体をローカルに保存します(iOS ではデータ保護、Android ではアプリ専用のストレージで、鍵は Android Keystore に保管されます)。これには次のものが含まれます。

これらのデータはお客様の管理下にあります。アプリを削除すると、すべてのローカルデータが完全に消去されます。

6.4 保存期間

データの種類 保存
未送信メッセージ 保存期間により削除されます。メールボックスの容量上限に達するか、遅くとも約 7 日以内に削除され、配信時には削除されません
メディアの添付ファイル(暗号化済み) アップロードから約 7 日後に自動削除されます(オブジェクトの経過時間に基づき、ダウンロードの有無を問いません)
ワンタイム事前鍵 使用時にサーバーから削除されます
セッショントークン アクセストークンは 24 時間、リフレッシュトークンは 90 日間です。サインアウトまたはアカウント削除時に失効します
APNs トークン アカウントが削除されるか、トークンが更新されるまで保持されます
PushKit VoIP トークン アカウントが削除されるか、トークンが更新されるまで保持されます
ユーザー名のハッシュおよび User ID アカウントが削除されるまで保持されます
Signed PreKey ローテーション時に置き換えられ、古い鍵は削除されます
連絡先との関係 現在のところ、連絡先を削除した場合も、アカウントを削除した場合も削除されません(匿名化された記録。第8.3項を参照)

7. データの共有と第三者

当社は、お客様のデータを販売または貸与することはなく、広告、プロファイリング、その他サービスの運営と無関係な目的のために共有することもありません。サービスの運営には、以下に挙げる事業者が必要です。各事業者には、その役割に必要な最小限の情報のみが渡され、いずれの事業者もメッセージの内容を受け取りません。

7.1 インフラストラクチャ提供事業者

7.2 法令の遵守

当社は、権限を有する機関からの有効な法的命令に基づき、データの開示を求められることがあります。ただし、次のとおりです。

8. お客様の権利

8.1 匿名での利用

お客様は、個人を特定できる情報を一切提供することなく Konstruct をご利用いただけます。User ID はサーバーが発行するランダムな UUID であり、お客様に関する情報は何もエンコードされていません。

8.2 お客様のデータへのアクセス

お客様は、いつでも、下記の連絡先へご連絡いただくことにより、アカウントに関連付けられたメタデータの写しを請求できます。

8.3 アカウントの削除

お客様は、アプリの設定からアカウントを削除できます。削除すると、次のようになります。

すでに受信者へ配信されたメッセージは、受信者のデバイス上にのみローカルに保存されており、配信後は当社の管理が及びません。

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. お問い合わせ

プライバシーに関するご質問、データへのアクセス請求、その他ご不明な点は、次の連絡先までお寄せください。

概要

電話番号もメールアドレスも不要です エンドツーエンド暗号化(Signal Protocol)
完全な匿名利用に対応しています メッセージは暗号化された状態でのみ保管され、保存期間に従って削除されます(最長約 7 日)
トラッキングも分析用 SDK もありません トラフィックの難読化を内蔵しています
秘密鍵がデバイスの外に出ることはありません 最小限のメタデータのみ
第三者へのデータ販売は一切ありません GDPR の管轄(EU:サーバーはオランダ、バックアップはドイツ)