こんにちは。LINEアプリ開発を担当しているひめしです。本記事では、今年リリースされたLYPプレミアム会員特典である「プレミアムバックアップ」において、E2EE (End to End Encryption) を保ちながらどうトーク履歴のバックアップを達成しているか、その仕組みについてご紹介します。
プレミアムバックアップとE2EE
プレミアムバックアップは、トーク履歴をリアルタイムに自動でバックアップできるLYPプレミアム会員特典のサービスです。従来LINEアプリが提供していたバックアップサービスでは、メディアファイルの バックアップができない、OSをまたいだ移行ができないなどいくつか制約がありました。プレミアムバックアップでは、動画や写真などのメディアファイルを含めて期間の制限なくバックアップサービスを提供し、iOSとAndroid間のデータ移行も実現しました。
ところで、LINEアプリではユーザがやりとりするメッセージをLetter SealingというE2EE (End to End Encryption) プロトコルによって保護しています。E2EEでは、送信元の端末で作成したメッセージは受信端末でのみ復号でき、そこでやりとりされるメッセージをサーバでは復号できない形で暗号化し取り扱わなければなりません。これはプレミアムバックアップにおいても同様であり、バックアップされたメッセージはサーバ側で復号できない形でサーバに保存した上で、復元時にユーザの端末上で復号しなければなりません。
この課題を解決するために、プレミアムバックアップではLifetime Key Backupと呼ばれる仕組みが導入されました。この仕組みによって、E2EEを保ちながらトーク履歴のバックアップを実現しています。本記事では、このLifetime Key Backupの仕組みを説明することで、ユーザの皆さまに安心してプレミアムバックアップをご利用いただければと思います。
Lifetime Key Backupによる暗号鍵のバックアップ
プレミアムバックアップでは、ユーザのトーク履歴を暗号化するために複数の暗号鍵を扱います。また、暗号鍵はプレミアムバックアップの初期バックアップを終えた後も増え続けていきます。Lifetime Key Backupの目的は 、これらの暗号鍵を安全にバックアップすることです。以下、トーク履歴の暗号化に用いる鍵を総称して「ペイロード」と呼びます。
トーク履歴の暗号化に必要な暗号鍵をまとめて管理するために、Lifetime Key Backupでは「Master Key」と呼ばれる暗号鍵を用いてペイロードを暗号化します。ペイロードはMaster Keyによって暗号化された上でサーバに保管され、復元時には暗号化されたペイロードをサーバから取得した上でMaster Keyを用いて復号します。以下、プレミアムバックアップにおいてトーク履歴を暗号化するときと復号するときの実際の流れを詳細に見ていきましょう。
トーク履歴を暗号化する時
プレミアムバックアップを有効化すると、Lifetime Key Backupでは以下のように処理が行われます。
- 端末上でMaster Keyが生成されます。ここでMaster Keyは、暗号学的に安全なランダムな鍵として生成されます。Master Keyは端末上のセキュアなストレージ(iOSであればKeychain、AndroidであればKeystore)に格納されます。
- ペイロードをMaster Keyによって暗号化します。
- Master Key自体は、アカウントのパスワード文字列から生成される暗号化鍵によって暗号化します。暗号化されたMaster Keyバイナリデータは、後述の検証プロセスのために端末上に保存しておきます。
- 暗号化されたMaster Keyバイナリデータと暗号化されたペイロードをサーバにアップロードします。
プレミアムバックアップの有効化フローの中でアカウントのパスワードを入力してもらう画面がありますが、ここで入力されたパスワード文字列がMaster Keyの暗号化に使われます。LINEアプリで はパスワード文字列を端末上に永続化しないので、Master Keyを作成する時にアカウントパスワードを入力してもらう必要があるのです。
初回バックアップ後に新しくバックアップすべき暗号鍵が生成された場合は、セキュアストレージに保存されたMaster Keyを用いて暗号化したのちに随時サーバにバックアップされます。
トーク履歴を復号するとき
概ね、暗号化するときと逆のことが行われます。
- バックアップされた暗号化済のMaster Keyをサーバから取得します。
- ログインフロー中でユーザに入力してもらったパスワード文字列を用いて、これを復号します。復号された鍵は端末上のセキュアストレージに格納します。
- バックアップされた暗号化済のペイロードをサーバから取得して、セキュアストレージに格納されたMaster Keyを用いて復号します。
アカウントのパスワードを変更する時
LINEアプリでは、ログインしている状態であれば簡単にアカウントのパスワードを変更することができます。アカウントのパスワードが変更された時、Master Keyの暗号化バックアップも新しいパスワードで作り直す必要があります。
したがって、アカウントのパスワードを変更する時は、アカウント認証用のハッシュ化されたパスワードとともに、新しいパスワード文字列を用いて暗号化されたMaster Keyバイナリデータをサーバに送信します。アカ ウント認証用のパスワードとMaster Keyの暗号化用のパスワードは同一でなければならないため、この2つは一つのリクエストでサーバに送信し、アトミックに更新されるようになっています。
なお、何かしらの要因により端末上からMaster Keyが失われている状態でアカウントのパスワードを変更すると、Master Keyのバックアップが失われるためプレミアムバックアップによってバックアップされたトーク履歴全体が失われます。意図せずこれを引き起こすことを防ぐため、パスワード変更がバックアップの紛失につながる場合は警告のポップアップを表示するようにしています。
バックアップの検証
Lifetime Key Backupはプレミアムバックアップによってバックアップされたトーク履歴の暗号化を担う極めて重要な仕組みです。クライアント上のMaster Keyとサーバ上のMaster Key(を暗号化したもの)が一致していないと、新しくペイロードを追加した時に暗号鍵の不一致により復号できなくなる可能性があります。このような事態を防ぐため、クライアントは定期的に手持ちのMaster Keyがサーバ上のものと一致しているか検証します。
Master Keyの一致検証は、「Master Keyのタイムスタンプ」と「暗号化されたMaster Keyバイナリデータ」によって行います。Master Keyのタイムスタンプが一致していないときは、端末上のMaster Keyとサーバ上のMaster Keyが一致していない可能性があります。この場合は、サーバ上のKey Backupを真としてサーバからLifetime Key Backupの復元処理を行う必要があります。
「Master Keyのタイムスタンプ」が一致しているにもかかわらず「暗号化されたMaster Keyバイナリデータ」が一致しない時は、Master Keyの暗号化に用いたアカウントのパスワード文字列の不一致が疑われます。ペイロードの暗号化に用いられているMaster Key自体は一致しているので、クライアント上のMaster Keyを真としてアカウントのパスワード文字列を用いて再度Master Keyを暗号化してそのバイナリデータをサーバにアップロードします。
復元を行うにしてもMaster Keyを再度暗号化するにしても、アカウントのパスワード文字列が必要になるためユーザにこれを入力してもらう必要があります。これらの処理が必要になった際はパスワードの入力を促すポップアップが表示されるため、できるだけ速やかにパスワード入力をしていただくようお願いいたします。なお、ポップアップを消した場合でも「設定」→「トークのバックアップ」画面からいつでもパスワード入力操作を行うことができます。
おわりに
本記事では、プレミアムバックアップにおいてE2EEを保ちながらトーク履歴のバックアップを提供するための仕組みであるLifetime Key Backupについて紹介しました。
ユーザがやりとりするメッセージをセキュアに保つことは、LINEアプリ開発における最優先事項の一つです。そして、プレミアムバックアップもトーク履歴におけるE2EEを満たすように設計されています。プレミアムバックアップをまだ設定されていないLYPプレミアム会員の皆さまは、ぜひ今すぐ設定してみてください。LYPプレミアムにまだ加入されていない皆さまは、ぜひ加入された上でプレミアムバックアップをお試しいただければと思います。