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の認証タグが付きます。レコードが、コピーの破損でも意図的にでも、変更されていれば、ロック解除はエラーになります。誤った中身が黙って返ってくることはありません。
どちらのアルゴリズムも、オープンソースのRustCryptoライブラリ(argonとchacha20poly1305のcrate)のものです。Rustで書かれた私たち独自のコアがそれを使い、WebAssemblyにコンパイルされて、ブラウザの中で動作します。同じコアが、HideFileが動作するすべての場所で動くため、プラットフォームごとにではなく、1つの実装を検証すれば済みます。

ロックしたものは、何もアップロードされません
ロック、ロック解除、保存は、すべてブラウザのタブの中で行われます。ファイル、ファイル名、パスワード、鍵が、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などのコンテンツブロッカーは、分析をブロックしますが、アプリは同じように動きます。ご自身で確認することもできます。ブラウザの開発者ツールを開き、ファイルをロックして保存する間、ネットワークタブを見て、ファイルを含むリクエストがないか確認してください。拘束力があるのは、この一覧の元になっているプライバシーポリシーです。
脅威モデルを、人ごとに整理します
| 相手 | 結果 | 理由 |
|---|---|---|
| スマートフォン、ノートパソコン、クラウドドライブをスクロールして見る人 | 防げる | ふつうの写真、PDF、ビデオが見えるだけで、金庫のような名前のものはない |
| スマートフォンのパスコードを知っている人 | 防げる | カバーには、デバイスのロックとは別のパスワードがある |
| カバーのコピーを持っているが、パスワードを知らない人 | 防げる | 中身は暗号化されたままである |
| フォレンジック調査官、またはHideFileを知っていて詳しく調べる人 | 隠せない | データが追加されたことは分かる。中身は暗号化されたままである |
| パスワードを渡すよう強要できる人 | 防げない | これを解決するソフトウェアはない |
| マルウェア、画面録画、ロックを解除したデバイスを見ている人 | 防げない | ファイルを開いている間は、あなたと同じものが見える |
フォレンジックツールには、データが追加されたことが分かります
HideFileは、データがあるという事実を、フォレンジックによる確認から隠そうとはしていませんし、隠せるとも主張しません。暗号化されたレコードは、カバー自身のファイル構造の中にあり、ふつうのビューアはそれを無視します。専用のツールや、何を探せばよいか知っている調査担当者なら、レコードが追加されたことを特定できます。もっと単純な手がかりはファイルサイズです。短い旅行のスナップ写真が数ギガバイトもあれば不自然ですし、カバーを加工前の元の画像と比べれば、すぐに差が分かります。
調査担当者が得られるのは、何かがあるという事実で、中身ではありません。パスワードがなければ、レコードは封じられたままです。これが正直な境界線です。「見られても分からない」ようにできるのは、好奇心のある人や、ふつうの検索に対してで、あなたのデバイスを手にした本気の調査担当者に対してではありません。国境での検査、訓練を受けた調査官、法的な圧力には、適したツールではありません。
改ざん検出が対象とするのは、封じたレコードで、カバーのすべてのバイトではありません。カバーを再保存したり、メタデータを削除したり、再圧縮したりするアプリは、暗号化側の警告なしに画像を変えてしまうことがあり、レコードをすべて削除してしまうこともあります。その場合、中のファイルは失われます。カバーは、ファイルとして保管してください。
パスワードの復旧はできません
私たちはパスワードを保持しておらず、ロック済みファイルから割り出すこともできません。リセット用のリンクも、復旧コードも、ファイルを開けるサポート手続きもありません。パスワードをなくすと、中のファイルも失われます。これは設計上の性質で、カバーのコピーを持つ人が、私たちに頼んで開けてもらうことができない理由でもあります。
オープンソースではなく、監査も受けていないもの
HideFileのソースコードは公開されておらず、第三者の機関による監査も受けていません。アルゴリズムは標準的なもので、実装するライブラリはオープンソースです。このページとアプリ内のセキュリティのページにパラメータを載せていますが、それらを呼び出す私たちのコードは、現時点では外部の方には読めません。
これは重要な点です。写真にデータを隠す別のクローズドなツールに反応して、Hacker Newsのコメント投稿者は、「no source code == no security(ソースコードがなければセキュリティはない)」と言いました。同じコミュニティの別の人は、Webアプリは訪問のたびにサーバから新しく配信されるので、ソースが公開されていても、実行しているコードがそれと一致していることを確認する手段が必要だ、と指摘しています。どちらも妥当な指摘で、その基準を求める読者にとって、HideFileはまだそれを満たしていません。反論するより、そう述べるほうがよいと考えています。欠陥を見つけた場合は、再現手順を添えてsupport@hidefile.appにメールをお送りください。公開の前に、修正を出すための妥当な時間をいただければ幸いです。
出典
- HideFile: How HideFile protects you
- HideFile: Privacy Policy
- OWASP: Password Storage Cheat Sheet
- RFC 9106: Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications
- RustCrypto: argon2 crateとchacha20poly1305 crate
- Hacker News: Show HN: a hardware-bound local password vault hidden in a photo、コメント49509561
- Hacker News: comment on browser delivery of encrypted apps