趣味でUnityをいじっています。そこで、リリースビルドして配布する時に、リソースとなるファイルの中身の隠し方について質問があります。
前提:現状
Unityでノベルゲームのようなものを作っています。
ゲームプレイに関して、オンライン環境は想定しておらず、全てプレイヤーのローカル環境で完結する作りを想定しています。
ノベルゲームですので、画像をいくつか表示するシーンがあります。
そういう場面では、Resources.Loadを用いて画像取得をしているのですが、
このResourcesフォルダ下のリソースファイルについて、いくつか問題があります。
リリースビルドした後に、Resourcesディレクトリの中身をビルド後のディレクトリに移す必要があるかと思います。
しかし、そのまま移すだけですと、画像ファイルが丸出しになってしまいます。
私としては、これを見えなくしたい、隠したいと思っています。
そこで、暗号化すればよいのではないかと思い、色々調べてみたところ、
saltを用いてその都度初期化ベクトル、暗号化キーの変わるAESを用いる方法が堅牢だという情報に辿り着きました。
しかし、調べた限りでは、暗号化時、復号時ともに同じパスワードを指定する必要があるようです。
復号はゲーム内で行う必要があるハズで、
であれば、復号時に用いるパスワードはリリースビルド後に配布するファイル群のどこかに保持しておかなくてはならないハズです。
そうすると、結局パスワードは見つかってしまい、暗号化の意味が無いのでは?と考えています。
そこで、お尋ねしたい質問は以下の2点です。
質問
・私の考えに間違いがないか
・復号パスワードをどこに置けばいいのか
あなたの経験したこと、聞いたことのある方法についてお聞きしたいです。
前者の質問について:
私の考えに間違いがある場合はご指摘いただければ幸いです。
「~ハズ」と書いた部分の認識が間違ってたりするんじゃないかと思うのですが、どうでしょうか。
結局のところ、行いたいことは、配布時に画像やテキスト等のリソースを、プレイヤーから(ある程度)隠すことが出来る処置を施すことです。
なので、もっといい方法があるよ、なんて場合は、そちらを教えていただけますと幸いです。
後者の質問について:
現在は、
「あらかじめAES暗号化したファイルをResourcesディレクトリに配置して、パスワード・復号処理の書かれたcsファイルを用意しておく」
「配布ゲーム内で、そのcsファイルで復号したデータを用いる」
という流れを想定しています。
ここで、私は、リリースビルド時に、unityに組み込んだcsファイルがプレイヤーからどの程度隠されるのかが分かっていません。
「簡単にcsファイルの中は調べられるよ」という想定であるため、危険なのではないかと考えています。
パスワードをどう配置し、どうアクセスしたらよいでしょうか?について、お教えいただければ幸いです。
もし、リリースビルド時に組み込まれるcsファイルの中身を調べることが難しいとされているなら、この方法でも全然問題ないとも思うのですが…もしそうなら、その旨をお教えください。
もっと別の意見:
例えば、暗号化する意味なんて無いよ、など。
(オフラインなら、破ろうとされたならどうせ破られるし、せいぜいバイナリ変換するくらいがフツーだよ、的な意見)
そこらへんのさじ加減もよく分かっていないです。
こういう場合は、一般的に、Unityでゲーム作る会社はこういう処理をしてるよ、みたいなものをお教えいただきたいです。
それすら会社によってまちまちですと難しいですが…そういう場合は、実装が簡単だったり、より堅牢だったりする方法をお教えいただきたいです。
行いたいこと:
配布時に画像やテキスト等のリソースを、プレイヤーから(ある程度)隠すことが出来る処置を施すこと
(ある程度)と書いたのは、一般的に取られうる程度の処置を施したい、ということです。(完全に隠すことは無理だと思うので。)
今回は、その手法として私が考えたのが暗号化だったため、復号パスワードをどこに置くのか、についてお聞きしています。
最後に
長文失礼いたしました。
どうかご教授ください。よろしくお願いいたします。
追記に関して
Resources.Load()について、リリースビルド後に読み込めなくなる部分についてのコードです。
リリースビルド後にunity default resources、unity_builtin_extraファイルが生成されますが、
これだけだと動かず、Resourcesディレクトリ下に下記コードのpathのファイル群を移動することで動作するようになります。
現在、下記のような形で、画像を読み込み、生成して、ディクショナリーに格納しています。
この処理はゲームの起動時に行うようにしていて、
ノベルゲームのシーンでは、ディクショナリーから必要に応じて画像を参照し、ゲームオブジェクトのSpriteを変更するという処理を行っています。
C#
1// ファイルごとに処理 2foreach (FileInfo file in files) { 3 // スプライト読み込み 4 Sprite sprite = Resources.Load<Sprite>(path); 5 // ディクショナリーに格納 6 dict.Add(name, sprite); 7}
回答3件
あなたの回答
tips
プレビュー