使用 KeyChain 在 iOS 中存储数百个值的缺点

Downsides of Storing Hundreds of Values in iOS using KeyChain

我希望在 Swift 中开发一款具有以下潜在要求的游戏:

  1. 可以离线播放
  2. 它提供了从其他设备保存和重新加载的能力
  3. 游戏可以访问布尔数据值,以确定玩家是否解锁了游戏中的关卡,以及他们购买了什么(他们拥有多少金币、解锁的物品等)。
  4. 数据不能被篡改(我不希望有人在没有合法购买的情况下给自己金币或解锁强大的武器)

我认为 KeyChain 是一个很好的方法,原因如下:

  1. 我可以将数据存储为 key/value 对并离线访问它们(非常适合我的 true/false 值,因为 levels/items 已解锁)
  2. 整个数据集合可以导出为 name/value 对,因此我可以使用 CloudKit/GameCenter 将整个字典(仅几行代码)发送到用户帐户,并且然后让它与其他用户设备同步(通过导入该数据)。
  3. 它提供了非常强大的安全性

将 KeyChain 用作穷人的数据库对我来说感觉很奇怪,但由于我列出的上述原因,我认为它可以工作。

问题是我可以看到 name/value 对在 200-300 范围内的某个地方。你会说在 KeyChain 中存储这么多值是一个错误的决定吗?似乎还不是特别慢。

我的另一种选择是使用数据库,但是其中许多值只是 true/false(解锁了哪些级别,解锁了 sword-1,解锁了 armor-3,获得了总金币等)。我想游戏可能会发展到突然变得太强大而无法使用 KeyChain 管理所有这些(我使用 SQLCipher 加密数据库)但我想询问社区对在 KeyChain 中存储这么多值的意见。

谢谢!

您可以将您的信息存储在 plist、csv 或数据库或文档目录中的任何其他类型的文件中并加密。将密钥存储在钥匙串中并使用它们的密钥来解密文件。有很多 cryptography pods 可以为您完成这一部分,因此您不必处理 C 与普通加密互操作的乐趣。