gpt4 book ai didi

macos - SecItemCopyMatching 无法读取 iCloud 钥匙串(keychain)

转载 作者:行者123 更新时间:2023-12-04 11:47:42 32 4
gpt4 key购买 nike

我从 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设置正确的组.套装 kSecAttrSynchronizablekCFBooleanTrue只搜索 iOS 风格的项目(同步的);将其设置为 kSecAttrSynchronizableAny搜索同步和未同步的 key (如登录钥匙串(keychain)中的 key )。默认是仅搜索本地键 ( kCFBooleanFalse )。
    示例查询
    这将返回一个字典数组;每个键一本字典;您的应用程序的所有 iCloud 键。有机会出现。每个字典中的键值对是对应键的属性;这不会返回键的值 1
        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在调试器下应该告诉你很多。
    来源 : Apple Developer forum thread , SecItemCopyMatching超越。
    Apple 在记录 SecItem* 方面做得很差。 API 家族。信息在那里,但散布在不同(不相关)的地方(有些甚至在官方文档之外)。
    1:通过 (id)kSecReturnData: (id)kCFBooleanTrue获取key的数据;然而你 can't use kSecReturnData and kSecMatchLimitAll together

    关于macos - SecItemCopyMatching 无法读取 iCloud 钥匙串(keychain),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530487/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com