4

钥匙串可以像NSUserDefaults类固醇一样使用吗?我的意思是,例如,存储NSData在游戏中使用?

我的意图是存储一个NSData元素,该元素本质上是数组或字典的表示形式。

所以问题是:

假设我使用 Apple 的KeychainItemWrapper类创建了一个包装器。这是kSecValueData在钥匙串文档中提到的NSData对象吗?

如果是这样,我可以做到这一点,对吧?

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myArrayOfDicts];
KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"myID" accessGroup:nil];
[keychain setObject:myData forKey:kSecValueData];

NSData第二个问题:如果是这种情况,钥匙串项目可以存储的大小是否有限制?

4

1 回答 1

9

我认为没有任何限制,您绝对可以存储 NSData,但是性能不会很好。引用 Apple 的文档:

钥匙串旨在存储少量特定于您的应用的敏感数据。它不是用于加密和存储数据的通用机制。

我不会在钥匙串条目中存储超过 1KB 左右的大小,您还应该避免有很多钥匙串条目。

如果您需要加密大量数据,您应该生成一个随机的 AES-256 密钥并将密钥存储在钥匙串中,然后使用 AES 加密您的大数据。在 keychain 上查找 RNCryptor 以获得一个好的库来正确实现这一点,并在 security.stackexchange.com 上询问任何特定的加密问题。

我也不会在 NSUserDefaults 中存储大量数据。它也不打算以这种方式使用。数据应存储在 下定义的相关目录之一的文件中NSSearchPathDirectory,或者存储在 iCloud 中。

这是性能问题。使用钥匙串和用户默认值的所有代码都基于只有少量数据存在的假设。少量数据的速度非常快,但大量数据会浪费内存和 CPU 周期/电池电量。而在钥匙串的情况下,你也在浪费用户的 LTE 带宽,因为每一次更改都将通过互联网发送到他们拥有的每台设备。

我不认为 Apple 的应用审查团队会积极执行这些内容,但从技术上讲,将 API 用于预期目的之外的任何事情都会违反规则。

于 2014-04-18T01:33:53.073 回答