Возможно ли обновить значение атрибута kSecAttrAccessible
существующих элементов в цепочке ключей? Кажется, что он не может быть изменен после добавления элемента в брелок. Следующие шаги подтверждают мое предположение.
Добавить новый элемент в брелок:
NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER"
dataUsingEncoding:NSUTF8StringEncoding];
NSData *encodedPassword = [@"PASSWORD"
dataUsingEncoding:NSUTF8StringEncoding];
// Construct a Keychain item
NSDictionary *keychainItem =
[NSDictionary dictionaryWithObjectsAndKeys:
kSecClassGenericPassword, kSecClass,
encodedIdentifier, kSecAttrGeneric,
encodedIdentifier, kSecAttrService,
@"USERNAME", kSecAttrAccount,
kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible,
encodedPassword, kSecValueData
nil];
// Add item to Keychain
OSStatus addItemStatus = SecItemAdd((CFDictionaryRef)keychainItem, NULL);
В более позднее время измените атрибут kSecAttrAccessible
от kSecAttrAccessibleWhenUnlocked
до kSecAttrAccessibleAfterFirstUnlock
:
NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER"
dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
kSecClassGenericPassword, kSecClass,
encodedIdentifier, kSecAttrGeneric,
encodedIdentifier, kSecAttrService,
nil];
NSDictionary *updatedAttributes =
[NSDictionary dictionaryWithObject:kSecAttrAccessibleAfterFirstUnlock
forKey:kSecAttrAccessible];
OSStatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query,
(CFDictionaryRef)updatedAttributes);
Проблема с этим подходом заключается в том, что updateItemStatus
всегда приводит к статусу errSecUnimplemented
.
Я думаю, что должно быть возможно обновить значение kSecAttrAccessible
, потому что требования приложений меняются. Что делать, если приложение добавило десять элементов в брелок в прошлом, не указав класс защиты с kSecAttrAccessible
. Keychain неявно назначает новым элементам значение kSecAttrAccessibleWhenUnlocked
, если класс защиты не задан явно разработчиком. Позже разработчику необходимо изменить класс защиты на kSecAttrAccessibleAfterFirstUnlock
, потому что приложение должно получить к нему доступ в фоновом режиме (многозадачность). Как разработчик может это сделать?
На форумах разработчиков Apple уже есть поток, но пока он еще не дал ответа: https://devforums.apple.com/thread/87646?tstart=0