我的问题涉及 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)
经过长时间阅读苹果文档、博客和论坛条目,我发现类型的钥匙串项目kSecClassGenericPassword
从属性中获取其唯一性kSecAttrAccessGroup
, kSecAttrAccount
and kSecAttrService
.
如果请求 1 中的这三个属性与请求 2 中的相同,那么您将收到相同的通用密码钥匙串项,而不管任何其他属性如何。如果此属性中的一个(或两个或全部)更改其值,那么您将获得不同的项目。
But kSecAttrService
仅适用于类型的项目kSecClassGenericPassword
,因此它不能成为任何其他类型的项目的“唯一密钥”的一部分,并且似乎没有文档明确指出哪些属性唯一地确定钥匙串项目。
“GenericKeychain”的“KeychainItemWrapper”类中的示例代码使用了该属性kSecAttrGeneric
使物品独一无二,但这是一个错误。本示例中的两个条目仅存储为两个不同的条目,因为它们kSecAttrAccessGroup
是不同的(一个设置了访问组,另一个让它自由)。如果您尝试在没有访问组的情况下添加第二个密码,请使用 AppleKeychainItemWrapper
,你会失败。
那么,请回答我的问题:
- 是真的吗?
kSecAttrAccessGroup
, kSecAttrAccount
and kSecAttrService
是 kSecClass 为的钥匙串项的“唯一密钥”kSecClassGenericPassword
?
- 哪些属性使钥匙串项目独一无二,如果
kSecClass
is not kSecClassGenericPassword
?
主键如下(源自Apple的开源文件,参见架构.m4 http://www.opensource.apple.com/source/libsecurity_cdsa_utilities/libsecurity_cdsa_utilities-55006/lib/Schema.m4, 密钥架构.m4 http://www.opensource.apple.com/source/libsecurity_cdsa_utilities/libsecurity_cdsa_utilities-55006/lib/KeySchema.m4 and SecItem.cpp http://opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55050.2/lib/SecItem.cpp):
- 对于钥匙扣类物品
kSecClassGenericPassword
,主键是以下组合kSecAttrAccount
and kSecAttrService
.
- 对于钥匙扣类物品
kSecClassInternetPassword
,主键是以下组合kSecAttrAccount
, kSecAttrSecurityDomain
, kSecAttrServer
, kSecAttrProtocol
, kSecAttrAuthenticationType
, kSecAttrPort
and kSecAttrPath
.
- 对于钥匙扣类物品
kSecClassCertificate
,主键是以下组合kSecAttrCertificateType
, kSecAttrIssuer
and kSecAttrSerialNumber
.
- 对于钥匙扣类物品
kSecClassKey
,主键是以下组合kSecAttrApplicationLabel
, kSecAttrApplicationTag
, kSecAttrKeyType
,
kSecAttrKeySizeInBits
, kSecAttrEffectiveKeySize
,以及 SecItem 尚未公开的创建者、开始日期和结束日期。
- 对于钥匙扣类物品
kSecClassIdentity
我没有在开源文件中找到有关主键字段的信息,但由于身份是私钥和证书的组合,因此我假设主键是主键字段的组合kSecClassKey
and kSecClassCertificate
.
由于每个钥匙串项都属于一个钥匙串访问组,因此感觉就像钥匙串访问组(字段kSecAttrAccessGroup
) 是所有这些主键的添加字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)