安全可靠地在Unity中保存游戏数据的最佳方法

时间:2019-01-26 02:00:12

标签: unity3d save unityscript platform-independent

我正在寻找一种方法来保存用户的游戏进度,我正在寻找一种不能被篡改/修改的东西。我希望能够独立于平台。而且我希望将其存储在游戏文件中,以便用户可以将其数据传输到其他计算机(使用闪存驱动器或其他工具)。 (如果在任何地方都错了,请纠正我)但是我相信,因为我需要保持安全和平台独立,这样才能从公式中删除玩家的偏好。我知道有一种通过用Binary加密数据来保存数据的方法,但是我不知道它是如何工作的以及用户是否可以在计算机之间传输数据。有没有更好的保存数据的方法?加密是通过Binary进行的吗?如果可以,我该怎么办?谢谢:)如果您有任何疑问,请随时提问。

编辑:我了解没有什么是绝对安全的,我正在寻找可以阻止普通用户进入文件,更改浮动货币并在游戏中拥有大量金钱的东西。

3 个答案:

答案 0 :(得分:2)

先前的答案提到了两种存储数据的好方法(尽管仍然存在一些有关在不同平台上写入文件的怪癖),我想补充一下安全性主题,如此处的评论所述。

首先,没有什么是完全安全的,总会有人在您的代码的某个地方发现缺陷,除非您希望完全使用加密,否则在密钥管理等方面并不容易。

从这个问题中我了解到,他希望阻止用户在计算机之间移动文件,或者允许他们在计算机之间移动文件但将它们密封,以使用户无法轻易更改存储在其中的数据。

在两种情况下,都可以采用一种简单的解决方案:从数据集中生成哈希码,对其进行一点处理(将其盐化或执行任何操作以跳转到另一个哈希码)。这样你就可以像

{
 "name"="john",
 "score"="1234",
 "protection"="043DA33C"
}

如果“保护”字段是“ john1234”的哈希码,则它将与“ john9999”不匹配,因此,如果用户不知道如何对保护加盐,您将能够知道保存已篡改

答案 1 :(得分:1)

统一保存数据的第一种方法是使用PlayerPrefs,例如:

PlayerPrefs.SetString("key","value");
PlayerPrefs.SetFloat("key",0.0f);
PlayerPrefs.SetInt("key",0);
PlayerPrefs.Save();

为了获得,您只需要

PlayerPrefs.GetString("key","default");

第二种方法以及允许您存储在独立文件中的方法是使用序列化,我更喜欢的方法是使用json文件。

1)创建一个将存储数据的类(不一定需要扩展单行为:

[System.Serializable]
public class DataStorer {
  public data1:String = "default value";
  public data2:Int = 4;
  public data3:bool = true;
  ....
}

并将其存储在另一个类中,

DataStorer dataStorer  = new DataStorer();
.... // some change in his data
string json = JsonUtility.ToJson(this, true);//true for you can read the file
path = Path.Combine(Application.persistantDataPath, "saved files", "data.json");
File.WriteAllText(path, json);

并用于读取数据

string json= File.ReadAllText(path);
DataStorer dataStorer = new DataStorer();
JsonUtility.FromJsonOverwrite(json, dataStorer);

现在您在dateStorer中加载了json文件中的数据。

答案 2 :(得分:0)

我找到了数据加密工具的链接,根据您的需要,该链接非常有用,因为您要保护设备上的数据(没有100%安全),因此有3种模式来保护数据,APP,设备和加密密钥,您可以根据需要选择。

查看此链接,可能会对您有所帮助。 https://forum.unity.com/threads/data-encryption-tool-on-assets-store.738299/

相关问题