Можно ли обновить значение атрибута 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);
Проблема с этим подходом к обновлению статуса [111111Status] [111111Status] всегда приводит к 11110114] errSecUnimplemented
.
Я думаю, что должна быть возможность обновить значение kSecAttrAccessible
, потому что требования приложений меняются. Что, если бы приложение добавляло десять элементов в Связку ключей в прошлом без указания класса защиты с помощью kSecAttrAccessible
. Связка ключей неявно присваивает новым элементам значение kSecAttrAccessibleWhenUnlocked
, если класс защиты не установлен явно разработчиком. Позже, разработчику необходимо изменить класс защиты на kSecAttrAccessibleAfterFirstUnlock
, потому что приложение должно обращаться к нему в фоновом режиме (многозадачность). Как разработчику это сделать?
На форумах разработчиков Apple уже есть ветка, но она еще не дала ответа: https://devforums.apple.com/thread/87646?tstart=0