🐕

【VRChatter以外にも】これが最強の、撮影した大切なVRChat写真を暗号化してクラウドに上げる方法【自分以外にデータを閲覧させない】

に公開

追記: Cryptomatorの有志の開発版をビルドするのが一番よかった

これはAndroid開発環境が揃っている人向けの、adbコマンドを使った解決方法です。
一般ユーザーには難しいかもしれないので、その場合は通常通り、このセクションを飛ばして、記事を読んでください。

追記内容

後述'3. Android側の設定(DroidFS)> (3-3.) Extra: 4K, 8Kの写真を撮っているユーザー向け設定'

DroidFSが非常にセキュリティを重視しているため、この状態だと4K, 8Kの写真などが、以下のエラーで開けない場合があります。
...
またおそらく同じ原因で、サムネイルも生成されないことがあります。

と書きましたが、解決策が見つかりました。
JustFanta01氏 ・ WheelyMcBones氏 ・ taglioIsCoding氏 らが開発してくださった、開発版'Gallery/Grid view'を自分でビルドして、使うことです!


追記に追記

上のJustFanta01氏らのものもバグが起こっていたので、僕が直した版を以下に上げておきました。


まだバグは残っているので、開発中です。
でも元のものより使えると思います。

以下のバグが残っています。

  • フォルダ中の画像をタップしまくって、サムネ生成を同時に行わなうと(進捗バーを複数出す)と、画像表示画面が連続して開こうとして、「エラーが発生しました」になる
  • 画像をタップして、サムネイルを読み込んだ後に、少しスワイプしてスクロールを与えないと、サムネイルが再表示されない(サムネイル生成・キャッシュ自体はできている)

改善できていない箇所は以下。

  • フォルダ内のサムネイルを一気に読み込む機能がない
    • そのため画像をタップしまくってサムネイル生成をさせまくる必要があるが、上述のバグに当たる
      • 今はこのバグを受け入れて、「エラーが発生しました」と言われたら、おとなしくバックボタンで戻って、ちょっと指でスクロールするのがコツ
      • もしくは後述の「Generate Per File」を「Generate Per Folder」にしてもいいが、後述する通り遅い

もしこれを使う場合は、後述の以下の箇所を

# サムネイル生成に対応したブランチに切り替え
$ git remote add JustFanta01 https://github.com/JustFanta01/cryptomator-android
$ git switch feature/thumbnail-playground

以下に読み替えてください。

# サムネイル生成に対応したブランチに切り替え
$ git remote add aiya000 https://github.com/aiya000/cryptomator-android-JustFanta01
$ git switch feature/thumbnail-playground

以下のようにして、アプリをビルドできます。


各クラウドストレージにCryptomatorから繋ぎたい場合は、cryptomator/android > README.mdを参照し、APIアクセスキーを取得して、環境変数を先に設定してください。
そうしない場合、アプリ内でクラウドストレージにつなぎに行くと、エラー画面が表示されます。
ここでアクセスキーを取るのが難しければ、後述の'クラウドストレージ上にある暗号化フォルダを、ローカルに同期'を使う方法もあります。

$ git clone https://github.com/cryptomator/android
$ mv android cryptomator-android # ディレクトリ名が'android'だと何なのかわからなくなる未来が見えるので、一応リネーム
$ cd cryptomator-android

# 一応、Cryptomatorが自分の環境でビルドできることを確認
# 必要ないと思うならやらなくてOK
$ git switch release/1.11.1 # 1.11.1は、記事執筆時点での最新リリースです。最新のものを使ってください。
$ cd buildsystem
$ docker build -t cryptomator-android .
$ cd ..
$ docker run --rm -u $(id -u):$(id -g) -v $(pwd):/project -w /project cryptomator-android ./gradlew clean assembleLiteRelease
# OKなら次に進む。まあここでdocker関連のエラーが出ても、見過ごしていいと思えるならOK

# Androidを開発者モードにして、adbで疎通できるようにしておく
# ここは本筋ではないので、割愛

# なんらかの方法で、自分のAndroid端末にadbで繋ぐ
# ここでは'ワイヤレス デバッグ'
$ adb pair {自分のAndroid端末のIPアドレス}:{pair用のポート番号}
$ adb connect {自分のAndroid端末のIPアドレス}:{connect用のポート番号}

# ここから本題

# サムネイル生成に対応したブランチに切り替え
$ git remote add JustFanta01 https://github.com/JustFanta01/cryptomator-android
$ git switch feature/thumbnail-playground

# ビルド
$ ./gradlew assemblePlaystoreDebug # 僕はGoogle PlayでCryptomatorを購入済みだったので`assemblePlaystoreDebug`でビルド。その他のストアでインストールをしていた場合(ライセンスキーを直接購入していた場合)は後述の「ライセンスキーを直接購入していた場合」を代わりに実行してください
$ ls presentation/build/outputs/apk/playstore/release/presentation-playstore-release-unsigned.apk
presentation/build/outputs/apk/playstore/release/presentation-playstore-release-unsigned.apk
$ apk_path=presentation/build/outputs/apk/playstore/release/presentation-playstore-release-unsigned.apk # ここでの説明のために仲介

# ライセンスキーを直接購入していた場合 -- Google PlayでCryptomatorを購入済みの場合は、こちらではなく、上述の「ここから本題」を代わりに実行してください
$ ls presentation/build/outputs/apk/apkstore/release/presentation-apkstore-release-unsigned.apk
presentation/build/outputs/apk/apkstore/release/presentation-apkstore-release-unsigned.apk
$ apk_path=presentation/build/outputs/apk/apkstore/release/presentation-apkstore-release-unsigned.apk # ここでの説明のために仲介

$ ls $ANDROID_HOME/build-tools/*/apksigner
/home/{your-name}/Android/Sdk/build-tools/{your-version}/apksigner

$ /home/{your-name}/Android/Sdk/build-tools/{your-version}/apksigner sign --ks presentation/debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android --key-pass pass:android "$apk_path"
(keystoreのパスワードはデフォルトで'android')
$ adb install "$apk_path"

そしてアプリを起動し、設定画面から「キャッシュ > Thumbnail generation」を「Generate Per File」にする(「Generate Per Folder」にして、フォルダアクセス時にフォルダ内の全てのファイルを生成してもいいが、生成が遅い。Per Fileにして、自分で画像を開きまくる方が、なぜか生成が速い)

ヨシ!

はじめ

この記事は、筆者のような「クラウドストレージ事業者にも渡したくない」という人向けの記事です🐕

「秘密にしたい画像をクラウドストレージに上げつつ、クラウドストレージサービスを提供している会社および社員・作業員(※)にのぞき見られるのを不可能にしたい」
という要望を実現する手順を、解説します!

※ 本稿ではこれらをクラウドストレージ事業者と呼称します


まとめ

暗号化した写真[2]をクラウドストレージに上げる方法として、主に3つの選択肢があります。

1. Cryptomator

Cryptomatorは最も有名で簡単な暗号化ツールです。
どこかのVRChatter向けの記事でも既に紹介されているかもしれません。
Cryptomator公式がWindows・Android・iOS・macOS・Linuxの全てのクライアントを用意してくれているため、導入が非常に簡単です。

ただし、Androidアプリでは写真をサムネイル表示で一覧できないという致命的な問題があります。
Google Playのレビューでも多くのユーザーがこの点を指摘しており、VRChat写真を頻繁に見返したい人には不向きです。

2. CryFS + SiriKali + DroidFS

CryFSは暗号化ツールの一つで、SiriKaliというWindows向けGUIクライアントと、DroidFSというAndroid向けクライアントを組み合わせて使います。

CryFSは本来コマンドライン( 黒い画面のやつ -cmd.exe- や水色の画面のやつ -PowerShell- )で操作する必要がありますが、SiriKaliがグラフィカルに操作できるようにしてくれます。

DroidFSはGoogle Playにはありませんが、F-Droidという信頼できる非公式Androidアプリストアから入手できます。
このアプリの素晴らしい点は、写真をグリッドでサムネイル表示してくれることです!
自撮りVRChat勢や風景写真勢には嬉しい機能ですね。

しかし筆者の環境では、SiriKaliとコマンドラインでのcryfsコマンド実行の両方でinvalid code sequenceエラーが発生し、使用できませんでした。
2019年に同様の報告がありましたが、現在も解決されていないようです。

3. gocryptfs + cppcryptfs + DroidFS(推奨)

gocryptfsはCryFSと同様の暗号化ツールで、cppcryptfsというWindows向けGUIクライアントと組み合わせて使用します。
DroidFSはgocryptfsにも対応しているため、Androidでもサムネイル表示で写真を閲覧できます。

筆者が実際に3つの構成を試した結果、「この組み合わせが最適解」だと判断しました。
理由は以下の通りです:

gocryptfs + cppcryptfs + DroidFSの利点

  • DroidFS(Android向けクライアント)で写真を、グリッドのサムネイル表示で一覧できる!
    自撮りVRChat勢・風景写真勢には必須の機能ですよね…!!!
  • cppcryptfsの使い勝手が良く、安定して動作する

他の選択肢の問題

  • Cryptomatorは簡単で素晴らしいツールですが、写真のサムネイル表示ができないため、VRChat写真の管理には不向き
  • CryFS + SiriKali構成は筆者の環境では技術的な問題で動作しなかった

そこで本記事では、gocryptfs + cppcryptfs + DroidFSによる環境構築手順を詳しく解説していきます。

「gocryptfs + cppcryptfs + DroidFS」の環境構築手順

この方法では、以下の流れで環境を構築します:

  1. Windows PC側の設定:cppcryptfsをインストールして暗号化フォルダを作成
  2. VRChat連携の設定:VRChatの写真保存先を暗号化フォルダに変更
  3. Android側の設定:DroidFSをインストールして写真を閲覧できるようにする
  4. クラウドストレージとの連携:暗号化されたフォルダをクラウドに同期

1. Windows PC側の設定

1-1. cppcryptfsのインストール

  1. cppcryptfsの公式サイトからインストーラーをダウンロードします
  • 1-1. 'Releases'に飛ぶ
    • スクリーンショットのバージョンは1.4.4.6。開発状態によりバージョンは上がります。よしなに選んでください

こんな ↓ 画面に飛びます! こわくないよ

今はここ ↓ からダウンロードのみしておいてください。

  • 1-2. まずは'Dokan'という必要なライブラリを、先にインストールします
    • 暗号化フォルダをWindowsドライブ(V:ドライブなど)にマウントできるようにしてくれるやつです
    • ※インストール必須

'cppcryptfs 1.4.4.6'のReleasesページには、Dokanへのリンクがあったので、そこからアクセスします。
いちおうこちらにもリンクを貼っておきます!

Releases - dokan-dev/dokany - GitHub

  1. ダウンロードしたDokanのインストーラーを実行してインストールします

インストーラーの手順に従ってください。

  1. ダウンロードしたcppcryptfsのインストーラーを実行してインストールします

こちらもインストーラーの手順に従ってください。
これでインストール手順は完了です!

1-2. 暗号化フォルダの作成

  1. cppcryptfsを起動し、Createタブを表示します

Path, Password, Repeat(Passwordと同様の文字列), Volume labelを入力します。
Volume labelはoptional(任意)と書いてありますが、後述のmklinkのために、設定しておきましょう!
筆者はVRChatの接頭辞を取ってV:としました。

暗号化フォルダの保存場所(Path)は、ここではクラウドストレージ(pCloudやGoogle Drive・NAS・その他)がマウントされているドライブの、その上をフォルダを指定しましょう。
筆者はpCloudを使用しているので、pCloud上のドライブがP:にマウントされています。
そのためP:\VRChatを指定しました。

Google Driveだと、マウントされるのはG:だったでしょうか。
それを鑑み、Pathにはその他NASなどをマウントしたドライブ(Z:など)の上を(G:\VRChat, Z:\Pictures\VRChatなど)指定しましょう。

Selectボタンで、GUIでもフォルダを選択できます。
Pathを直に入力した場合でも、そのフォルダが存在しない場合は(ダイアログが出て)自動作成してくれるので、安心です!

  1. 「Create」ボタンをクリックして新しい暗号化フォルダを作成します
  • 小まとめ
    • 暗号化フォルダの場所Path): クラウドストレージと同期するフォルダ内(例: P:\VRChat, G:\Pictures\VRChat, Z:\どこか
    • マウント先ドライブ: V:ドライブ(V:でなくてもいいですが、以降のV:を、自身が設定したものに読み替えてください)

gocryptfsは企業サポートなどはないので、Passwordに指定したパスワードは、絶対に忘れないでくださいね
さもなくば、データは永遠に失われます
絶対に忘れるなよ!?!?

1-3. VRChat写真フォルダのシンボリックリンク作成

VRChatの写真が自動で複合化フォルダに作成され、暗号化された状態でクラウドに同期されるように、
VRChatの写真が保存されるフォルダ(通常は"C:\Users\{あなたのWindowsユーザー名}\Pictures\VRChat")を、複合化フォルダにリダイレクトします。

といってもこれについては、こはちゃんの'VRChatの写真(スクリーンショット)の保存先を別の場所に変更するやり方と、スマホから確認する方法! | こはろぐ'が詳しいです。
こちらを参照しつつ、管理者権限のコマンドプロンプトで、今回の場合、以下を実行してください。
[3]

mklink /d "C:\Users\{あなたのWindowsユーザー名}\Pictures\VRChat" "V:"

これで……環境構築は終わりです!!!
おつかれさまでした!!!

2. VRChatでの使用方法

TODO: Windows起動時に「暗号化フォルダのマウント」がされるようにする。今は手動でマウントする手順を記載している

2-1. 暗号化フォルダのマウント

VRChatを起動する前に、必ずcppcryptfsで暗号化フォルダをマウントします。

  1. cppcryptfsを起動
  2. 作成した暗号化フォルダを選択
  3. パスワードを入力
  4. 「Mount」ボタンをクリック

2-2. VRChatでの写真撮影

通常通り、VRChatで写真を撮影します。
写真は自動的に暗号化されて、クラウドストレージに保存されます。

WindowsのV:ドライブ上では、複合化された状態で、写真を閲覧することができます!

3. Android側の設定(DroidFS)

3-1. DroidFSのインストール

  1. F-Droidアプリをインストール

ここではF-Droidのインストール方法は省略します。
再度ローディングになりますので、各自自己責任で、よろしくお願いします!
[4]

  1. F-Droid内でDroidFSを検索してインストール

3-2. DroidFSでの写真閲覧

  1. クラウドストレージ上にある暗号化フォルダを、ローカルに同期 ※A
    • 例えばクラウドストレージサービスがpCloudなら、pCloudアプリでフォルダの「...(縦)」をタップして、「オフラインで利用可能にする」を実行すればよいかもしれません
    • 筆者は定期的に同期を行うため、ホーム画面に同期ボタンを置けるX-plore File Managerを選択しました

OR

  1. DroidFSを起動
    1. (+)ボタン → Pick a directory」を押し、「※A」で選択したディレクトリを「このフォルダを使用」します
      • Hidden volumeはオフのままでOKです
  2. 暗号化フォルダが一覧に追加されるので、そのフォルダをタップし、パスワードを入力します
  3. 写真がサムネイル表示で一覧されます!

おおおおおおおお!!!!!
勝ち申したな!!!!!!!!

(3-3.) Extra: 4K, 8Kの写真を撮っているユーザー向け設定

写真をリッチに撮っている人達は、もうちょっとだけ続くんじゃぞい。
現段階で「サムネイル表示」「(サムネイルをタップして)画像表示」ができている方は、このステップを読み飛ばしてもらって構いません。

DroidFSが非常にセキュリティを重視しているため、この状態だと4K, 8Kの写真などが、以下のエラーで開けない場合があります。

またおそらく同じ原因で、サムネイルも生成されないことがあります。

現在以下で修正案が模索されている気がしますが、まだ決定打が見つかっていないようです。

これは設定で、ほんの少しだけ緩和が可能です!

※操作ミスがない限り、今回の設定で写真がリークするとは思いませんが、一応自己責任とさせてください

  1. 歯車

  1. 'Manage unsafe features'
    • その先の'About'にある'Unsafe features documentation'は読んだ方がいいかもしれません

  1. 'Export method'

  1. 'Temporary export on disk'

これで

やったあああああああああ!!!!!!!!!!
勝ち申した!!!!!!!!!

[5]

運用のコツとトラブルシューティング

日常的な使い方

  1. VRChat起動前:cppcryptfsで暗号化フォルダをマウント
  2. VRChat終了後:必要に応じてアンマウント(PC再起動時は自動でアンマウントされます)
  3. スマホで写真確認:DroidFSアプリから写真を閲覧

よくあるトラブル

「VRChatフォルダにアクセスできません」エラー

  • cppcryptfsで暗号化フォルダがマウントされているか確認
  • V:ドライブが表示されているか確認

スマホで写真が見られない

  • クラウドストレージの同期が完了しているか確認
  • DroidFSで正しいパスワードを入力しているか確認

セキュリティ上の注意点

  • パスワードは絶対に忘れないでください。パスワードを忘れると写真にアクセスできなくなります
  • 可能であれば、パスワードマネージャーでパスワードを管理してください

まとめ

この方法により、クラウドストレージ事業者は暗号化されたファイルしか見ることができません
写真の内容を知ることができるのは、パスワードを知っているあなただけです。

VRChatの写真を安全にクラウドに保存しつつ、PCでもスマホでも快適に閲覧できる環境が整いました。
やったぞー!!!

脚注
  1. クライアントA(例えばPC)にあるデータを暗号化し、次に別のストレージX(例えばGoogle Drive)に暗号化されたデータをアップロードして、最後にクライアントB(例えばAndroid)でデータを表示できるようにする(復号化できるようにする)技術のこと。この場合、ストレージXからデータを読み取ってもそれは暗号化されているため、その状態のデータは表示できません。このため、攻撃者(盗人)に特に強い、秘匿性の高い暗号化フローになっています。 ↩︎

  2. ここで主題の通り、あえてターゲットを「写真」と言っていますが、これらの選択肢には全てのファイルが上げられます(普通の使い方の範疇なら)。
    今回は写真をきれいに一覧したいという趣旨に基づき、「写真」と言っています ↩︎

  3. PowerShellはなぜかmklinkコマンドを持っていないぞい! コマンドプロンプト(cmd.exe)を使おう! ↩︎

  4. まあ、F-Droidはかなり信用できるサードパーティストアだと思っています。 ※ 筆者は一切責任を持たないものとします ↩︎

  5. 4K, 8Kの写真を撮影している方は、'DroidFS Settings'(歯車ボタンの先)ページで'Maximum size for thumbnails'を100MB(100000)くらいに設定しておきましょう ↩︎

Discussion