Мой вопрос касается брелоков в iOS (iPhone, iPad,...). Я думаю (но не уверен), что реализация keychains под Mac OS X ставит один и тот же вопрос с тем же ответом.
iOS предоставляет пять типов (классов) элементов keychain. Вы должны выбрать одно из этих пяти значений для ключа kSecClass, чтобы определить тип:
kSecClassGenericPassword used to store a generic password
kSecClassInternetPassword used to store an internet password
kSecClassCertificate used to store a certificate
kSecClassKey used to store a kryptographic key
kSecClassIdentity used to store an identity (certificate + private key)
После долгого времени чтения документации яблок, блогов и записей в форуме я узнал, что элемент keychain типа kSecClassGenericPassword получает свою уникальность от атрибутов kSecAttrAccessGroup, kSecAttrAccount и kSecAttrService.
Если эти три атрибута в запросе 1 те же, что и в запросе 2, вы получаете тот же общий ключевой элемент пароля, независимо от каких-либо других атрибутов. Если один (или два или все) из этих атрибутов изменяет свое значение, вы получаете разные элементы.
Но kSecAttrService доступен только для элементов типа kSecClassGenericPassword, поэтому он не может быть частью "уникального ключа" элемента любого другого типа, и, похоже, нет документации, которая четко указывает который атрибуты однозначно определяют элемент keychain.
Пример кода в классе "KeychainItemWrapper" из "GenericKeychain" использует атрибут kSecAttrGeneric, чтобы сделать элемент уникальным, но это ошибка. Две записи в этом примере сохраняются только как две разные записи, потому что их kSecAttrAccessGroup отличается (у одного есть группа групп доступа, а другая освобождается). Если вы попытаетесь добавить второй пароль без группы доступа, используя Apple KeychainItemWrapper, вы потерпите неудачу.
Итак, пожалуйста, ответьте на мои вопросы:
- Правда ли, что комбинация
kSecAttrAccessGroup,kSecAttrAccountиkSecAttrServiceявляется "уникальным ключом" элемента keychain, kSecClass которогоkSecClassGenericPassword? - Какие атрибуты делают элемент keychain уникальным, если его
kSecClassнеkSecClassGenericPassword?