【问题标题】:Access all (user) accounts inside Keychain访问钥匙串中的所有(用户)帐户
【发布时间】:2014-07-29 21:28:17
【问题描述】:

我一直在四处寻找,但仍然没有找到答案。知道如何从钥匙串中返回所有 kSecAttrAccounts 吗?我想取回我在创建钥匙串项时使用的每个标识符的列表,然后选择我想使用“[KeychainWrapper deleteItemFromKeychainWithIdentifier:identifier] 方法”删除它的那个。

当我记得我在创建帐户时使用的用户名(标识符)时,它工作正常,但是当你创建了很多时不知道如何将它们全部恢复。

我尝试了一种基本的 [dictionary objectForKey:(__bridge(id)kSecAttrAccount)] 但没有成功。

非常感谢!!

毛毛虫

【问题讨论】:

    标签: ios keychain


    【解决方案1】:

    使用kSecMatchLimitAll 获取查询字典中kSecMatchLimit 的所有值

     (__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit 
    

    它将获取kSecClassGenericPassword的钥匙串中的所有密码。您也可以像这样使用其他keychain classes

    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
        (__bridge id)kCFBooleanTrue, (__bridge id)kSecReturnAttributes,
        (__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit,
        (__bridge id)kSecClassGenericPassword, (__bridge id)kSecClass, //change your class in query
        nil];
    
        CFTypeRef result = NULL;
        SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);
        NSLog(@"%@", (__bridge id)result);
        if (result != NULL) CFRelease(result);
    

    EDIT : 删除应用程序的所有键,您可以使用

    +(void)deleteAllKeychainItems{
    
    
        NSArray *secItemClasses = @[(__bridge id)kSecClassGenericPassword,
                                    (__bridge id)kSecClassInternetPassword,
                                    (__bridge id)kSecClassCertificate,
                                    (__bridge id)kSecClassKey,
                                    (__bridge id)kSecClassIdentity];
        for (id secItemClass in secItemClasses) {
            NSDictionary *spec = @{(__bridge id)kSecClass:secItemClass};
            SecItemDelete((__bridge CFDictionaryRef)spec);
        }
    
    }
    

    它将删除所有keychain 项目,包括所有帐户密码或相关值。

    【讨论】:

    • 你的意思是像 NSMutableDictionary* query = [NSMutableDictionary dictionaryWithObjectsAndKeys:(__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit, nil];?不知道如何处理你所说的......
    • 编辑了我的答案看看。你想为哪个班级获取钥匙串项目?
    • @codester 只是为了学习目的,是否允许访问所有钥匙串项目,即使它是从另一个应用程序编写的?
    • 不,除非它们属于同一访问组,否则您无法访问其他应用程序的钥匙串项。您可以访问您和您的access group 应用程序(应用程序组属于同一组以共享数据)这还取决于您的应用程序将哪些数据共享给其他应用程序。
    • @codester 哦,没关系,当我看到问题时,我想怎么做。谢谢。
    猜你喜欢
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2017-12-12
    • 2010-09-15
    • 2020-06-20
    相关资源
    最近更新 更多