Можно ли использовать аутентификацию Touch-ID и обмен ключами в приложении iOS?
Ive успешно удалось реализовать TouchID с брелками, а также совместное использование ключей (синхронизация элементов связки ключей между несколькими устройствами) отдельно. Когда я пытаюсь сделать их оба, я получаю сообщение об ошибке "-50", что является недопустимым параметром.
Из приведенного ниже кода удаление либо kSecAttrAccessControl, либо kSecAttrSynchronizable работает должным образом.
Основываясь на моем опыте (прочитайте - несколько дней разочарования) до сих пор и основываясь на возможностях некоторых упрощений API-интерфейсов keychain , таких как UICKeychainStore, похоже, что если я использую аутентификацию идентификатора Touch ID, совместное использование ключей не будет работать и наоборот. Я ищу документацию Apple, которая сообщит об этом, но не сможет ее найти.
Ive прошла через страницу Apples SecItem.h, и полезная информация, которую я нашел, содержит следующие сведения о kSecAttrAccessible и kSecAttrSynchronizable:
"Если оба атрибута указаны в OS X или iOS, значение для ключа kSecAttrAccessible может быть только тем, чье имя не заканчивается" ThisDeviceOnly ", поскольку они не могут синхронизироваться с другим устройством". Тем не менее, я не использую "ThisDeviceOnly" (в настоящее время я использую kSecAttrAccessibleAlways для тестирования)
Не могли бы вы указать, где и где Apple зафиксировала это ограничение? Это поможет мне документировать его для записей и двигаться дальше. Благодарю.
- (void)addKeychainItemWithIdentifier:(NSString *)identifier andData:(NSData *)data {
CFErrorRef error = NULL;
SecAccessControlRef sacObject;
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleAlways,
kSecAccessControlUserPresence, &error);
if(sacObject == NULL || error != NULL)
{
NSString *msg0 = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_CAN_CREATE_OBJECT", nil), error];
[self printResultWithMessage:msg0];
return;
}
NSDictionary *attributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecValueData: data,
(__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlways,
(__bridge id)kSecAttrService: identifier,
(__bridge id)kSecAttrSynchronizable:(__bridge id)kCFBooleanTrue,
(__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject
};
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
NSError *statuserror = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
[self printResultWithMessage:[self keychainErrorToString:status]];
});
}
Ответы
Ответ 1
Думаю, я нашел ответ на этот
В видеоролике WWDC 2014 711 упоминается в 31:48
Защищенные элементы ACL - нет синхронизации, нет резервной копии
Таким образом, аутентификация идентификатора Touch ID не может использоваться для совместного использования ключей между устройствами, поскольку эти элементы относятся только к устройствам
Ответ 2
Этот пример проекта может помочь, заголовок KeychainTouchID: с помощью Touch ID с Keychain и LocalAuthentication:
https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html
Это может быть ограничено локальным, но не общим.