钥匙串可以像NSUserDefaults一样用于类固醇来存储NSData吗?

时间:2014-04-18 01:06:02

标签: ios cocoa keychain keychainitemwrapper

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大小是否有限制?

1 个答案:

答案 0 :(得分:7)

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

  

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

我不会在钥匙串条目中存储超过1KB左右的内容,您还应该避免使用大量的钥匙串条目。

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

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

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

我不认为Apple的应用审核小组会积极执行这些内容,但从技术上来说,违反了将API用于其他目的的规则。