如何查詢Mac OS X鑰匙串以僅檢索會話項目?區分Mac OS X鑰匙串中的會話和系統項目
當我試圖讓所有的項目是這樣的:
[SSKeychain accountsForService:nil];
會話項目和系統項目具有完全相同的鑰匙相同的屬性:ACCT,CDAT,階級,CRTR,LABL,MDAT,svce
y如何查詢鑰匙串只獲取會話項或區分它們?
謝謝你的幫助!
如何查詢Mac OS X鑰匙串以僅檢索會話項目?區分Mac OS X鑰匙串中的會話和系統項目
當我試圖讓所有的項目是這樣的:
[SSKeychain accountsForService:nil];
會話項目和系統項目具有完全相同的鑰匙相同的屬性:ACCT,CDAT,階級,CRTR,LABL,MDAT,svce
y如何查詢鑰匙串只獲取會話項或區分它們?
謝謝你的幫助!
我已經通過打開發現用戶鑰匙串:
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);
您可以查詢會話密碼,就像這樣(用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; }
我已經有所有項目但我只想要會話項目而不是系統項目 – malinois
哦,好的。然後(可能)在創建項目時使用有效的'kSecAttrService'是以後找到這些項目的唯一方法。我剛剛檢查了我的系統(OS X 10.8),併爲acct屬性(Safari,AirPort等)獲得了許多不同的值。因此,作爲選項,您可以創建「標準」服務列表,然後將其過濾掉。 –
我發現了,查看我的答案 – malinois