iOS SFHFKeychainUtils дает сбой *иногда* с ошибкой -25308 errSecInteractionNotAllowed

У меня есть этот код, возвращающий пароль из цепочки для ключей для данного имени пользователя NSString:

NSError *error = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error];
if(error != nil)
    // log the error    

Большую часть времени для большинства пользователей все это работает нормально, но для некоторых конкретных пользователей этот вызов, похоже, терпит неудачу (и продолжает сбой), когда он возвращает следующую ошибку:

The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)

По-видимому, это errSecInteractionNotAllowed, что, исходя из того, что я прочитал, думаю, означает, что для доступа к цепочке ключей требуется какое-то взаимодействие с пользователем.

Кто-нибудь знает, почему этот вызов может не работать только для некоторых конкретных пользователей? Эта запись связки ключей относится к моему приложению, так почему для доступа к ней требуется какое-либо взаимодействие с пользователем?

Любые указатели очень ценятся...


person Simon East    schedule 15.03.2012    source источник


Ответы (2)


Итак, я наконец-то решил это.

В конце концов я выяснил, что пользователи, у которых были проблемы, установили код блокировки на свой телефон. Если телефон был заблокирован, система связки ключей возвращала эту ошибку -25308.

Если вам нужно получить доступ к связке ключей только тогда, когда приложение активно на переднем плане, вы никогда не увидите эту проблему, но если вам нужно продолжить обработку, когда телефон заблокирован или если приложение находится в фоновом режиме, вы увидите это.

В другом месте я читал, что атрибутом доступа по умолчанию для системы kechain является kSecAttrAccessibleAlways, но я думаю, что это устарело. Кажется, атрибут доступа по умолчанию для системы цепочки для ключей таков, что когда телефон заблокирован пин-кодом, элементы недоступны.

Исправление для этого состоит в том, чтобы изменить код SFHFKeychainUtils, чтобы установить определенный атрибут kSecAttrAccessible для элементов цепочки для ключей, которыми он управляет (чего исходный код не делал — предположительно, поскольку он предшествовал этим атрибутам).

Эта обновленная версия в коде SFHFKeychainUtils есть исправления — найдите kSecAttrAccessible, чтобы увидеть, где они добавили код доступного атрибута.

Надеюсь, это поможет любому, кто столкнется с этим...

person Simon East    schedule 16.03.2012
comment
Я проверил это на iOS4, iOS5 и iOS6. Во всех версиях iOS возвращается код ошибки errSecInteractionNotAllowed, если данные, не отмеченные kSecAttrAccessibleAlways, считываются, когда ваше устройство находится в заблокированном состоянии (например, фоновые задачи, загрузка газетного киоска и т. д.). - person Nikita Zhuk; 12.11.2012
comment
kSecAttrAccessibleAlways не лучший выбор — вы можете получить больше преимуществ в плане безопасности и при этом избежать ошибки, используя что-то вроде kSecAttrAccessibleAfterFirstUnlock (или еще более строгий параметр, если это работает для вашего приложения). - person frankodwyer; 12.11.2012
comment
Я могу подтвердить, что когда приложение находится на переднем плане, но устройство заблокировано паролем, библиотека связки ключей дает мне -25308. Спасибо ! - person Magurizio; 28.12.2013
comment
Я не могу получить доступ к ссылке. Можешь дать свежую ссылку на обновленную версию - person Shanti K; 17.11.2014
comment
SFHFKeychainUtils уже давно не обновлялся — я больше его не использую — я бы посоветовал поискать более новую оболочку системы безопасности, которая, предположительно, будет раскрывать эти новые атрибуты и будет лучше поддерживаться. - person Simon East; 17.11.2014
comment
Вот обновленная ссылка: github. com/wordpress-mobile/WordPress-iOS/blob/ - person Kévin Renella; 27.10.2015
comment
Ты мой герой, большое спасибо за то, что помог мне понять, почему мой доступ к Связке ключей казался таким непредсказуемым. По умолчанию KeychainSwift (github.com/evgenyneu/keychain-swift) использовал kSecAttrAccessibleWhenUnlocked, пока я нужно kSecAttrAccessibleAlways (приложение должно отправлять местоположения в фоновом режиме). - person Jordan; 05.06.2018

У меня возникла эта проблема в iOS 14 с расширениями виджетов, которые обращаются к цепочке ключей, чтобы заставить токен JWT вызывать некоторые паузы.

По-видимому, виджеты по умолчанию пытались обновляться также, когда устройство заблокировано, а элемент связки ключей, который я пытался использовать, был недоступен.

После установки этого атрибута для элемента цепочки для ключей (код Swift 5) все работает:

keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
person smukamuka    schedule 11.06.2021