SpriteKit 级数据安全性
Posted
技术标签:
【中文标题】SpriteKit 级数据安全性【英文标题】:SpriteKit Level Data Security 【发布时间】:2016-01-26 16:23:05 【问题描述】:我已经阅读了许多不同的帖子、线程等,这些文章、主题等都是关于存储要在整个游戏应用程序中使用的关卡数据(关卡边界数据、图像、角色、时间等)的最佳实践。
许多人建议使用Property List (.plist)
是合适的,因为存储游戏信息然后在需要时读取它非常简单。虽然这很容易创建和引用,但plist
文件在任何方面都不完全安全,除了简单的 AES 加密字符串内容。
另一种方法可能是将这些数据硬编码到一个单独的类文件中,标题为LevelData.m
,并直接引用类来读取关卡数据,因为以这种方式存储它应该“更安全”,因为(从什么我知道)一旦应用程序通过 ios App Store 进行打包和分发,用户就无法直接或根本无法访问这些类文件。
我还阅读了使用 SpriteKit 内置的 NSCoding,其中数据可以存档到文件(或 NSData 对象)中,然后从该存档中取消存档。
我的问题,任何人都可以建议最好的方法,或者我没有提到的方法吗?是的,我知道它们都是保存大数据的完全有效的方法,尤其是需要读取的重要且有些重复的数据,并且在安全措施方面各有利弊.我只是想找到最安全的方式来存储这些数据,而用户不能以任何方式篡改可能遇到类似问题并找到理想解决方案的其他人。
注意:我确信托管此数据服务器端并在应用程序启动时检索数据将是理想的安全方法。但是,我只是想看看哪种方法应该是严格通过在设备上存储数据的安全性方面的最佳实践。谢谢!
【问题讨论】:
【参考方案1】:如果您不信任用户,如何签署您不信任的数据完整性并使用公钥加密(在二进制文件中使用固定证书)验证签名?
因此,只能使用具有您有效签名的数据。
然而,毕竟,如果用户破解了您的二进制文件并修改了公钥,那也不起作用。
与这些问题一样,问题是:让对手破坏你的安全措施的难度有多大?什么难度有用?
【讨论】:
完全正确 - 我知道总有人愿意在任何和所有保护手段之外工作。我只是希望能够使用 AES 级加密尽可能轻松地存储我的数据。我不太确定您所说的使用签名验证是什么意思。这与仅仅加密数据有什么不同吗? 是的。然而,为了解释这一点,security.SE 可能是正确的地方,因为 crypto is hard 并且(a)对称加密和差异的解释确实超出了 SO 的限制。 我不太确定 security.SE 是什么 - 只是增强了安全性吗?【参考方案2】:我知道你已经得到了答案,但我个人使用带有 NSCoding 的 GameData Singleton 类。我将编码/存档的数据保存到 iOS 钥匙串中(而不是 NSUserDefaults、NSBundlePath 等)。
要保存到钥匙串中,您可以使用此助手
https://github.com/jrendel/SwiftKeychainWrapper
这是我用于我的应用程序的那个。它的工作方式与 NSUserDefaults 非常相似,因此非常易于使用。
您还可以在此处获得更复杂且功能更丰富的。
https://github.com/matthewpalmer/Locksmith
【讨论】:
创建一个包含关卡数据的类并从那里拉取它是不明智的吗? 我不这么认为。我相信重要的是游戏数据如何存储在您的设备上。如果您使用 NSUserdefaults 或 Plist,我认为人们可以更改保存的数据,因为它是纯文本格式且未加密。我还没有包含关卡数据的游戏,但据我了解应该是相同的想法。 我明白了——我的意思是我将存储关卡特定的数据(敌人数量、对象、bla bla),其中由玩每个关卡的用户创建的实际用户数据正在获取通过 Common Crypto 加密和保存。我觉得将级别数据硬编码到一个类中应该足够安全,不是吗? (防止任何人更改每个级别应包含的内容) 我想是的,我也是这方面的新手。我认为您不需要以这种方式安全地存储敌人数量等,可能不需要它。但是,您希望安全地存储诸如高分或应用内购买之类的内容。假设您有一个 allLevelsUnlocked 布尔值并将其保存为纯文本(用户默认值,Plist),那么人们可以更改此布尔值并使用该功能而无需付费。但是,我认为如果您尝试加密诸如敌人数量之类的东西,那就太过分了。 这本书很好看***.com/questions/27566483/…以上是关于SpriteKit 级数据安全性的主要内容,如果未能解决你的问题,请参考以下文章