在安全且独立于平台的 Unity 中保存游戏数据的最佳方式
Posted
技术标签:
【中文标题】在安全且独立于平台的 Unity 中保存游戏数据的最佳方式【英文标题】:The best way to save game data in Unity that's secure & platfrom independent 【发布时间】:2019-01-26 02:00:12 【问题描述】:我正在寻找一种方法来为我的游戏保存用户进度,我正在寻找不能被篡改/修改的东西。我希望能够独立于平台。而且我希望它能够存储在游戏文件中,以便用户可以将他们的数据传输到不同的计算机(使用闪存驱动器或其他东西)。 (如果我在任何方面错了,请纠正我)但我相信,因为我需要安全且独立于平台,从而将玩家偏好从等式中移除。我知道有一种方法可以通过使用二进制加密来保存数据,但我不知道它是如何工作的,以及用户是否可以将数据从计算机传输到计算机。有没有更好的数据保存方式?加密是通过二进制方式吗?如果是这样,我会怎么做?谢谢 :) 如果您有任何问题,请随时提出。
编辑:我知道没有什么是完全安全的,我正在寻找可以阻止普通用户进入文件、更改浮点数以及在游戏中获得大量金钱的东西。
【问题讨论】:
What is the best way to save game state?的可能重复 【参考方案1】:前面的答案提到了两种存储数据的好方法(尽管在不同平台上写入文件仍然存在一些怪癖),我想补充一下安全主题,正如评论中提到的。
首先,没有什么是完全安全的,总会有更聪明的人会在你的代码中发现缺陷,除非你想要完全加密,这对于密钥管理等来说并非易事。
我从问题中了解到,他想阻止用户在机器之间移动文件,或者允许他们在机器之间移动文件但将它们密封,以便用户无法轻易更改其中存储的数据。
在任何一种情况下,一个简单的解决方案都会起作用:从您的数据集生成一个哈希码,稍微修改一下(加盐或做任何事情以跳转到另一个哈希码)。所以你可以有类似的东西
"name"="john",
"score"="1234",
"protection"="043DA33C"
如果“保护”字段是“john1234”的哈希码,它将与“john9999”不匹配,因此如果用户不知道您如何添加保护,您将能够判断保存已篡改
【讨论】:
澄清一下,我希望允许用户在机器之间传输文件,但不能篡改文件。我知道没有什么是完全安全的,但我正在寻找可以阻止普通用户进入文件、更改浮点数并能够非常轻松地做任何事情的东西。 如果用户能够读取数据没问题,我提出的解决方案就足够了 他们将能够修改文件,但如果校验和不匹配,您将文件视为无效,因此任何简单的修改都不会生效【参考方案2】:统一保存数据的第一种方法是使用 PlayerPrefs,例如:
PlayerPrefs.SetString("key","value");
PlayerPrefs.SetFloat("key",0.0f);
PlayerPrefs.SetInt("key",0);
PlayerPrefs.Save();
对于get,你只需要
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 文件中的数据。
【讨论】:
您的回答确实解释了保存数据,但这并不安全。它很容易被篡改 @Immorality 没有什么是真正安全的,这取决于您希望在数据安全方面走多远,但对于游戏保存之类的东西,我什至将数据的加盐校验和作为字段放置会阻止大多数饼干PlayerPrefs
本质上是不安全的,因为它不用于保存数据。它旨在存储 选项例如音量、静音状态、全屏或窗口等。如果玩家在游戏未运行时编辑纯文本文件不会导致不良行为。
@Marco Alonso Friz Palavecino 好的,json 文件在系统上的位置,我知道没有什么是完全安全的,但它是否比 Player Prefs 好得多?
对于它的保存位置,unity 在每个系统中都有一个“存储文件夹”,它是 persistantDataPath 。当玩家想要将他的文件移动到随身碟时,您可以要求将文件夹存储到播放器并在存储文件时更改 path 字符串来移动文件。为了增加安全性,您可以添加 md5 或 sh1 哈希码来检查文件的完整性,并且您可以将文件存储为 zip 格式以便更难更改【参考方案3】:
我找到了一个数据加密工具的链接,根据您的需要非常有帮助,因为您想保护设备上的数据(没有 100% 安全),有 3 种保护数据的模式,APP,设备和加密密钥,您可以根据需要进行选择。
查看此链接,它可能会对您有所帮助。 https://forum.unity.com/threads/data-encryption-tool-on-assets-store.738299/
【讨论】:
以上是关于在安全且独立于平台的 Unity 中保存游戏数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
[游戏开发-学习笔记]菜鸟慢慢飞(11)- Unity3D中的Json
什么是在 Unity3D 制作的游戏中保存游戏进度的最佳实践,以及适用于 Android 和 iOS 的不同版本