ゼロ知識アーキテクチャと
セキュリティ設計
KeepTempMailerは、運営者を含む第三者が絶対にメールの内容を読めない「ゼロ知識(Zero-Knowledge)」原則に基づき設計されています。本ドキュメントでは、その技術的背景と実装の詳細について解説します。
1. クライアントサイドでの鍵ペア生成の仕組み
本アプリでは、すべての暗号化および復号の根幹となるRSA-OAEP 鍵ペアを、ブラウザ標準の WebCrypto API を用いてユーザーの端末内(クライアントサイド)でのみ生成します。
通常、多くのWebサービスはサーバー上でパスワードや暗号鍵を生成・管理しますが、KeepTempMailerは window.crypto.subtle.generateKey メソッドを呼び出し、ユーザーのブラウザ・デバイスのセキュアな乱数生成器を用いて 2048-bit 以上の強固な鍵ペアを作成します。
// 実際の暗号化モジュール内での鍵生成プロセス(概念コード)
const keyPair = await window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true, // extractable: false にすることでさらなる保護が可能
["encrypt", "decrypt"]
);
生成された公開鍵(Public Key)のみがサーバーに送信され、秘密鍵(Private Key)は決してネットワークを通じて送信されることはありません。
2. なぜ「運営者にもメールが読めない」のか
KeepTempMailerにおけるメールの受信から閲覧までのライフサイクルは、以下のステップで完全に暗号化されています。これにより「運営者すら読めない」ゼロ知識性を担保しています。
メール受信時の即時暗号化 (サーバーサイド)
Cloudflare Workers上でメールを受信した瞬間、事前に登録されたユーザーの「公開鍵」を用いて、メール本文および件名(Subject)などのメタデータを直ちに暗号化します。
データベースへの保存 (D1 / KV)
データベース(Cloudflare D1等)には、完全に暗号化されたバイナリ/Base64文字列のみが保存されます。この状態のデータは、正しい秘密鍵がなければスーパーコンピューターを用いても現実的な時間内での解読は不可能です。
クライアントでの復号 (ブラウザ内)
ユーザーがアプリを開くと、暗号化されたデータがダウンロードされます。その後、ブラウザ内の WebCrypto API とローカルに保管された「秘密鍵」を用いて、初めて平文に復号され、画面に表示されます。
データベースにアクセスできる運営者やデータベース管理者がデータを見たとしても、そこに記録されているのは無意味な文字列(暗号文)のみです。秘密鍵はサーバーに一切存在しないため、物理的・技術的に運営者がユーザーのメール内容を把握することは不可能です。
3. LocalStorageを用いた安全な暗号鍵の管理手法
絶対にサーバーに送信してはならない「秘密鍵」をどのように安全に永続化するかは、ゼロ知識アーキテクチャの最大の課題の一つです。KeepTempMailerでは、ブラウザの LocalStorage または IndexedDB をセキュアに活用しています。
- 非エクスポート化 (Non-extractable): 将来的な実装として、WebCrypto APIで鍵を生成・インポートする際、
extractable: falseオプションを使用することで、悪意のある拡張機能やXSS攻撃によって秘密鍵自体が抜き取られるリスクを軽減することができます。 - パスワードベースのラップ (JWE): ユーザー自身が他のデバイスに環境を移行したい場合にのみ、パスワードを用いた対称鍵暗号(AES-GCM等)で秘密鍵をラップ(暗号化)し、JSON Web Encryption形式で安全にエクスポート可能な仕組みを提供しています。
- 隔離されたコンテキスト: アプリケーションはセキュアコンテキスト(HTTPS接続)上でのみ動作し、CORSポリシーやCSPを厳格に適用することで、ストレージへの不正アクセスを多層的に防いでいます。
これにより、高い利便性(ブラウザを開くだけで使える)と極めて高い機密性を両立した、次世代の使い捨てメールサービスを実現しています。