SpaceMoon がファイルを守るしくみ
このページでは、SpaceMoon がしていることを、わかりやすい言葉で説明します。できないことも説明します。大きすぎる約束を信じてもらうより、限界を知っておいてほしいと考えています。
概要
- 暗号化はすべて端末の中で行われます。SpaceMoon のサーバーもアカウントもありません。
- ファイルはランダムな鍵で暗号化されます。その鍵を開けられるのは、あなたのパターン、復元フレーズ、指紋だけです。
- 開発者である私たちが、あなたのパターン、フレーズ、鍵を持つことはありません。私たちはファイルを開けませんし、パターンをリセットすることもできません。
- Android に組み込まれた暗号化と、広く知られた libsodium ライブラリを使っています。独自の暗号は作っていません。
- SpaceMoon は、まだ第三者によるセキュリティ監査を受けていません。
パターンから鍵へ
パターンは5×5のグリッドに、6個以上の点を使い、同じ点を二度通らずに描きます。SpaceMoon は libsodium(Android ではバージョン1.0.20)の Argon2id で、パターンを鍵に変えます。
- 設定:メモリ64 MiB、3パス、1レーン、256ビットの鍵。
- Argon2id はわざと遅く作られていて、推測のたびに多くのメモリを必要とします。そのため、グラフィックカードを使った推測のコストが大きく上がります。
- 私たちのテスト端末では、1回の解除に約0.6〜0.9秒かかります。
- パターンは、ランダムな16バイトの端末ソルトと組み合わされます。ソルトはアプリ内に保存され、Android Keystore にある鍵で暗号化されています。この鍵は端末の外にコピーできません。
- パターンのコピーは保存されません。アプリは、鍵を開けられるかどうかでパターンを確認します。
- パターンを5回続けて間違えると、30秒待つ必要があります。その後は間違えるたびに待ち時間が2倍になり、最大16分になります。
ファイルの暗号化
- スペースごとに、ランダムな256ビットのマスターキーがあります。パターンの鍵と復元用の鍵は、このマスターキーを「包む」(暗号化する)だけです。
- ファイル、サムネイル、項目の一覧(元のファイル名、日付、サイズ)は、Android 組み込みの暗号化を使い、AES-256-GCM で暗号化されます。GCM は、ファイルが変更されたり入れ替えられたりしたことも検出します。
- アプリ内のファイルにはランダムな名前が付きます。大きなファイルは1 MiBずつ暗号化されるため、暗号化されていないコピーをストレージに一切書き出さずに動画を再生できます。
- JPEG 写真の隠れた情報(カメラや日付などの EXIF)は別に保存され、これも暗号化されます。
- アプリがロックされると、メモリ上に保持している鍵をゼロで上書きします。
復元フレーズ
- スペースを作成すると、端末の安全な乱数生成器が9つの英単語を選びます。単語は、よく使われる1,024語の2つのリストから、4通りの決まった順番のいずれかで選ばれます。これは92ビットのランダムさに相当します。アプリをどの言語で使っていても、単語は英語です。
- フレーズは同じ Argon2id の設定を通り、それだけでマスターキーを開けます。端末ソルトを必要としないため、パターンが使えなくなっても使えます。
- フレーズのコピーは端末に保存され、二重に暗号化されています。1回はマスターキーで、もう1回は Android Keystore の鍵で暗号化されます。パターンをもう一度描くと、設定で確認できます。
- パターンを変更したり、フレーズを使って開いたりすると、新しいフレーズが発行されます。古いフレーズは使えなくなります。
指紋
指紋での解除は任意です。指紋を確認するのは SpaceMoon ではなく Android で、アプリが指紋を受け取ることはありません。強い生体認証の直後にだけ使える Android Keystore の鍵が、マスターキーを開けます。誰かが端末に新しい指紋を追加すると、この鍵は使えなくなり、もう一度パターンを使う必要があります。
バックアップファイル
- バックアップは1つの
.smbファイルです。すでに暗号化された状態のままの項目と、包まれたマスターキーのコピー2つが入っています。1つはバックアップ作成時に描いたパターン用、もう1つはそのときの復元フレーズ用です。 - パターン用のコピーには、端末ソルトではなく、バックアップごとに新しいランダムなソルトが使われます。そのため、新しい端末でもバックアップを開けます。
- ファイルのヘッダーは保護されていて、変更や一部の入れ替えが検出されます。
- 保存先は Android 標準の保存画面で選びます。私たちを経由することはありません。
- 復元するには、そのファイルのパターンかフレーズで開きます。その後、新しいパターンを描くと、新しい復元フレーズが発行されます。
アプリのその他の保護
- スクリーンショット、画面録画、最近使ったアプリの一覧のプレビューは、すべての画面でブロックされます。
- 初期設定では、アプリを離れるとすぐにロックされます。代わりに30秒後か1分後を選ぶこともできます。
- Android 標準のクラウドバックアップや端末間の移行には、SpaceMoon のデータは含まれません。代わりにバックアップファイルを使ってください。
- アプリは、位置情報、連絡先、「すべてのファイル」へのアクセスを求めません。
AIとパターンの推測
- AIでも暗号の計算は省けません。推測のたびに、64 MiBのメモリを使うArgon2idをそのまま実行する必要があります。AIがArgon2idやAESを破るわけではないので、1回の推測のコストは下がりません。
- AIが変えるのは、推測する順番です。人が好む形(文字、四角形、よく選ばれる始点)を学習して、先に試すことができます。肩越しに撮った動画や画面に残った指の跡から、パターンを読み取るのにも使われる可能性があります。
- そのため、対策は計算ではなくパターンの側にあります。強度メーターはよくある形を警告します。パターン+PINモードは4〜6桁のPINを加えるので、動画に映ったパターンだけでは開けません。パターンの線を隠すをオンにすると、撮られる線が残りません。Android Keystoreに保管したデバイスソルトは、端末の外での総当たりを防ぎます。
知っておくべき限界
どんなアプリでも、すべてから守ることはできません。以下が SpaceMoon の正直な限界です。
単純なパターンは推測されます
短いパターンやよくある形(L、Z、直線)は、のぞき見や画面に残った指の跡から、または数回の試行で推測されることがあります。実際に使われるパターンは、可能なパターンの数から想像されるよりもずっと推測しやすいものです。点を増やし、曲がる回数も増やしてください。とても単純なパターンには、アプリが警告を出します。
推測にかかる時間
アプリ内では1回の試行に約1秒かかり、5回間違えると待ち時間が増えていきます。しかし、あなたのバックアップファイルを持っている人や、ルート化された端末から端末ソルトを取り出した人は、代わりにパソコンを使い、待ち時間なしで推測できます。Argon2id はこれを遅くしますが、パターンの組み合わせは長いパスワードよりはるかに少ないのです。高性能なグラフィックカード1枚(RTX 4090 クラス)で、1秒あたり約1,000回推測した場合のおおよその見積もりです:
| 推測する対象 | 組み合わせの数 | 時間(グラフィックカード1枚) |
|---|---|---|
| よく使われるパターン上位10,000個 | 104 | 約10秒 |
| 6点のすべてのパターン | 1.28 × 108 | 約1.5日 |
| 7点のすべてのパターン | 2.42 × 109 | 約28日 |
| 8点のすべてのパターン | 4.36 × 1010 | 約1.4年 |
| 復元フレーズ(92ビット) | 4.95 × 1027 | 約1.6 × 1017年 |
これらは見積もりで、実測ではありません。パターンの数は上限で、実際に使われるパターンははるかに少なくなります。ハードウェアが多いほど、また速いほど、推測はそれに比例して速くなります。
バックアップファイルは人に見せない
バックアップファイルには端末ソルトが含まれないため、手に入れた人は誰でも、上のようにオフラインでパターンを試せます。自分のクラウドアカウントなど、自分だけがアクセスできる場所にだけ保管し、長めのパターンを使ってください。
ルート化された端末やマルウェアに感染した端末
アプリの権限でコードを実行できる人は(たとえばルート化された端末や、端末を完全に制御するマルウェアを使って)、端末ソルトを開けてオフラインで推測できます。スペースを開いている間は鍵がメモリ上にあり、ルート権限やデバッガで読み取れます。Android や Flutter の内部で作られる一部のコピーや、画面に表示された写真は、すぐにはメモリから消せません。
見えてしまう情報もあります
アプリのストレージにある暗号化されたファイルの数、おおよそのサイズ、作成・変更の日時は隠されていません。SpaceMoon がインストールされていることも隠されていません。
アイコンを変えても、変わるのはホーム画面だけです
- 変わるのはホーム画面のアイコンと名前だけです。端末の 設定 > アプリ の一覧、アプリ情報、ストレージの画面には SpaceMoon と表示されたままです。
- スクリーンリーダーが「SpaceMoon」と読み上げることがあります。たとえば Samsung の One UI のホームアプリは TalkBack に本来のアプリ名を渡し、アプリ側ではこれを変えられません。
- Android の共有メニューには常に本来のアプリ名が表示されるため、アイコンを変えると SpaceMoon は共有メニューから外れます。もう一度オンにすることもできます。
- Android の許可画面には本来の名前が表示されるため、アプリはアイコンを変える前に必要な許可を求めます。
- アイコンを変えている間、アプリは通知を送りません。
- アクセスコード(4〜8桁)は、ロック画面を表示するだけで、ファイルは開けません。ソルト付きのハッシュとして保存されますが、組み合わせがとても少ないため、誰かがそのファイルを手に入れれば簡単に見つけられます。
指紋は弱い経路です
指紋での解除は Argon2id を通りません。その強さは、端末の指紋センサーと Android Keystore に左右されます。設定でいつでもオフにできます。
侵入者の写真
アプリはシャッター音を鳴らしませんが、日本や韓国など一部の国で販売される端末では、常にシャッター音が鳴ります。別のアプリがカメラを使っているときや、前面カメラがないときは撮影されません。最初に作成したスペースを開くまでは、写真は Android Keystore の鍵で封印されています。
写真の情報
- HEIC、PNG、WebP の写真では、隠れた情報(EXIF)はファイルの中に残ります。それでもファイル全体は暗号化されます。
- Android 10以降では、SpaceMoon が読み込む写真から Android が GPS の位置情報を取り除きます。アプリが位置情報へのアクセスを求めないためです。元の写真がギャラリーから削除されると、その位置情報は失われます。
- Android のフォトピッカーで追加した写真には、日付をもとにした新しい名前が付きます。ピッカーが元の名前を渡さないためです。
システム画面の表示中はロックが止まります
システム画面(許可の確認、削除の確認、写真やファイルの選択、指紋の確認)が開いている間と、取り込みや書き出しの実行中は、アプリはロックを待ちます。アプリを離れていた場合は、それが終わってから2秒後にロックされます。
スペースは1つの端末ソルトを共有します
端末上のすべてのスペースは、同じ端末ソルトを使います。そのソルトを持つ人は、1回の推測ですべてのスペースを同時に試せます。1つのスペースを攻撃するコストは変わりません。
どんなアプリにも防げないこと
パターンを描くところを誰かに見られることや、カメラで画面を撮影されることです。
両方をなくすと、誰にも助けられません
パターンと復元フレーズの両方をなくすと、誰もファイルを取り戻せません。私たちにもできません。