在安全且独立于平台的 Unity 中保存游戏数据的最佳方式

The best way to save game data in Unity that's secure & platfrom independent

我正在寻找一种方法来保存用户的游戏进度,我正在寻找无法篡改的东西 with/modified。我希望能够独立于平台。我希望它存储在游戏文件中,以便用户可以将他们的数据传输到不同的计算机(使用闪存驱动器或其他东西)。 (如果我在任何方面有误,请纠正我)但我相信,因为我需要确保安全和平台独立,从而从等式中删除玩家偏好。我知道有一种方法可以通过使用二进制加密来保存数据,但我不知道它是如何工作的,也不知道用户是否可以将数据从一台计算机传输到另一台计算机。有没有更好的保存数据的方法?加密是通过二进制方式进行的吗?如果是这样我会怎么做?谢谢 :) 如果您有任何问题,请随时提出。

编辑:我知道没有什么是完全安全的,我正在寻找可以阻止普通用户进入文件、更改浮点数并在游戏中拥有大量金钱的东西。

unity中保存数据的第一种方式是使用PlayerPrefs,例如:

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

对于get,你只需要

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

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

1) 制作一个 class 来存储数据(不一定需要扩展单一行为:

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

并将其存储在另一个 class 中

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 文件中的数据。

前面的回答提到了两种存储数据的好方法(尽管在不同平台上写文件仍然存在一些怪癖),我想补充一下安全问题,如评论中所述。

首先,没有什么是完全安全的,总有一些更聪明的人会在你的代码中的某个地方发现一个缺陷,也许除非你想要完全加密,这对于密钥管理等来说并不是微不足道的。

我从问题中了解到,他想阻止用户在机器之间移动文件,或者允许他们在机器之间移动文件但将它们密封起来,以便用户无法轻易更改其中存储的数据。

在任何一种情况下,一个简单的解决方案都会起作用:从您的数据集中生成一个哈希码,稍微处理一下(对其加盐或做任何事情以跳转到另一个哈希码)。所以你可以有类似

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

如果 'protection' 字段是 "john1234" 的哈希码,它将不匹配 "john9999",因此如果用户不知道您如何加盐保护,您将能够看出保存已被篡改

我找到了一个 link 的数据加密工具,根据您的需要,它非常有用,因为您想保护设备上的数据(没有 100% 安全的),有 3 种模式来保护数据, APP、Device和Encryption key,您可以根据需要选择。

看到这个link,它可能对你有帮助。 https://forum.unity.com/threads/data-encryption-tool-on-assets-store.738299/