Можно ли обновить значение kSecAttrAccessible элемента Keychain?

Можно ли обновить значение атрибута 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

23
задан mbinna 21 March 2011 в 09:42
поделиться