■はじめに
個人でゲームをリリースしようと考えているので、ファイルの保存方法について真面目に考えることにしました。
従来ではそのままJsonUtilityで中身丸見えの状態で保存してましたが、不正されてしまうので暗号化することにしました。
(が、タイトルにある通り、簡易的な暗号なのでセキュリティは結構弱めっぽいので、後々記事を更新したいです。)
●当記事のコードのUnityPackageのダウンロード↓
ここから該当コードをダウンロードできます。
■実行結果
■解説
こちらの動画を元に作成しました。分かりやすいです。↓
●設計
GameDataBase
と、DataManager
からそれぞれ派生させることで、設定データの保存、ゲーム内容の保存…などと細分化できます。
●暗号化
参考の動画の通り、XOR暗号というのを利用しています。
手軽に実装できますが、強度はあまりだそうです。
今回は、Jsonで保存されるデータの文字列とパスワード的な文字列のXORで暗号にしていきます
XORの性質として、(A ^ B) ^ B = A
というのがあるそうです。
A: 0011
, B: 0101
とすると、A ^ B = 0110
になります。
そこにBをXORさせると、 0110 ^ 0101 = 0011
と、Aになります。
これで、B
の部分に当たるパスワードさえあれば、A ^ B
からA
にしたり、A
からA ^ B
を作成することができます。
これのおかげで、実際にプログラムに落とし込んでも、メソッド1つで暗号化・復号化ができるってのがありがたいですね。
ですが、これをめちゃくちゃ高速で一つ一つ入力されたら、そのうちバレます。
なので、他の暗号使った方がよさそうです。(良いのが見つかり次第、当記事も更新します。)
■コード
リポジトリです↓
(newっていうフォルダのやつが該当のコードとか入ってるやつです)
また、基本的に上記の参考動画の方が分かりやすいと思うので、コードの詳細解説はしません。
ですが、個人的に一部改良しています。
-
DataManager
の細分化:複数のファイルに保存した方が管理しやすいため。 -
FileDataHandler
をstatic
にしてる:わざわざインスタンス化しなくてもいいかなって思ったため -
DataManager
のシングルトンなくしてる:シングルトンにして、アクセスしやすくなって危険だと思ったため。 - クライアントインターフェースを検索して
List
に格納するのをなくして、クライアント側からイベントを登録するようにしてる:Find
メソッドが重く、あまり好ましくないため。
こんな感じです。
■さいごに
暗号化について色々調べてみましたが、他のどの暗号使えばいいか分からないです🙄
AESってのが一番良さそう?
余裕とやる気ができたら、記事を更新します。
●参考