作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从 Stack Overflow 上抓取了代码来访问一些网络浏览器密码。只要密码在登录钥匙串(keychain)中,它就可以很好地工作。在某些时候,我感兴趣的特定帐户已移至 iCloud 钥匙串(keychain),并且不再存在于登录钥匙串(keychain)中。 SecItemCopyMatching 找不到它。它返回 OSStatus -23500,即“未找到项目”。如何访问这些条目?
CFArrayRef result = NULL;
NSDictionary *params = @{ (__bridge id)kSecClass : (__bridge id)kSecClassInternetPassword,
(__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitAll,
(__bridge id)kSecReturnAttributes : (__bridge id)kCFBooleanTrue,
(__bridge id)kSecAttrProtocol : (__bridge id)kSecAttrProtocolHTTPS,
(__bridge id)kSecAttrServer : @"accounts.mydomain.com"
};
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(params), (CFTypeRef *) &result);
if (status == noErr) {
// item found!
}
最佳答案
虽然在 macOS 上您可以同时看到登录和 iCloud 钥匙串(keychain),但前者是 macOS 风格的钥匙串(keychain),而后者是 iOS 风格的钥匙串(keychain)。只要用户同意,应用程序就可以自由访问 macOS 风格的钥匙串(keychain)项目。 iOS 样式的项目严格遵循访问组策略。
iCloud 钥匙串(keychain)中的每个 key 都在一个访问组下。 一个应用程序。调用 SecItemCopyMatching
应该说访问组作为在查询结果中出现的键的权利。
一旦您确定搜索到的 key 的访问组在您的应用程序的权利下列出的访问组之一,您必须将几个属性传递给 SecItemCopyMatching
查询字典(除了像 kSecClass
这样的强制性字典):
kSecAttrAccessGroup
kSecAttrSynchronizable
kSecAttrAccessGroup
设置正确的组.套装
kSecAttrSynchronizable
至
kCFBooleanTrue
只搜索 iOS 风格的项目(同步的);将其设置为
kSecAttrSynchronizableAny
搜索同步和未同步的 key (如登录钥匙串(keychain)中的 key )。默认是仅搜索本地键 (
kCFBooleanFalse
)。
NSString* account = @"my_account";
NSString* service = @"some_service";
NSDictionary* query = @{
(id)kSecClass: (id) kSecClassGenericPassword,
// skip as this example app has only one access group
// (id)kSecAttrAccessGroup: (id) keychainAccessGroup,
(id)kSecAttrSynchronizable: (id)kCFBooleanTrue,
(id)kSecAttrAccount: (id) account,
(id)kSecAttrService: (id) service,
(id)kSecReturnAttributes: (id)kCFBooleanTrue,
(id)kSecMatchLimit: (id)kSecMatchLimitAll,
};
CFTypeRef result;
OSStatus status = SecItemCopyMatching((CFDictionaryRef)query, &result);
if (status != errSecSuccess) {
CFStringRef err = SecCopyErrorMessageString(status, nil);
NSLog(@"Error: %@", err);
CFRelease(err);
} else {
NSArray* attributes_of_keys = (__bridge NSArray*)result;
}
检验
attributes_of_keys
在调试器下应该告诉你很多。
SecItemCopyMatching
超越。
SecItem*
方面做得很差。 API 家族。信息在那里,但散布在不同(不相关)的地方(有些甚至在官方文档之外)。
(id)kSecReturnData: (id)kCFBooleanTrue
获取key的数据;然而你
can't use kSecReturnData
and kSecMatchLimitAll
together
关于macos - SecItemCopyMatching 无法读取 iCloud 钥匙串(keychain),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530487/
我是一名优秀的程序员,十分优秀!