我可以如何查询Mac OS X钥匙串以仅检索会话项目?
当我尝试像这样获取所有项目:
[SSKeychain accountsForService:nil];
会话项和系统项具有完全相同的键属性:acct、cdat、class、crtr、labl、mdat、svce。
您如何查询钥匙串以仅获取会话项或将其区分开?
感谢您的帮助!
我可以如何查询Mac OS X钥匙串以仅检索会话项目?
当我尝试像这样获取所有项目:
[SSKeychain accountsForService:nil];
会话项和系统项具有完全相同的键属性:acct、cdat、class、crtr、labl、mdat、svce。
您如何查询钥匙串以仅获取会话项或将其区分开?
感谢您的帮助!
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;
}
我发现通过打开用户钥匙串:
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);
kSecAttrService
是以后查找这些项目的唯一方法。我刚在我的系统上检查了一下(OS X 10.8),得到了许多不同的acct属性值(Safari,AirPort等)。因此,您可以创建一个“标准”服务列表,然后将它们过滤掉作为一种选项。 - Sergiy Salyuk