Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 钥匙链可以像类固醇一样用于存储NSData吗?_Ios_Cocoa_Keychain_Keychainitemwrapper - Fatal编程技术网

Ios 钥匙链可以像类固醇一样用于存储NSData吗?

Ios 钥匙链可以像类固醇一样用于存储NSData吗?,ios,cocoa,keychain,keychainitemwrapper,Ios,Cocoa,Keychain,Keychainitemwrapper,可以像类固醇一样使用NSUserDefaults?我的意思是,例如,存储游戏中使用的NSData 我的目的是存储一个NSData元素,它本质上是数组或字典的表示形式 因此,问题是: 假设我使用Apple的KeychainItemWrapper类创建了一个包装器。钥匙链文档中提到的kSecValueData是指NSData对象吗 如果是这样的话,我可以做到,对吗 NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myArray

可以像类固醇一样使用
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
大小是否有限制?

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

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

我不会在一个钥匙链条目中存储超过1KB的数据,你也应该避免有很多钥匙链条目

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

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

这是性能的问题。所有使用keychain和用户默认值的代码都基于一个假设,即只有少量数据存在。对于少量数据来说,速度非常快,但大量数据会浪费内存和cpu周期/电池电量。在keychain的例子中,你也在浪费用户的LTE带宽,因为每一个变化都会通过互联网发送到他们拥有的每一台设备上


我不认为苹果的应用程序审查团队会积极执行这些内容,但从技术上讲,将API用于除预期用途以外的任何用途都会违反规则。

我想你想在删除/重新安装应用程序之间保留数据?这就是密钥链不同于用户默认值的地方,AFAIK.+1。为了与大家分享我们使用钥匙链的经验,我们开始发现,使用钥匙链越多,读/写性能就越差。我们无法确定到底是什么导致了这个问题(不是数据大小)。我们最终在不同的用户默认值plist文件中创建了一个加密存储,并将加密密钥存储在密钥链中以确保安全。最终,密钥链主要用于存储高达2048位的用户密码和加密密钥。12个字符的密码为96字节,2048位的密钥为256字节。你们真的不应该在钥匙链中存储比那个更大的东西。我想知道这是为什么。它们将数据序列化到加密的sqlite存储。我想知道整个过程的瓶颈在哪里。谢谢你。想法是用它来存储非常小的数据。你的回答太棒了。谢谢。@LeoNatan这可能与他们处理钥匙链加密的方式有关,这相当复杂,尤其是在iOS 7中,你可以从忘记的密码中恢复过来。它必须对所有数据进行多轮加密,其中一些数据具有潜在的弱加密密钥,需要在密钥派生函数上花费大量CPU能量。