Apple GenericKeychain 샘플의 KeychainItemWrapper 클래스는 암호를 저장하기 위해 kSecValueData 키를 사용합니다.iOS 키 체인에 어떤 키를 저장해야합니까?
kSecValueData는 반환 값의 타입을 나타내는 SecItemCopyMatching 또는 SecItemAdd 대한 결과 사전에 사용 말한다.
SecItemAdd를 호출하여 키 체인 항목을 만들 때 사용해야하는 키는 무엇입니까?
Apple GenericKeychain 샘플의 KeychainItemWrapper 클래스는 암호를 저장하기 위해 kSecValueData 키를 사용합니다.iOS 키 체인에 어떤 키를 저장해야합니까?
kSecValueData는 반환 값의 타입을 나타내는 SecItemCopyMatching 또는 SecItemAdd 대한 결과 사전에 사용 말한다.
SecItemAdd를 호출하여 키 체인 항목을 만들 때 사용해야하는 키는 무엇입니까?
암호를 저장하는 키 (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
}
더 나은 코드, 여기에 적은 버그와 다음은
이 두 경우의 예 HTTP ://stackoverflow.com/questions/19284063/secitemcopymatching-returns-nil-data –