Keychain可以像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
大小是否有限制?
答案 0 :(得分:7)
我认为没有任何限制,你绝对可以存储NSData,但性能不会很好。引用Apple的文档:
钥匙串用于存储特定于您的应用的少量敏感数据。它不是用于加密和存储数据的通用机制。
我不会在钥匙串条目中存储超过1KB左右的内容,您还应该避免使用大量的钥匙串条目。
如果需要加密大量数据,则应生成随机AES-256密钥并将密钥存储在密钥链中,然后使用AES加密大型数据。在keychain上查找RNCryptor以获得一个好的库来正确实现它并在security.stackexchange.com上询问任何特定的加密问题。
我也不会在NSUserDefaults中存储大量数据。它也不打算以这种方式使用。数据应存储在NSSearchPathDirectory
下定义的相关目录中的文件中,或者存储在iCloud中。
这是表现的问题。用于处理钥匙串和用户默认值的所有代码都基于假设只有少量数据。它对于少量数据来说非常快,但是更大的数量会浪费内存和CPU周期/电池电量。在钥匙串的情况下,您也在浪费用户的LTE带宽,因为每次更改都将通过互联网发送到他们拥有的每台设备。
我不认为Apple的应用审核小组会积极执行这些内容,但从技术上来说,违反了将API用于其他目的的规则。