Hub*_*ast 96 macos objective-c keychain ios
我的问题涉及iOS(iPhone,iPad,...)中的钥匙串.我认为(但不确定)Mac OS X下的钥匙串的实现会以相同的答案提出同样的问题.
iOS提供五种类型(类)的钥匙串项.您必须为密钥选择这五个值中的一个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)
Run Code Online (Sandbox Code Playgroud)
经过阅读苹果文档,博客和论坛条目很长一段时间,我发现这种类型的钥匙串项目kSecClassGenericPassword从属性得到它的独特性kSecAttrAccessGroup,kSecAttrAccount和kSecAttrService.
如果请求1中的这三个属性与请求2中的相同,则无论其他任何属性如何,您都会收到相同的通用密码keychain项.如果此属性中的一个(或两个或全部)更改其值,则会获得不同的项目.
但是kSecAttrService仅适用于类型的项目kSecClassGenericPassword,因此它不能成为任何其他类型的项目的"唯一键"的一部分,并且似乎没有文档明确指出哪些属性唯一地确定了钥匙串项目.
"GenericKeychain"类"KeychainItemWrapper"中的示例代码使用该属性kSecAttrGeneric使项目唯一,但这是一个错误.此示例中的两个条目仅存储为两个不同的条目,因为它们kSecAttrAccessGroup不同(一个设置了访问组,另一个允许它自由).如果您尝试使用Apple's添加没有访问组的第二个密码KeychainItemWrapper,则会失败.
那么,请回答我的问题:
kSecAttrAccessGroup,kSecAttrAccount并且kSecAttrService是一个钥匙串项目,其kSecClass是"唯一钥匙" kSecClassGenericPassword? kSecClass不是kSecClassGenericPassword?Tam*_*ese 164
主键如下(从Apple的开源文件派生,请参阅Schema.m4,KeySchema.m4和SecItem.cpp):
kSecClassGenericPassword,主键是的组合
kSecAttrAccount和kSecAttrService.kSecClassInternetPassword,主键是的组合kSecAttrAccount,kSecAttrSecurityDomain,kSecAttrServer,kSecAttrProtocol,kSecAttrAuthenticationType,kSecAttrPort和kSecAttrPath.kSecClassCertificate,主键是的组合kSecAttrCertificateType,kSecAttrIssuer和kSecAttrSerialNumber.kSecClassKey,主键是的组合kSecAttrApplicationLabel,kSecAttrApplicationTag,kSecAttrKeyType,
kSecAttrKeySizeInBits,kSecAttrEffectiveKeySize,和创建者,开始其不被暴露SecItem还日期和结束日期.kSecClassIdentity我没有找到开源文件中主键字段的信息,但由于标识是私钥和证书的组合,我假设主键是主键的组合田地kSecClassKey和kSecClassCertificate.由于每个钥匙串项属于钥匙串访问组,感觉钥匙串访问组(字段kSecAttrAccessGroup)是所有这些主键的添加字段.
我前几天(在iOS 7.1上)遇到了一个与此问题相关的错误.我正在使用它SecItemCopyMatching来阅读一个kSecClassGenericPassword项目并且它一直在返回errSecItemNotFound(-25300)kSecAttrAccessGroup,kSecAttrAccount并且kSecAttrService它们都与钥匙串中的项目相匹配.
最终我发现kSecAttrAccessible不匹配.钥匙串中的值持有pdmn = dk(kSecAttrAccessibleAlways),但我正在使用kSecAttrAccessibleWhenUnlocked.
当然,首先不需要这个值SecItemCopyMatching,但是OSStatus不是errSecParam也errSecBadReq不仅仅是errSecItemNotFound(-25300)这使得它找起来有点棘手.
因为SecItemUpdate我遇到了同样的问题但是在这种方法中,即使kSecAttrAccessible在query参数中使用相同的方法也行不通.只有完全删除此属性才能修复它.
我希望这个评论能为你们中的一些人节省一些宝贵的调试时间.
@Tammo Freese 给出的答案似乎是正确的(但没有提到所有主键)。我在文档中寻找一些证据。终于找到了:
当该钥匙串已经具有具有相同组合主键集的相同类别的项目时,系统认为该项目是给定钥匙串的重复项。每个类别的钥匙串项目都有一组不同的主键,尽管一些属性在所有类别中通用。特别是,在适用的情况下,kSecAttrSynchronizable 和 kSecAttrAccessGroup 是主键集的一部分。下面列出了额外的每类主键:
- 对于通用密码,主键包括 kSecAttrAccount 和 kSecAttrService。
- 对于 Internet 密码,主键包括 kSecAttrAccount、kSecAttrSecurityDomain、kSecAttrServer、kSecAttrProtocol、kSecAttrAuthenticationType、kSecAttrPort 和 kSecAttrPath。
- 对于证书,主键包括 kSecAttrCertificateType、kSecAttrIssuer 和 kSecAttrSerialNumber。
- 对于关键项,主键包括kSecAttrKeyClass、kSecAttrKeyType、kSecAttrApplicationLabel、kSecAttrApplicationTag、kSecAttrKeySizeInBits和kSecAttrEffectiveKeySize。
- 对于身份项,证书和私钥捆绑在一起,主密钥与证书相同。因为一个私钥可能被多次认证,所以证书的唯一性决定了身份的唯一性。
| 归档时间: |
|
| 查看次数: |
19472 次 |
| 最近记录: |