ZDatabase
Unityでのデータ保存にはPlayerPrefsを使っているんですが、iOSのNSUserDefaultsと同じく簡単に改竄されてしまうので、暗号化出来るアセットないかなーと調べていた所,
ZDatabase - Unity Database - Asset Store |
やっぱりあった!さすがアセットストア!
DataBaseと言っても使い方はPlayerPrefsをほぼ同じで,特定のkeyを使って保存と読み込みするだけです。
しかし、ちょっと不満な所があったので改良してみました。
Encryption
とりあえず先に改良案を提示。
使い方は以下のような感じで、static classなのでどこからでも呼び出せます。
また、ZDatabaseを導入してる事が前提です。
//保存 Encryption.SaveInt ("key", 1); //読み込み int default = 0; int value = Encryption.LoadInt ("key", default);
実際に暗号化されたデータは以下のような感じです。
いい感じ!
ではでは、次項から改良点の説明です。
Key暗号化
ZDatabaseでは保存する値は暗号化されるんですが、keyは暗号化されないため、ZDatabase自体の暗号化用keyを適宜更新しないと改竄可能なんじゃないかなーと思いkeyも暗号化してみました。
(ZDatabase自体の暗号化用keyは ZDatabase.instance.ChangeDBKey(byte newKey) で更新できるらしいので必要ないっちゃない)
と言っても
パスワードで文字列を暗号化する - .NET Tips (VB.NET,C#...)
を使っただけですけどね…
保存時に入力されたkeyを暗号化し、暗号化されたkeyで保存。読み込み時も入力されたkeyを暗号化し、暗号化されたkeyで読み込みを行うといった具合です。
てか、保存する値もこうやって暗号化すればZDatabaseいらない…?
保存時の型指定と保存出来る型にQuaternionを追加
ZDatabaseは読み込み時にはReadEncIntのように型指定をするのですが、保存時には何でもWriteEncなので事故が怖いなーということで、各々の型で保存するメソッドを作りました。Texture2DとかVector2は現状保存する機会が無いので作ってないです。
逆にQuaternionは保存したいタイミングがあったので、Vector3に変換して保存、読み込み時はVector3で読み込んでQuaternionに変換し返すってな具合にしています。
読み込み時のデフォルト設定
読み込み時に指定されたkeyで保存されたデータが無い場合はデフォルト値を返すようにしたいのですが、stringやVector3にはデフォルト値の設定が無いようなので追加しました。
stringは
string.IsNullOrEmpty(loadStr)
で、読み込んだ値がNullまたは空ならデフォルト値を返す。
Vector3は
Vector3.Distance(loadVector3, Vector3.zero) == 0
で、(0, 0, 0)の座標が返って来たらデフォルト値を返す。
ようにしました。