ios - 钥匙串(keychain)可以像类固醇上的 NSUserDefaults 一样用于存储 NSData 吗?

标签 ios cocoa keychain keychainitemwrapper

可以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/

相关文章:

xcode - iOS 分发 : Migrating private key/certs to new machine

ios - 如何使用点表示法中的字符串访问属性?

iphone - 所有 View 的声音控制

iphone - 比较 Objective-c 中的 NSDates

xcode - 创建新的基于文档的核心数据项目时出现问题

ios - 在 iOS 上使用 Touch ID 加密数据

ios - 我应该在 iOS 应用程序中将图像保存到本地存储吗?

iOS 错误架构 armv7 的 undefined symbol ?

objective-c - 如何使用 Objective-C 获取正在运行的进程

ios - 未安装分发证书/私钥