100年日記 v1.3.0で、暗号化クラウドバックアップを追加しました。
100年日記は、同じ月日の日記を年ごとに並べて振り返れる連用日記アプリです。使い続けるほど記録が積み重なり、過去を見返す楽しさも少しずつ増えていきます。
一方で、長く使うほど、「もし端末が壊れたらどうするか」という問題も大きくなります。以前からこの点を課題として考えていたため、v1.3.0ではクラウドバックアップを実装しました。
端末の故障・紛失に備える
「100年日記」という名前の通り、できるだけ長く使える日記にしたいと思っています。
ただ、100年という時間を考えると、同じスマートフォンを使い続けることはありません。その間には、端末が故障したり、なくなったりすることもあるでしょう。機種変更や初期化、再インストールも、何度か経験するはずです。
だからこそ、端末を失っただけで、それまで書いてきた日記まですべて失ってしまう状態は避けたいと考えました。
日記は、長く使うほど価値が積み上がっていくデータです。そのため、100年使うことを前提にするなら、端末の故障や紛失はいつか起こるものとして、記録を復元できる仕組みを用意しておく必要があります。
サーバーを用意しない理由
バックアップを用意するだけなら、100年日記側でアカウントとクラウドサーバーを用意し、そこへ日記を保存する方法もあります。
しかし、日記はかなりプライベートなデータです。
日記には本文や写真だけでなく、その日の出来事や家族のこと、仕事のことなど、さまざまな情報が含まれます。こうしたデータを開発者側のサーバーで預かるのであれば、認証やアクセス制御、漏えい対策、バックアップ、インシデント対応などを含め、長期間にわたってその責任を負わなければなりません。長く続けるためには、ユーザーにとっても私たちにとってもコストが高過ぎる解決策となります。
そのため100年日記では、大きな保存基盤を自前で持つのではなく、ユーザー自身がすでに使っているクラウドをバックアップ先として利用することにしました。具体的には、iPhoneではiCloud、AndroidではGoogle Driveへ保存します。
一方、日記の一次保存先は、これまで通りスマートフォンの中です。v1.3.0でもこの方針は変えていません。今回追加したのは、もしものときに記録を復元するためのバックアップです。
また、クラウドバックアップは初期状態ではオフになっており、必要な人だけ設定から有効にできます。
クラウド保存前の暗号化
バックアップ先としてGoogle Driveを使う設計を考える中で、もう一つ気になったことがありました。
Google Driveの現行規約には、保存されたコンテンツが違法またはProgram Policiesに違反しているかを判断するため、Googleがコンテンツを審査する場合があると明記されています。違反と判断された場合には、ファイルの削除やアクセス制限が行われます。さらに、条件によってはGoogle Driveへのアクセス停止やGoogle Accountの削除に至る可能性もあります。
もちろん、これはGoogleがすべての非公開ファイルを人間の目で常に読んでいる、という意味ではありません。規約上も、審査は必要に応じて行われるものとして説明されています。
一方で、誤判定が絶対に起こらないとも言い切れません。Googleは2017年、保護システムの不具合によって、一部の正当なGoogle Docs / Driveファイルを利用規約違反として誤判定し、アクセスを遮断したことを公式に認めています。また、Google Driveへのアクセス自体を停止されたというユーザー報告も現在まで存在します。
それでも、日記はそもそも他人に見せるためのファイルではありません。非常にプライベートな文章や写真を、クラウド事業者が通常のファイルとして内容を解釈できる状態で保存しておく必要はない、と考えました。
そこで100年日記では、日記と写真をアプリ側で暗号化してから、iCloud / Google Driveへ保存します。
暗号化キーの管理
ただし、バックアップを暗号化するだけでは十分ではありません。復号に使うキーを同じGoogle Driveへ普通のファイルとして置いてしまえば、暗号化の意味が薄れてしまいます。
そこで、100年日記ではバックアップ本体と暗号化キーを分けて管理しています。
iPhoneではiCloud Keychain、AndroidではGoogleのBlock Storeを使います。iCloud Keychainについては、Appleがエンドツーエンド暗号化(Appleなどの事業者でも中身を見ることができない暗号化)される仕組みとして説明しています。一方、Androidでは、Block Storeのクラウド保存をE2EEで利用できる場合に限って暗号化キーを保存します。
つまり、暗号化した日記はiCloud / Google Driveへ、復号に使うキーはKeychain / Block Storeへ保存します。
そのため通常の復元で、ユーザーが長い暗号化キーを覚えておく必要はありません。同じApple Account / Google Accountで新しい端末をセットアップした場合は、通常、プラットフォーム側から暗号化キーを復旧し、そのままバックアップを復元できるようにしています。
ただし、端末やアカウントの状態によっては、キーを自動で復旧できない可能性があります。その場合に備えて、クラウドバックアップを初めて有効にしたときにはリカバリーキーも表示します。
普段は入力する必要はありませんが、自動でキーを復旧できない場合には、このリカバリーキーを使って暗号化キーを復旧できます。
クラウドバックアップの限界
もっとも、この仕組みでもAppleやGoogleのクラウドとアカウント基盤は利用します。
バックアップ本体はiCloud / Google Driveに保存されるため、そのApple Account / Google Account自体へアクセスできなくなれば、クラウドバックアップ本体も取得できません。
また、リカバリーキーで復旧できるのは暗号化キーまでであり、クラウドアカウントへのアクセス権まで復元できるわけではありません。
そこで、これまで提供していたZipエクスポートも引き続き残しています。
100年日記では、それぞれの保存方法に役割を持たせています。日記の一次保存先はスマートフォンの中です。一方、端末故障や機種変更に備えるためには暗号化クラウドバックアップを使い、AppleやGoogleとは別の場所にも自分で保管したい場合にはZipエクスポートを利用できます。
このように、3つの保存方法を目的に応じて使い分けられる形にしました。
クラウドバックアップは、自動・手動の両方に対応しています。また、新しい端末や再インストール後の空の状態では、保存していた日記と写真をバックアップから復元できます。
ただし、複数端末で日記を常時同期する用途は想定していません。あくまで、今使っている端末を失ったときに記録を復元することを目的とした機能です。
100年使える日記にするためには
100年という時間を本当に考えるなら、端末が壊れることだけでなく、クラウドサービスの状況が変わることや、アプリ側に何か問題が起きることも想定しておく必要があります。
もちろん、今回のクラウドバックアップですべてのリスクをなくせるわけではありません。
それでも、端末がなくなっただけで何年分もの日記まで失ってしまう状態からは、一歩進めたと思っています。
そのため、日記はこれまで通り自分の端末に置きつつ、もしものときに備えて、暗号化したバックアップを自分のクラウドへ残す形にしました。
100年日記では、これからも「何年後も安心して使い続けられるか」を軸に、少しずつ改善を重ねていきます。

