2015-01-27 6 views
2

OS X의 키 체인 항목을 열거하는 문제를 해결할 수 있도록 도와주세요. 주제는 enumerating all keychain items in my iOS application인데, 핵심 기초 기능이있는 주제로 작성된 동일한 코드를 작성하는 방법을 이해하고 싶습니다. 나는 그것을 시도했다 :OS X 응용 프로그램의 모든 키 체인 항목을 열거 할 수 있습니까?

CFDictionaryRef query = CFDictionaryCreate (kCFAllocatorDefault, NULL, NULL, 0, NULL, NULL); 
CFTypeRef *result = NULL; 

status = SecItemCopyMatching(query, result); 
if (status != errSecSuccess) 
{ 
    GetLastError(status); 
} 

그러나이 코드는 작동하지 않았다! 내가 잘못한 부분을 이해하도록 도와 주실 수 있습니까? 함수 "SecItemCopyMatching"이 오류를 반환했습니다 : 함수에 전달 된 하나 이상의 매개 변수가 유효하지 않습니다. 오류 코드 : -50.

답변

3

유효한 사전이 아니고 빈 사전을 제공하고 있습니다.

당신이 code from the answer you were looking at을 가지고 프로젝트에 드롭하는 경우 :

NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           (__bridge id)kCFBooleanTrue, (__bridge id)kSecReturnAttributes, 
           (__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit, 
           nil]; 

NSArray *secItemClasses = [NSArray arrayWithObjects: 
          (__bridge id)kSecClassGenericPassword, 
          (__bridge id)kSecClassInternetPassword, 
          (__bridge id)kSecClassCertificate, 
          (__bridge id)kSecClassKey, 
          (__bridge id)kSecClassIdentity, 
          nil]; 

for (id secItemClass in secItemClasses) { 
    [query setObject:secItemClass forKey:(__bridge id)kSecClass]; 

    CFTypeRef result = NULL; 
    SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); 
    NSLog(@"%@", (__bridge id)result); 
    if (result != NULL) CFRelease(result); 
} 

당신은 행복한 결과를해야합니다.

동등한 CoreFoundation에서 당신이 (당신이 작성하는 있으리라 믿고있어 무엇 인) 맥 OS 명령 행 도구에서 코코아 프레임 워크를 포함 할 수 없습니다 이유가 없다을 추가 할

편집했다. 커맨드 라인 도구가 쉽게 포함 할 수없는 것은 AppKit UI 프레임 워크입니다.

은 어쨌든, 여기에 CoreFoundation에서의 동일합니다 : 나는, 나는 다양한 키 체인 항목 및 인증서의 매우 큰 덤프를보고 있어요 내 자신의 테스트 응용 프로그램에이를 넣어

CFMutableDictionaryRef query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, 
            &kCFTypeDictionaryKeyCallBacks, 
            &kCFTypeDictionaryValueCallBacks); 


CFDictionarySetValue(query, kSecReturnAttributes, kCFBooleanTrue); 
CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitAll); 

CFTypeRef types[5]; 

types[0] = kSecClassGenericPassword; 
types[1] = kSecClassInternetPassword; 
types[2] = kSecClassCertificate; 
types[3] = kSecClassKey; 
types[4] = kSecClassIdentity; 

CFArrayRef secItemClasses = CFArrayCreate(NULL, (void *)types, 5, &kCFTypeArrayCallBacks); 
CFIndex i, c = CFArrayGetCount(secItemClasses); 

for(i = 0; i<c; i++) 
{ 
    CFTypeRef secItemClass = CFArrayGetValueAtIndex(secItemClasses,i); 
    CFDictionarySetValue(query, kSecClass, secItemClass); 

    CFTypeRef result = NULL; 
    SecItemCopyMatching(query, &result); 
    NSLog(@"%@", (__bridge id)result); 
    if (result != NULL) CFRelease(result); 
} 

CFRelease(secItemClasses); 
CFRelease(query); 

.

+0

답변 해 주셔서 감사합니다. 그러나 Cocoa.framework없이 응용 프로그램을 작성하려면이 코드를 CoreFoundation.framework로 적응시켜야합니다. 그것에 따르면, 나는 어떻게 대답 할 수 있습니까? 그런 다음 사이트에서 내 비밀번호와 로그인을 찾는 방법은 무엇입니까? – neo

+0

고맙습니다 !!!)))))))))))))) – neo

0

OP는 다른 키 체인에 관해 묻지 않았지만 희망이 있으면 향후 독자에게 도움이 될 것입니다.

마이클 코드는 키 체인에 저장된 항목 중 일부를 표시하는 간단한 방법입니다. 많은 시행 착오를 거쳐 그의 코드가 iCloud 키 체인을 반환하지 않는다는 것을 발견했습니다. 아이 클라우드 키 체인을 보려면 키/값 쌍을 추가

NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           (__bridge id)kCFBooleanTrue, (__bridge id)kSecReturnAttributes, 
           (__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit, 
           // added to find keychain items saved in iCloud 
           (__bridge id)kCFBooleanTrue, (__bridge id)kSecAttrSynchronizable, 
           nil]; 

SecItemCopyMatching()에 대한 쿼리 사전은 중요하고 작은 이해입니다!

**주의 사항 : 이것은 Mac이 아닌 iPhone 장치에서 테스트되었습니다.