在Mac OS X钥匙串中区分会话和系统项目

3

我可以如何查询Mac OS X钥匙串以仅检索会话项目?

当我尝试像这样获取所有项目:

[SSKeychain accountsForService:nil];

会话项和系统项具有完全相同的键属性:acct、cdat、class、crtr、labl、mdat、svce。

您如何查询钥匙串以仅获取会话项或将其区分开?

感谢您的帮助!

2个回答

0
你可以这样查询会话密码(如果需要所有密码,请用 kSecMatchLimitAll 替换 kSecMatchLimitOne。在这种情况下,attributes 类型将为 CFArrayRef):
NSDictionary* passwordQuery = @{
    (__bridge id)kSecAttrService : sessionServiceName,
    (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
    (__bridge id)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,
    (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue,
    (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne
};

CFTypeRef attributes = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)passwordQuery, &attributes);
if (status != 0){
    return nil;
 }

我已经拥有了所有的项目,但我只想要会话项目而不是系统项目。 - Michaël
哦,好的。那么(可能)在创建项目时使用有效的kSecAttrService是以后查找这些项目的唯一方法。我刚在我的系统上检查了一下(OS X 10.8),得到了许多不同的acct属性值(Safari,AirPort等)。因此,您可以创建一个“标准”服务列表,然后将它们过滤掉作为一种选项。 - Sergiy Salyuk
我已经找到了,检查我的答案。 - Michaël

0

我发现通过打开用户钥匙串:

NSArray *path = [NSHomeDirectory() pathComponents];
NSString *keychainPath = [NSString stringWithFormat:@"%@%@/%@%@",path[0],path[1],path[2],@"/Library/Keychains/login.keychain"];
SecKeychainRef ref = NULL;
SecKeychainOpen([keychainPath UTF8String],&ref);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接