[unity]Addressable Asset System(AAS)のbundle内容を簡単に読み取られないようにしたい

ビルドした AAS のバンドルファイルには、接頭語にファイル内容を類推できる情報が付加されています。

groupa database は、Addressable Group で指定した名前ですね。

assets はアセット、scenes はシーン(と、それに異存するアセット)、unitybuiltinshaders はシェーダーに関するファイルと類推できます。
まあ、正直この程度であればわかっても…という感じです。

イケメン.bundle

では、例えばこんなバンドルファイルがあったらどうでしょうか。

イケメン…!

これには「PCなんて詳しくないしぃ」という女子も思わずファイルからキャラクターの絵を抜き出すべく、アップを始めてしまうかもしれません。

シナリオが丸見え

他にも シナリオ_assets_all なんてあったらどうでしょう。
「読み込み速度を速くしたいから、無圧縮ファイルに」なんて考えてたらホラ、誰でも簡単にシナリオテキストを読むことが可能になってしまいます。

バイナリデータ閲覧ツールで、シナリオ丸見え

対策を考える

ここで「アセットバンドル暗号化しないとダメなんだ!」というのは最終段階、それをするには Provider の自作という茨の道。

今回はそこまでせず、もう少し簡単に、被害を抑える方法を考えてみましょう。

適切な Compression を設定する

まずはグループ「シナリオ」の Inspector から。

このうち、Compression Uncompressed ではなく LZ4 LZMA にしておくべきです。
これだけでも、素人がデータ内容を読み取ることは出来なくなります。

LZ4: 全く読めなくはないが、読む気はおこらない
LZMA: 完全にわからない

全部 LZMA にすれば解決! と思いがちですが、LZMA は圧縮展開にかなり時間がかかるという欠点があります。基本は LZ4 で、本当に隠蔽したい(軽量なファイル)は LZMA と使い分けるとよさそうです。
なお、公式ではローカルファイルなら LZ4、サーバーファイルなら LZMA にする事が最適なパフォーマンスを得られるという見解のようです。速度の速い順は、こんなイメージでしょうか。

(速い)ローカルファイル read > LZ4展開(CPU) >>> LZMA展開(CPU) > サーバーファイル read(遅い)

LZ4 LZMA も、ちょっと優秀な解析班であれば無圧縮に戻すことが可能です。
さらに言えば、どんな複雑な暗号をかけようと神がかり的な解析班は解読してしまうし、暗号化は複雑になればなるほど読み込み速度の低下=ゲーム体験の劣化を招いてしまいます。
完璧な解決策はありませんが、なるべくゲームパフォーマンスを落とさず、素人~中級解析班が手を出さないだけでも、意味はあると思います。

Bundle Naming を変更する

そもそもイケメンだのシナリオだの、内容が類推できるファイル名がよくありません。
そこで、Bundle Naming を変更しましょう。

Use Hash of Filename に

Bundle Naming を Use Hash of AssetBundleUse Hash of Filename にするとファイル名は c9e737748edfbfb96023c22032b2d7f2.bundle のような名前となり、ファイル名だけで中身を類推することは不可能になります。

大量の bundle ファイルをバイナリエディタで開き、どんなファイルなのか確認するのはもう素人のすることではありませんので、これだけでも十分効果は高いと言えるでしょう。

catalog.json をなんとかする

このファイルは、バンドル前の生ファイル名がごっそりと確認できます。
これもかなりまずいですね…。

このファイルのバイナリ化については、別の記事で紹介しています。

おしまい

link.xml もなんとかしたかったんですが、こちらをどうにかする方法は探せませんでした…。
aa/ ってフォルダ名は「自分でなんか設定しちゃったか?」と思いましたが、Addressable Assets の略っぽいですね。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA