(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

PlayerPrefsの暗号化【Unity】【アセット】


このエントリーをはてなブックマークに追加

ZDatabase

Unityでのデータ保存にはPlayerPrefsを使っているんですが、iOSのNSUserDefaultsと同じく簡単に改竄されてしまうので、暗号化出来るアセットないかなーと調べていた所,




やっぱりあった!さすがアセットストア!

DataBaseと言っても使い方はPlayerPrefsをほぼ同じで,特定のkeyを使って保存と読み込みするだけです。

しかし、ちょっと不満な所があったので改良してみました。


Encryption

とりあえず先に改良案を提示。

使い方は以下のような感じで、static classなのでどこからでも呼び出せます。
また、ZDatabaseを導入してる事が前提です。

//保存
Encryption.SaveInt ("key",  1);
//読み込み
int default = 0;
int value = Encryption.LoadInt ("key", default);


実際に暗号化されたデータは以下のような感じです。


f:id:kan_kikuchi:20141108150718p:plain


いい感じ!
ではでは、次項から改良点の説明です。


Key暗号化

ZDatabaseでは保存する値は暗号化されるんですが、keyは暗号化されないため、ZDatabase自体の暗号化用keyを適宜更新しないと改竄可能なんじゃないかなーと思いkeyも暗号化してみました。
(ZDatabase自体の暗号化用keyは ZDatabase.instance.ChangeDBKey(byte newKey) で更新できるらしいので必要ないっちゃない)

と言っても
パスワードで文字列を暗号化する: .NET Tips: C#, VB.NET
を使っただけですけどね…

保存時に入力された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)の座標が返って来たらデフォルト値を返す。
ようにしました。