セキュリティ モデル。
ノートを守るもの、サーバーが見えるものと見えないもの、そして境界がどこにあるかを、はっきりと述べます — 理解できないセキュリティはセキュリティではないからです。
暗号
- 暗号化: すべてのノートは、何かがアップロードされる前に、AES-256-GCM(12 バイトのノンスと 16 バイトの認証タグ)で端末上に封印されます。改ざんされた暗号文はゴミに復号されるのではなく、認証に失敗します。
- 鍵導出: 鍵は、32 バイトの新しい乱数 — フラグメント鍵 — と 16 バイトのランダムなソルトに対する HKDF-SHA256 から得られます。その 32 バイトはリンクの #フラグメントに入り、それ以外のどこにも入りません。
- パスフレーズ(任意): 設定すると、PBKDF2-HMAC-SHA256 で 60 万回反復して強化され、導出に混ぜ込まれるため、リンクだけでは不十分になります。誤った入力は受信者のブラウザ内でローカルに失敗し、閲覧回数を消費しません。
- 二重に検証済み: アプリの Swift 実装と Kotlin 実装とビューアの WebCrypto 実装は、独立に生成されたテストベクターで互いに検証されるため、一方で封印されたノートは常にもう一方で開きます。
フラグメント鍵リンク
ノートのリンクは burnpony.app/n/<id>#<key> のようになります。# より後はすべて URL フラグメントで、ブラウザは HTTP リクエストでフラグメントを送りません — このサーバーにも他のどこにも。サーバーが知るのはランダムなノート ID だけで、鍵はリンク自体と、読んでいる間の受信者のブラウザの中にしか存在しません。だからこそ「サーバーはあなたのノートを読めない」は、ウェブの仕組みそのものの性質であって、約束ではありません。
サーバーが保存するもの — そして読めないもの
ノートが生きている間、サーバーが持つのは: ランダムなノート ID、封印された暗号文のブロブ、作成と有効期限のタイムスタンプ、閲覧の許容回数とカウント、開封確認が要求されたかどうか、そしてアプリがノートを早期に焼却できる管理トークンのハッシュです。確認が有効なら、開封時刻のタイムスタンプが記録されます。それが在庫のすべてです。鍵、ノート本文、さらには自動非表示の設定さえ決して持ちません — それはノートの中に暗号化されて運ばれます。作成のレート制限は、生のアドレスログではなく、サーバーの秘密を用いた IP ハッシュを使い、約 2 時間で失効します。
焼却と、その後に残るもの
許可された最後の閲覧が取得されると、暗号文はそれを提供したのと同じデータベーストランザクション内で削除されます。期限切れのノートは、5 分ごとに実行されるスイープで削除されます。そして重要なことに、焼却されたノート、期限切れのノート、最初から存在しなかったノートは、すべてまったく同じ応答を返します — サーバーを、あるリンクがかつて本物だったと確認するオラクルとして使うことはできません。
ビューア
受信者は単一の自己完結型ページを開きます: フレームワークなし、Cookie なし、解析なし、封印されたノート自体のためにこのサーバーへ以外はどこへもリクエストしません。厳格な Content-Security-Policy(default-src 'none')、noindex ディレクティブ、そしてリンクがリファラーヘッダー経由で漏れないよう no-referrer ポリシーを備えます。復号はブラウザ内蔵の WebCrypto で行われます。ページはソースの表示で監査できるほど短く — それは設計目標であって偶然ではありません。
開封確認について、正直に
確認はノートごとにオプトインです。受信者は、表示する前に「このノートが開かれると送信者に通知されます」と目にします。あなたが受け取るプッシュは意図的に一般化されています — 「ノートが開かれました。」にノート ID だけを添えて — なので、ノートの内容はプッシュプロバイダのサーバーを一切通りません。
脅威モデル
BurnPony は、サーバー、ネットワークの観察者、そして後からフラグメントなしの URL を見つけた者に対して、ノートの機密性と完全性を守ります — そして、ノートがそもそもどれだけの期間・回数読めるかを制限します。あなたの端末と受信者のブラウザが文書どおりに振る舞うことを前提とします。どちらかの端点のマルウェアや、表示中にノートをコピー・スクリーンショット・撮影する受信者に対しては防御しません — どんな読んだら消える系ツールにもできません。自己消滅は将来のアクセスを制限しますが、読む瞬間を取り締まることはできません。
正直な限界
- リンクが鍵です。 燃える前に完全なリンク(設定されていればパスフレーズも)を入手した者は、ノートを読めます。秘密そのものを託せる経路で送るか、パスフレーズを追加して別々に共有してください。
- 画面は撮影されうる。 自動非表示のカウントダウンは覗き見の時間を減らしますが、スクリーンショット対策ではありません。
- 端末の紛失は管理の喪失。 送信済みのノートは自分のスケジュールで燃え、期限切れになり続けますが、アプリの送信済みタブがなければ、早期に焼却したり状態を確認したりする機能を失います。
- ネットワークレベルのメタデータは存在する。 どのウェブサーバーとも同様に、これもリクエストを処理する間、接続する IP アドレスをネットワークレベルで見ます。リレーの前段のウェブサーバーはアクセスログを無効に設定されており、アプリケーションは上記の短命なソルト付き IP ハッシュだけを保持します。
正確な仕様
このページのすべての主張は、v1 プロトコルページで定数ごとに正確に述べられ、公開リポジトリの凍結されたコードに対して書かれ、共有テストベクターで検証できます。
検査に開かれている
ビューアは今日、どのノートリンクでも監査可能で、暗号コア、ビューア、リレーサーバーは公開が予定されています — 状況は オープンソースページ をご覧ください。
脆弱性の報告
何か見つけましたか? NorseHorse@norsehor.se にメールを — 希望すれば PGP 鍵で暗号化して。報告は開発者に直接届き、間に委員会がいないため修正は素早く出ます。