HideFileは、パスワードから作った鍵で、ブラウザ上でファイルを暗号化し、暗号化した結果を、ふつうの写真、PDF、ビデオの中に保存します。ファイルもパスワードも、私たちには送信されません。このページでは、アルゴリズムとパラメータを挙げ、アプリが実際に送信するものを正確に示し、限界についても率直に書きます。注意深い読者が私たちに不利な点として挙げそうなものも含みます。

ページの残りを整理する考え方が2つあります。暗号化はセキュリティの層です。パスワードがなければ、中身は読めません。カバーファイルはカモフラージュです。ファイルを眺める人に、暗号化されたバイトがどう見えるかを変えるもので、調べる人から見えなくするものではありません。

パスワードは、お使いのデバイス上で鍵になります

ロックしたファイルを作るとき、HideFileは、メモリハード型の鍵導出関数であるArgon2id(バージョン1.3)で、パスワードを鍵に変換します。メモリハードとは、1回の試行ごとに、時間だけでなくメモリのまとまった量も必要になるということです。そのため、推測専用に作られたハードウェアでも、推測は遅いままです。

コストは、ファイルを作る場所によって変わります。パソコンのブラウザでは、Argon2idは64 MiBのメモリ、3回の反復、シングルレーンを使います。スマートフォンやタブレット、またはメモリ4 GB以下と報告するブラウザでは、19 MiB、2回の反復、シングルレーンになります。スマートフォンのブラウザは、ロック解除のたびに64 MiBを確実に使うことができず、失敗してしまうためです。この低い設定は、Argon2idに対するOWASPの最低推奨を満たします。パラメータはロック済みファイルの中に保存されるので、パソコンで作ったファイルは、スマートフォンで開くときも64 MiBのコストのままです。

ロック済みファイルごとに、ランダムな16バイトのソルトが生成され、ファイルとともに保存されます。同じパスワードを選んだ2人でも、鍵は別になるので、推測のテーブルを1つ先に計算して、すべてのファイルに使い回すことはできません。

ファイルは、XChaCha20-Poly1305で封じられます

パスワードから作った鍵は、ファイルを直接暗号化しません。ロック済みファイルには、それぞれ、お使いのデバイス上で生成した、ランダムな256ビットのファイル鍵があります。パスワードの鍵がそのファイル鍵をラップし、ファイル鍵がファイルを封じます。

封じるのには、認証付き暗号のXChaCha20-Poly1305を使います。中身を非公開に保ち、改ざんを検出します。ファイルはレコードとして保存され、それぞれに、ランダムな192ビットのノンスと、Poly1305の認証タグが付きます。レコードが、コピーの破損でも意図的にでも、変更されていれば、ロック解除はエラーになります。誤った中身が黙って返ってくることはありません。

ブラウザの中で、パスワードとランダムな16バイトのソルトがArgon2id(64 MiBと3パス、スマートフォンや低メモリのブラウザでは19 MiBと2パス)に入り、32バイトのパスワード鍵ができます。その鍵が、ランダムな256ビットのファイル鍵をラップします。XChaCha20-Poly1305が、ランダムな192ビットのノンスと改ざん検出のタグを付けたレコードでファイルを封じます。封じたレコードは、カバーファイルの中に保存されます。
パスワードは1つで、鍵は2つです。パスワードの鍵は、ファイル鍵をラップするだけです。

どちらのアルゴリズムも、オープンソースのRustCryptoライブラリ(argonとchacha20poly1305のcrate)のものです。Rustで書かれた私たち独自のコアがそれを使い、WebAssemblyにコンパイルされて、ブラウザの中で動作します。同じコアが、HideFileが動作するすべての場所で動くため、プラットフォームごとにではなく、1つの実装を検証すれば済みます。

HideFileのSet a passwordの手順。マスクされたパスワード、Strongと表示された緑の強度メーター、Create locked fileボタンがあります。
パスワードが唯一の鍵です。Create locked fileの後の間は、Argon2idが処理を行っています。

ロックしたものは、何もアップロードされません

ロック、ロック解除、保存は、すべてブラウザのタブの中で行われます。ファイル、ファイル名、パスワード、鍵が、HideFileのサーバに送られることはなく、ロック済みファイルを保存するHideFileのサーバもありません。例外は、ご自身でオンにする機能です。Cloudflare R2などのS3互換のバケットをご自身で接続した場合、アプリは、暗号化されたバイトを、デバイスからそのバケットに直接送ります。私たちには送られません。

アプリは、お使いのデバイスのブラウザ内に、いくつかのものを保持します。開き直しを速くするため、最後に開いたロック済みファイルのコピーを、暗号化されたまま、最長で1日、最大100 MBまで保存します。再利用のために保存したファイルや、開いているファイルの作業用コピーは、ブラウザのプライベートなファイルストレージにあります。ほかに、テーマや表示方法といった設定と、最後に開いた10個のカバーの名前、サイズ、時刻も覚えています。パスワードは保持しません。サイトのデータを消去すると、すべて消えます。共有のパソコンや借りたパソコンでは、使い終わったら、消去してください。

送信する分析情報に、ファイルのデータは含まれません

利用状況の集計にはPostHogを使っています。オートキャプチャはオフで、クリックやページの内容は記録されません。送信されるのは次のものです。

  • ページビュー: ページのパスと参照元のURL、ブラウザとデバイスの種類、画面サイズ。
  • おおよその国。リクエストが届いたときに、PostHogがIPアドレスから割り出します。
  • ブラウザに保持される匿名のランダムな識別子。再訪問を数えるためのものです。
  • 3つのイベント、locked_file_created、locked_file_opened、locked_file_saved。それぞれに含まれるのは、カバーの種類(png、jpeg、mp4、pdf)とプラットフォーム(webまたはnative)だけです。

ファイル名、サイズ、数、パス、パスワード、鍵、中身、エラーメッセージは送信されません。uBlock Originなどのコンテンツブロッカーは、分析をブロックしますが、アプリは同じように動きます。ご自身で確認することもできます。ブラウザの開発者ツールを開き、ファイルをロックして保存する間、ネットワークタブを見て、ファイルを含むリクエストがないか確認してください。拘束力があるのは、この一覧の元になっているプライバシーポリシーです。

お使いのデバイスに残るもの: ファイル、ファイル名とサイズ、パスワード、暗号鍵、ロック解除した中身、カバーファイル。分析に送られるもの: パスと参照元付きのページビュー、ブラウザ、デバイス、画面サイズ、おおよその国、匿名のランダムID、カバーの種類とプラットフォームだけを含む3つのイベント(作成、オープン、保存)。ご自身で設定した場合のみ: 暗号化されたバイトが、ご自身のS3またはR2のバケットに送られ、私たちには送られません。アプリのコードは、サイトを訪れたときにhidefile.appからダウンロードされます。
デバイスに残るものと、外に出るもののごく短い一覧です。

脅威モデルを、人ごとに整理します

相手結果理由
スマートフォン、ノートパソコン、クラウドドライブをスクロールして見る人防げるふつうの写真、PDF、ビデオが見えるだけで、金庫のような名前のものはない
スマートフォンのパスコードを知っている人防げるカバーには、デバイスのロックとは別のパスワードがある
カバーのコピーを持っているが、パスワードを知らない人防げる中身は暗号化されたままである
フォレンジック調査官、またはHideFileを知っていて詳しく調べる人隠せないデータが追加されたことは分かる。中身は暗号化されたままである
パスワードを渡すよう強要できる人防げないこれを解決するソフトウェアはない
マルウェア、画面録画、ロックを解除したデバイスを見ている人防げないファイルを開いている間は、あなたと同じものが見える
防げる相手: スマートフォンやノートパソコンをスクロールして見る人(ふつうの画像が見えるだけ)、スマートフォンのパスコードを知っている人(カバーに別のパスワードがあるため)、パスワードなしでコピーを持っている人(中身は暗号化されたままのため)。隠せない相手: フォレンジック調査官(データが追加されたことは分かる)。防げない相手: パスワードを強要できる人、マルウェアやロック解除したデバイスを見ている人。
HideFileが防げるのは、ちょっとした覗き見です。フォレンジックツールは防げません。

フォレンジックツールには、データが追加されたことが分かります

HideFileは、データがあるという事実を、フォレンジックによる確認から隠そうとはしていませんし、隠せるとも主張しません。暗号化されたレコードは、カバー自身のファイル構造の中にあり、ふつうのビューアはそれを無視します。専用のツールや、何を探せばよいか知っている調査担当者なら、レコードが追加されたことを特定できます。もっと単純な手がかりはファイルサイズです。短い旅行のスナップ写真が数ギガバイトもあれば不自然ですし、カバーを加工前の元の画像と比べれば、すぐに差が分かります。

調査担当者が得られるのは、何かがあるという事実で、中身ではありません。パスワードがなければ、レコードは封じられたままです。これが正直な境界線です。「見られても分からない」ようにできるのは、好奇心のある人や、ふつうの検索に対してで、あなたのデバイスを手にした本気の調査担当者に対してではありません。国境での検査、訓練を受けた調査官、法的な圧力には、適したツールではありません。

改ざん検出が対象とするのは、封じたレコードで、カバーのすべてのバイトではありません。カバーを再保存したり、メタデータを削除したり、再圧縮したりするアプリは、暗号化側の警告なしに画像を変えてしまうことがあり、レコードをすべて削除してしまうこともあります。その場合、中のファイルは失われます。カバーは、ファイルとして保管してください。

パスワードの復旧はできません

私たちはパスワードを保持しておらず、ロック済みファイルから割り出すこともできません。リセット用のリンクも、復旧コードも、ファイルを開けるサポート手続きもありません。パスワードをなくすと、中のファイルも失われます。これは設計上の性質で、カバーのコピーを持つ人が、私たちに頼んで開けてもらうことができない理由でもあります。

オープンソースではなく、監査も受けていないもの

HideFileのソースコードは公開されておらず、第三者の機関による監査も受けていません。アルゴリズムは標準的なもので、実装するライブラリはオープンソースです。このページとアプリ内のセキュリティのページにパラメータを載せていますが、それらを呼び出す私たちのコードは、現時点では外部の方には読めません。

これは重要な点です。写真にデータを隠す別のクローズドなツールに反応して、Hacker Newsのコメント投稿者は、「no source code == no security(ソースコードがなければセキュリティはない)」と言いました。同じコミュニティの別の人は、Webアプリは訪問のたびにサーバから新しく配信されるので、ソースが公開されていても、実行しているコードがそれと一致していることを確認する手段が必要だ、と指摘しています。どちらも妥当な指摘で、その基準を求める読者にとって、HideFileはまだそれを満たしていません。反論するより、そう述べるほうがよいと考えています。欠陥を見つけた場合は、再現手順を添えて[email protected]にメールをお送りください。公開の前に、修正を出すための妥当な時間をいただければ幸いです。

出典