2013-06-04 3 views
6

Apple GenericKeychain 샘플의 KeychainItemWrapper 클래스는 암호를 저장하기 위해 kSecValueData 키를 사용합니다.iOS 키 체인에 어떤 키를 저장해야합니까?

하지만 기준 http://developer.apple.com/library/ios/#documentation/Security/Reference/keychainservices/Reference/reference.html#//apple_ref/doc/uid/TP30000898

kSecValueData는 반환 값의 타입을 나타내는 SecItemCopyMatching 또는 SecItemAdd 대한 결과 사전에 사용 말한다.

SecItemAdd를 호출하여 키 체인 항목을 만들 때 사용해야하는 키는 무엇입니까?

답변

7

암호를 저장하는 키 (NSData 또는 CFDataRef 형식)로 kSecValue 데이터를 사용해야합니다.

kSecValueData 키는 입력 키뿐만 아니라 출력 키로도 작동합니다. 즉, 키 체인 항목 (SecItemCopyMatching)을 쿼리하고 kSecReturnAttributes 키를 지정할 때 결과를 사전으로 반환 할 때 암호를 사용하면 암호는 해당 사전의 kSecValueData 키 아래에 저장됩니다. 또한 키 체인 (SecItemAdd)에 항목을 추가 할 때이 메서드를 호출하기 전에 암호의 NSData 또는 CFDataRef 값을 kSecValueData 키에 저장하여 사용합니다.

가져 비밀번호 :

NSMutableDictionary *queryDictionary = [[NSMutableDictionary alloc] init]; 
[queryDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass]; 
[queryDictionary setObject:service forKey:kSecAttrService]; 
[queryDictionary setObject:account forKey:kSecAttrAccount]; 
// The result will be a dictionary containing the password attributes... 
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnAttributes)]; 
// ...one of those attributes will be a kSecValueData with the password 
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnData)]; 
OSStatus sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryDictionary), (CFTypeRef *)&result); 
if (sanityCheck != noErr) 
{ 
    NSDictionary * resultDict = (__bridge NSDictionary *)result; 
    // here's the queried password value 
    NSData *passwordValue = [resultDict objectForKey:(__bridge id)(kSecValueData)]; 
} 

추가 비밀번호 :

NSString *passwordString = @"my password value"; 
NSData *passwordData = [passwordString dataUsingEncoding:NSUTF8StringEncoding]; 
CFDictionaryRef result = nil; 
NSMutableDictionary *addDictionary = [[NSMutableDictionary alloc] init]; 
[addDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass]; 
[addDictionary setObject:service forKey:kSecAttrService]; 
[addDictionary setObject:account forKey:kSecAttrAccount]; 

// here goes the password value 
[addDictionary setObject:passwordData forKey:(__bridge id<NSCopying>)(kSecValueData)]; 

OSStatus sanityCheck = SecItemAdd((__bridge CFDictionaryRef)(queryDictionary), NULL) 
if (sanityCheck != noErr) 
{ 
    // if no error the password got successfully stored in the keychain 
} 
+0

더 나은 코드, 여기에 적은 버그와 다음은

이 두 경우의 예 HTTP ://stackoverflow.com/questions/19284063/secitemcopymatching-returns-nil-data –

관련 문제