本文へスキップ
← そなえナビ TOPへセキュリティ仕様

技術ホワイトペーパー

そなえナビのセキュリティ仕様

バージョン: 2026-05-19 / 適用範囲: app/sonae/*lib/sonae/* の暗号化対象項目

サマリ

  • マスターパスワードを設定した時点から、機密フィールドはご自身のブラウザ内で AES-256-GCM 暗号化されてからサーバーに送信されます。
  • 鍵導出は PBKDF2-SHA256 600,000 反復(OWASP 2023 推奨値)。マスターパスワード本体は送信もログ記録もしません。
  • 家族継承用の鍵は招待 URL の末尾 #k=...(フラグメント)に埋め込みます。フラグメントは仕様上サーバーに送信されません。
  • 長期不在の自動配信(デッドマンスイッチ)を有効化すると、設定期間アクセスがないとサーバー側のバックアップ鍵を自動破棄します。
  • マスターパスワード未設定の項目、およびサービス名・カテゴリ・更新日時などのメタデータは平文でサーバーに保管されます。

1. 暗号アルゴリズム

鍵導出関数 (KDF)PBKDF2-SHA256 / 反復回数 600,000 / 出力 256bit
対称暗号AES-256-GCM / 認証付き暗号 / nonce 96bit (CSPRNG)
salt128bit / アカウントごとに生成 / Postgres に保管 (公開情報)
乱数源crypto.getRandomValues (Web Crypto API)
リカバリーキー32byte (256bit) CSPRNG / Base64 表記
家族継承鍵 (FK)32byte (256bit) CSPRNG / URL フラグメント Base64

実装: lib/sonae/crypto.tslib/sonae/unlock.ts

2. 鍵階層

  1. MK(Master Key): ユーザーのマスターパスワードと salt から PBKDF2 で導出。 端末メモリ(SessionStorage)にのみ保持し、サーバーには送信しない。
  2. DK(Data Key): アカウントごとに乱数生成(256bit)。MK で暗号化した encDataKeyByMk をサーバーに保管。
  3. FK(Family Key): 家族招待ごとに乱数生成(256bit)。MK で暗号化した enc_fk_by_mk をサーバーに保管し、FK で暗号化した enc_data_key_by_fk も保管。FK そのものは URL フラグメントとして家族へ配布。

家族側端末は、招待リンクの #k=FK と、サーバーから受け取った enc_data_key_by_fk から DK を復号し、暗号化された機密項目を読みます。サーバーは DK・FK の平文を一切保持しません。

3. 暗号化対象と非対象

暗号化される

  • 銀行・サブスク・SNSの「保管場所のヒント」「家族向けメモ」「カード末尾4桁」
  • 希望事項(葬儀・医療意思・家族へのメッセージ)の本文
  • 連絡先の電話・メール・住所・メモ

暗号化されない(平文保管)

  • サービス名・銀行名(家族の手続きに必要なため)
  • カテゴリ・on_death_action・disclosure_mode などのメタデータ
  • 招待先のメールアドレス(送信のため)
  • 最終アクセス日時(デッドマンスイッチ用)

4. 家族継承プロトコル

  1. 本人が招待ボタンを押すと、クライアントで FK(32byte 乱数)を生成。
  2. FK を MK で暗号化(enc_fk_by_mk)、DK を FK で暗号化(enc_data_key_by_fk)し、両方をサーバーに送信。
  3. FK の Base64 を URL の #k= フラグメントに付与。本人はそのリンクを家族へ手渡し(LINE・メール・印刷)。
  4. 家族が Emergency Access を申請し、本人が応答しない場合、待機期間(標準 30 日)を経て自動 GRANT。
  5. 家族が招待リンクを開くと、フラグメントの FK でサーバー保管の enc_data_key_by_fk を復号し DK を取得。DK で暗号化済み機密項目を復号して表示。

5. デッドマンスイッチ

本人が指定期間(90 〜 730 日)ログインしない場合、サーバー側に保管された encDataKeyByMk を自動削除します。これにより、本人死亡後にサーバー侵害があっても暗号化済み項目は復号できなくなります。家族側の FK 配布経路は別途存続するため、家族継承は影響を受けません。

実装: app/api/cron/sonae-deadman-check/route.ts

6. 守る対象・守らない対象(脅威モデル)

脅威本サービスの対応
サーバー単独侵害暗号化済み機密項目は復号不可。サービス名等のメタデータは漏洩可能性あり。
運営者の内部不正暗号化済み機密項目は復号不可。マスターパスワードは保管していない。
本人端末の侵害(マルウェア・盗難)セッション中のMK/DKがメモリにあるため復号可能。守備範囲外。
本人のマスターパスワード漏洩復号可能。守備範囲外。
家族の招待URLの第三者奪取Emergency Access の待機期間中の本人による拒否で防御可能。GRANT 後は復号可能。
サービス終了6ヶ月前通知+全データを PDF/JSON でユーザーへ自動配信。

7. ロードマップ(公開予定)

  • 第三者セキュリティ監査(Cure53 / Trail of Bits 軽量レビュー相当)の予算化と監査レポート公開
  • クライアント暗号化部分(lib/sonae/crypto.ts)の検証用 GitHub 公開リポジトリ
  • 暗号資産シードフレーズ向け BIP39 12/24単語入力UI
  • disclosure_mode の 3 値化(public / restricted / secret)と受信者単位の開示制御
  • マスターパスワード未設定でも家族共有を可能にする「縮退モード」