可以Keychain像类固醇一样使用 NSUserDefaults
吗?我的意思是,例如,存储游戏中使用的 NSData
?
我的意图是存储一个 NSData
元素,它本质上是数组或字典的表示。
所以问题是:
假设我使用 Apple 的 KeychainItemWrapper
类创建了一个包装器。这个 kSecValueData
是否在引用 NSData
对象的钥匙串(keychain)文档中提到?
如果是这样我可以做到,对吗?
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myArrayOfDicts];
KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"myID" accessGroup:nil];
[keychain setObject:myData forKey:kSecValueData];
第二个问题:如果是这种情况,可以存储在钥匙串(keychain)项上的 NSData
大小是否有限制?
最佳答案
我认为没有任何限制,你肯定可以存储 NSData,但是性能不会很好。引用 Apple 的文档:
The keychain is intended for storing small amounts of sensitive data that are specific to your app. It is not intended as a general-purpose mechanism for encrypting and storing data.
我不会在钥匙串(keychain)条目中存储超过 1KB 左右的内容,您还应该避免拥有很多钥匙串(keychain)条目。
如果您需要加密大量数据,您应该生成一个随机的 AES-256 key 并将该 key 存储在钥匙串(keychain)中,然后使用 AES 加密您的大数据。在 keychain 上查找 RNCryptor 以获得一个很好的库来正确地实现这一点,并在 security.stackexchange.com 上询问任何特定的加密问题。
我也不会在 NSUserDefaults 中存储大量数据。它也不打算以这种方式使用。数据应存储在 NSSearchPathDirectory
下定义的相关目录之一的文件中,或者存储在 iCloud 中。
这是一个性能问题。使用钥匙串(keychain)和用户默认值的所有代码都基于只有少量数据的假设。它对于少量数据非常快,但大量数据会浪费内存和 cpu 周期/电池电量。在钥匙串(keychain)的情况下,您也在浪费用户的 LTE 带宽,因为每次更改都将通过互联网发送到他们拥有的每台设备。
我不认为 Apple 的应用程序审查团队会积极执行这些内容,但从技术上讲,将 API 用于预期目的以外的任何用途都会违反规则。
关于ios - 钥匙串(keychain)可以像类固醇上的 NSUserDefaults 一样用于存储 NSData 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23145889/