Мой вопрос касается брелоков в 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
?