objective-c - 是什么让钥匙串(keychain)项目独一无二(在 iOS 中)?

我的问题与 iOS(iPhone、iPad 等)中的钥匙串(keychain)有关。我认为(但不确定)在 Mac OS X 下实现钥匙串(keychain)会引发相同的问题和相同的答案。


iOS 提供了五种类型(类)的钥匙串(keychain)项。您必须为键 kSecClass 选择这五个值之一来确定类型:

kSecClassGenericPassword  used to store a generic password
kSecClassInternetPassword used to store an internet password
kSecClassCertificate      used to store a certificate
kSecClassKey              used to store a kryptographic key
kSecClassIdentity         used to store an identity (certificate + private key)

在长时间阅读苹果文档、博客和论坛条目后,我发现 kSecClassGenericPassword 类型的钥匙串(keychain)项从属性 kSecAttrAccessGroup 获得其唯一性,kSecAttrAccountkSecAttrService.

如果请求 1 中的这三个属性与请求 2 中的相同,那么无论其他属性如何,您都会收到相同的通用密码钥匙串(keychain)项。如果这个属性中的一个(或两个或全部)改变了它的值,那么你会得到不同的项目。

kSecAttrService 仅适用于 kSecClassGenericPassword 类型的项目,因此它不能成为任何其他类型项目的“唯一键”的一部分,并且似乎没有文档清楚地指出哪些属性唯一地确定了钥匙串(keychain)项。

“GenericKeychain”的“KeychainItemWrapper”类中的示例代码使用属性kSecAttrGeneric 使项目唯一,但这是一个错误。此示例中的两个条目仅存储为两个不同的条目,因为它们的 kSecAttrAccessGroup 是不同的(一个具有访问组集,另一个让它自由)。如果您尝试使用 Apple 的 KeychainItemWrapper 添加没有访问组的第二个密码,您将失败。

那么,请回答我的问题:

  • kSecAttrAccessGroupkSecAttrAccountkSecAttrService的组合是不是真的是kSecClass为的keychain item的“唯一键” kSecClassGenericPassword?
  • 如果钥匙串(keychain)项的 kSecClass 不是 kSecClassGenericPassword,哪些属性使钥匙串(keychain)项独一无二?

最佳答案

主键如下(源自Apple的开源文件,参见Schema.m4、KeySchema.m4和SecItem.cpp):

  • 对于 kSecClassGenericPassword 类的钥匙串(keychain)项,主键是 kSecAttrAccountkSecAttrService.
  • 对于kSecClassInternetPassword类的keychain项,主键是kSecAttrAccountkSecAttrSecurityDomainkSecAttrServer的组合>、kSecAttrProtocolkSecAttrAuthenticationTypekSecAttrPortkSecAttrPath
  • 对于kSecClassCertificate类的keychain项,主键是kSecAttrCertificateTypekSecAttrIssuerkSecAttrSerialNumber的组合>.
  • 对于kSecClassKey类的keychain项,主键是kSecAttrApplicationLabelkSecAttrApplicationTagkSecAttrKeyType的组合>, kSecAttrKeySizeInBitskSecAttrEffectiveKeySize以及SecItem尚未公开的创建者、开始日期和结束日期。
  • 对于 kSecClassIdentity 类的钥匙串(keychain)项,我没有在开源文件中找到有关主键字段的信息,但作为身份是私钥和证书的组合,我假设主键是 kSecClassKeykSecClassCertificate 的主键字段的组合。

由于每个钥匙串(keychain)项都属于一个钥匙串(keychain)访问组,感觉就像钥匙串(keychain)访问组(字段kSecAttrAccessGroup)是所有这些主键的附加字段。

https://stackoverflow.com/questions/11614047/

相关文章:

objective-c - 以编程方式在 UINavigationController 中设置 UI

ios - UICollectionView 的 cellForItemAtIndexPath 没有

objective-c - 如何摆脱 Xcode 中的 "unused variable"警告?

objective-c - 有没有办法强制在 NSArray、NSMutableArray 等上输入

iphone - iPhone 上的 JSON 和核心数据

ios - 无法在模拟器中运行应用程序 : An error was encountered whi

ios - 如何删除 UIWebView 的所有 cookie?

java - Java接口(interface)和Objective-C协议(protocol)的区

iphone - Xcode 4.2 首选项 "Support Wirelessly Connect

iphone - Objective-C 将十六进制字符串解析为整数