# セキュリティと暗号化

Mailwake のネイティブ通知は、あなたのアウトポストで暗号化され、ペアリングした iPhone で復号されます。この記事では Mailwake 1.0 の鍵の保管、暗号化の流れ、データの取り扱い範囲を説明します。自分で管理するデータと公式サービスを経由するデータを確認してください。データの処理と保存については[プライバシーポリシー](../../privacy/)をご覧ください。

## 3 つのデータ経路

メール通知、メール本文の閲覧、サービスの利用者識別には、それぞれ異なる経路を使用します。

| 機能                   | データ経路                                                                 | 内容を処理する場所                                                                                     |
| ---------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| ネイティブメール通知   | メールサーバー → アウトポスト → プッシュ配信サービス → Apple APNs → iPhone | アウトポストがメールを読み取り通知を暗号化し、iPhone が署名検証・復号・表示を行います                  |
| 必要に応じた本文の閲覧 | iPhone → あなたのアウトポスト → メールサーバー、応答は同じ経路を戻ります   | アウトポストが本文を解析し、アプリが現在の閲覧セッション内に表示します                                 |
| デバイスと購入         | アプリ ↔ デバイス・購入サービス                                           | デバイスの登録と購入の検証を行います。プッシュ配信サービスは配信前にデバイスの認可と利用権を確認します |

アウトポストは、アクセスを許可されたメールを読み取れます。ここでのエンドツーエンド暗号化の対象は、**アウトポストとペアリング済みデバイス間のネイティブ通知の内容**です。メールサービス事業者、アウトポストのホスト、復号後のデバイスは、それぞれ平文にアクセスできる範囲にあります。

## 鍵の保管場所

**アウトポストの識別用署名鍵**は、内容への署名に使います。アウトポストは P-256 署名鍵をローカルで生成し、ローカル設定用の鍵で暗号化して保存します。ペアリングしたデバイスとプッシュ配信サービスには公開鍵を渡し、送信元の検証に使います。この識別情報はデータディレクトリに保存され、再起動後も維持されます。

**デバイスは独立した 2 つの P-256 鍵を使用します**。署名鍵はデバイスの識別とペアリングへの同意を証明し、鍵共有用の秘密鍵は通知を復号します。利用可能な環境では Secure Enclave 内で鍵を生成し、それ以外ではソフトウェア鍵を使用します。共有 Keychain を通じてアプリと拡張機能が鍵にアクセスします。保護属性は `AfterFirstUnlockThisDeviceOnly` で、iCloud Keychain 同期は無効です。バックグラウンドで鍵を利用するには、再起動後に一度デバイスをロック解除する必要があります。

アウトポストとプッシュ配信サービスは、デバイスの公開鍵を保存します。復号用の秘密鍵はデバイスが保管し、公式サービスや APNs は保有しません。

アウトポストはデータディレクトリの `secret.key` を使い、メール認証情報などの機密設定を AES-256-GCM で暗号化します。データベースとこの鍵の両方が復元に必要です。一緒に[バックアップ](backup.md)し、ホストとバックアップへのアクセスを保護してください。両方を入手した人は、保存された設定を復号できます。

## ペアリングで信頼を確立する仕組み

プッシュ通知のペアリング用 QR コードには、アウトポストの公開鍵、プッシュ配信サービスのアドレスと環境、ペアリング識別子、有効期間 5 分の使い捨て認証情報が含まれます。アプリにはアウトポストの鍵のフィンガープリントが表示されます。所有者から受け取った信頼できる招待を使い、接続情報を確認してから承認してください。

デバイスは同意に署名し、アウトポスト、デバイスの暗号化用公開鍵、使い捨て認証情報、有効期限を結び付けます。アウトポストはその証明を検証し、デバイスの識別情報と公開鍵を確定してから、プッシュ配信サービスへの登録を完了します。以降の通知では、この確定済みの関係に基づいて暗号化鍵と署名検証鍵を選択します。

管理用の招待にプッシュ通知のペアリングを含めることもできますが、ネイティブ通知、設定管理、本文閲覧の権限は個別に付与されます。設定手順は [App の接続](connect-app.md)をご覧ください。

## 通知を暗号化する流れ

アウトポストは暗号化ごとに、一時的な P-256 鍵ペア、ランダムな 32 バイトの salt、12 バイトの nonce を生成し、次の処理を行います。

1. 一時秘密鍵と対象デバイスの公開鍵で P-256 ECDH 鍵共有を行い、共有秘密を取得します。
2. HKDF-SHA256 で 256 ビットのコンテンツ鍵を導出します。導出コンテキストにはプッシュ配信サービスの audience、ペアリング ID、イベント ID を含めます。
3. 同じコンテキストを追加認証データとして使い、通知 JSON を AES-256-GCM で暗号化します。暗号文と 128 ビットの認証タグが生成されます。
4. アウトポストの P-256 署名鍵と SHA-256 を使って暗号化エンベロープとコンテキストに署名し、HTTPS でプッシュ配信サービスに送信します。
5. プッシュ配信サービスが署名とエンベロープの形式を検証し、暗号文を APNs に渡します。デバイスはペアリング時に確認したアウトポストの公開鍵で署名を検証し、自分の秘密鍵からコンテンツ鍵を導出して、認証タグを検証した後に復号します。

アルゴリズム識別子は `P256-HKDF-SHA256-A256GCM` です。同じ配信の再試行では保存済みのエンベロープとイベント識別子を再利用します。新しい暗号化処理では、新しい一時鍵と乱数を生成します。通常の通知は通知サービス拡張機能が処理します。認証コードのライブアクティビティは Widget 拡張機能が処理し、同じく署名付き暗号文を使います。アクティビティの識別情報とライフサイクルの項目も暗号化コンテキストに含まれます。

暗号化される通知には、メールアカウントの表示名、フォルダ、送信者、件名、受信時刻と、任意の認証コードやメール参照が含まれます。メール本文全体は、次の節の別経路で取得します。署名検証や復号に失敗した場合は安全な代替表示を維持し、検証に成功した場合にのみ平文を表示します。

## HTTPS で本文を直接取得する

メール本文を開くと、アプリは確認済みのアウトポストの HTTPS アドレスにリクエストを送ります。アウトポストはデバイスの認証情報、所有者が付与した本文閲覧権限、署名付きメール参照で指定されたリソースの範囲を確認し、メールサーバーから本文と参照されたインライン画像を取得します。本文閲覧は無料です。プッシュ通知のペアリングだけでは、本文閲覧権限は付与されません。

アウトポストは HTML を無害化し、読み取り可能なテキストも代替として提供します。送信者のサーバーに接続する可能性があるリモート画像は、アプリの画像読み込み設定に従って読み込みます。通常の添付ファイルは、この本文取得の対象外です。

アウトポストはリクエスト処理用メモリ内で本文を処理します。応答は `Cache-Control: no-store` を使用し、アプリは HTTP キャッシュを無効にしてリダイレクトを拒否します。読み込み成功後、本文とメールごとの画像の許可をこの iPhone に別途保存し、オフラインやアプリの再起動後も読めるようにします。ファイルには iOS のファイル保護を適用し、バックアップから除外します。通知の削除・保存期限切れに合わせて本文と画像の許可を削除します。アウトポストの削除時も保存本文を消去し、通知の概要は残します。リモート画像ファイルは一時的に読み込むため、再表示時に通信が必要な場合があります。本文は公式サービスを経由せずアプリに直接届き、診断やログには保存されません。

## 公式サービスが扱うデータ

| 処理主体               | 役割上処理できるデータ                                                                                |
| ---------------------- | ----------------------------------------------------------------------------------------------------- |
| あなたのアウトポスト   | メール認証情報、メールの平文、通知設定、ペアリング用公開鍵、ローカルの配信記録                        |
| プッシュ配信サービス   | アウトポスト・デバイス・ペアリングの識別子、公開鍵、APNs トークン、暗号化エンベロープ、配信時刻と状態 |
| デバイス・購入サービス | サービスの利用者識別情報、デバイスとセッション情報、購入と利用権、配信診断のメタデータ                |
| Apple APNs             | プッシュトークン、ルーティングと配信情報、汎用の通知表示、暗号化ペイロード                            |
| あなたの iPhone        | デバイスの鍵、復号した通知とローカル履歴、閲覧を許可されたメール本文                                  |

送信者、件名、認証コードはネイティブ通知の暗号文に含まれます。暗号文を中継するサービスは、配信関係、時刻、ペイロードのサイズを把握できます。運用上の配信診断には、識別子、状態、エラーコード、時刻を使用します。メール内容には、上記の暗号化の範囲が引き続き適用されます。各サービスは、プライバシーポリシーに記載された必要なネットワーク情報も処理します。

## ローカル記録、認可の取り消し、安全上の限界

アウトポストの未配信タスクと管理者向け履歴には、独立した保存規則があります。ローカル履歴にはメールアカウントや件名の概要が含まれる場合があります。アプリは復号した通知履歴をローカルの App Group に保存し、システムのファイルデータ保護を適用します。保存期間は設定でき、履歴も消去できます。本文には、上記の独立した保護付きキャッシュが使われます。

ペアリングを解除すると、その関係による配信が停止します。本文閲覧や管理の認証情報を取り消すと、対応するアクセスが終了します。すでにデバイスに届いて復号された内容は、デバイス上で消去する必要があります。認可の取り消しによって、閲覧済みの内容を遠隔で回収することはできません。

この設計は、アウトポストのホスト、ペアリング招待、デバイスの安全性に依存します。転送中の通知内容を保護しますが、侵害されたアウトポストやロック解除されたデバイスから平文が読み取られる可能性は残ります。このプロトコルはデバイスの長期的な鍵共有用秘密鍵を使います。その秘密鍵が漏えいした場合、過去の暗号文を持つ人が古い通知を復号できる可能性があります。そのため、受信者の長期秘密鍵の漏えいに対する前方秘匿性は保証しません。

Bark、Pushover、Webhook を選ぶと、各チャネルの形式で設定先のサービスに通知を送ります。上記の暗号化プロトコルは Mailwake のネイティブ通知チャネルに適用されます。外部サービスに渡す項目とプレビュー設定は[通知チャネル](notifications.md)をご覧ください。
