ビルドした AAS のバンドルファイルには、接頭語にファイル内容を類推できる情報が付加されています。
groupa や database は、Addressable Group で指定した名前ですね。
assets はアセット、scenes はシーン(と、それに異存するアセット)、unitybuiltinshaders はシェーダーに関するファイルと類推できます。
まあ、正直この程度であればわかっても…という感じです。
イケメン.bundle
では、例えばこんなバンドルファイルがあったらどうでしょうか。
イケメン…!
これには「PCなんて詳しくないしぃ」という女子も思わずファイルからキャラクターの絵を抜き出すべく、アップを始めてしまうかもしれません。
シナリオが丸見え
他にも シナリオ_assets_all なんてあったらどうでしょう。
「読み込み速度を速くしたいから、無圧縮ファイルに」なんて考えてたらホラ、誰でも簡単にシナリオテキストを読むことが可能になってしまいます。
対策を考える
ここで「アセットバンドル暗号化しないとダメなんだ!」というのは最終段階、それをするには Provider の自作という茨の道。
今回はそこまでせず、もう少し簡単に、被害を抑える方法を考えてみましょう。
適切な Compression を設定する
まずはグループ「シナリオ」の Inspector から。
このうち、Compression は Uncompressed ではなく LZ4 か LZMA にしておくべきです。
これだけでも、素人がデータ内容を読み取ることは出来なくなります。
全部 LZMA にすれば解決! と思いがちですが、LZMA は圧縮展開にかなり時間がかかるという欠点があります。基本は LZ4 で、本当に隠蔽したい(軽量なファイル)は LZMA と使い分けるとよさそうです。
なお、公式ではローカルファイルなら LZ4、サーバーファイルなら LZMA にする事が最適なパフォーマンスを得られるという見解のようです。速度の速い順は、こんなイメージでしょうか。
(速い)ローカルファイル read > LZ4展開(CPU) >>> LZMA展開(CPU) > サーバーファイル read(遅い)
LZ4 や LZMA も、ちょっと優秀な解析班であれば無圧縮に戻すことが可能です。
さらに言えば、どんな複雑な暗号をかけようと神がかり的な解析班は解読してしまうし、暗号化は複雑になればなるほど読み込み速度の低下=ゲーム体験の劣化を招いてしまいます。
完璧な解決策はありませんが、なるべくゲームパフォーマンスを落とさず、素人~中級解析班が手を出さないだけでも、意味はあると思います。
Bundle Naming を変更する
そもそもイケメンだのシナリオだの、内容が類推できるファイル名がよくありません。
そこで、Bundle Naming を変更しましょう。
Bundle Naming を Use Hash of AssetBundle、Use Hash of Filename にするとファイル名は c9e737748edfbfb96023c22032b2d7f2.bundle のような名前となり、ファイル名だけで中身を類推することは不可能になります。
大量の bundle ファイルをバイナリエディタで開き、どんなファイルなのか確認するのはもう素人のすることではありませんので、これだけでも十分効果は高いと言えるでしょう。
catalog.json をなんとかする
このファイルは、バンドル前の生ファイル名がごっそりと確認できます。
これもかなりまずいですね…。
このファイルのバイナリ化については、別の記事で紹介しています。
おしまい
link.xml もなんとかしたかったんですが、こちらをどうにかする方法は探せませんでした…。
aa/ ってフォルダ名は「自分でなんか設定しちゃったか?」と思いましたが、Addressable Assets の略っぽいですね。