Что делает элемент брелка уникальным (в iOS)?
мой вопрос касается брелоков в iOS (iPhone, iPad, ...). Я думаю (но не уверен), что реализация keychains под Mac OS X поднимает тот же вопрос с тем же ответом.
iOS предоставляет пять типов (классов) элементов связки ключей. Вы должны выбрать одно из этих пяти значений для ключа 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)
после долгого времени чтения документации яблоки, блоги и форум-записи, я узнал, что брелок элемент типа kSecClassGenericPassword получает свою уникальность от атрибутов kSecAttrAccessGroup,kSecAttrAccount и kSecAttrService.
если эти три атрибута в запросе 1 совпадают с запросом 2, то вы получаете тот же элемент связки ключей общего пароля, независимо от любых других атрибутов. Если один (или два или все) из этих атрибутов изменяет свое значение, то вы получаете разные элементы.
но kSecAttrService доступно только для элементов типа kSecClassGenericPassword, поэтому он не может быть частью "уникальный ключ" объектов любого другой тип, и, похоже, нет документации, которая четко указывает, какие атрибуты однозначно определяют элемент связки ключей.
пример кода в классе "KeychainItemWrapper" из "GenericKeychain" использует атрибут kSecAttrGeneric сделать товар уникальным, но это ошибка. Две записи в этом примере хранятся только как две разные записи, потому что их kSecAttrAccessGroup отличается (у одного есть набор групп доступа, другой позволяет ему свободно). Если вы попытаетесь добавить 2-й пароль без группа доступа, используя Apple KeychainItemWrapper, вам не удастся.
Итак, пожалуйста, ответьте на мои вопросы:
- это правда, что комбинация
kSecAttrAccessGroup,kSecAttrAccountиkSecAttrService- это "уникальный ключ" элемента связки ключей, kSecClass которогоkSecClassGenericPassword? - какие атрибуты делают элемент брелка уникальным, если его
kSecClassнеkSecClassGenericPassword?
3 ответов:
первичные ключи следующие (производные от файлов с открытым исходным кодом от Apple, см. схемы.М4,KeySchema.М4 и SecItem.cpp):
- для элемента связки ключей класса
kSecClassGenericPasswordпервичный ключ-это комбинацияkSecAttrAccountиkSecAttrService.- для элемента связки ключей класса
kSecClassInternetPasswordпервичный ключ-это комбинацияkSecAttrAccount,kSecAttrSecurityDomain,kSecAttrServer,kSecAttrProtocol,kSecAttrAuthenticationType,kSecAttrPortиkSecAttrPath.- для элемента связки ключей класса
kSecClassCertificateпервичный ключ-это комбинацияkSecAttrCertificateType,kSecAttrIssuerиkSecAttrSerialNumber.- для элемента связки ключей класса
kSecClassKeyпервичный ключ-это комбинацияkSecAttrApplicationLabel,kSecAttrApplicationTag,kSecAttrKeyType,kSecAttrKeySizeInBits,kSecAttrEffectiveKeySize, и создатель, дата начала и дата окончания, которые еще не выставлены SecItem.- для элемента связки ключей класса
kSecClassIdentityя не нашел информацию о полях первичного ключа в открытом исходном коде файлы, но поскольку идентификатор-это комбинация закрытого ключа и сертификата, я предполагаю, что первичный ключ-это комбинация полей первичного ключа дляkSecClassKeyиkSecClassCertificate.поскольку каждый элемент keychain принадлежит к группе доступа keychain, он чувствует себя как группа доступа keychain (поле
kSecAttrAccessGroup) - дополнительное поле для всех этих первичных ключей.
на днях я столкнулся с ошибкой (на iOS 7.1), которая связана с этим вопросом. Я использовал
SecItemCopyMatchingчитатьkSecClassGenericPasswordэлемент, и он постоянно возвращалсяerrSecItemNotFound(-25300) хотяkSecAttrAccessGroup,kSecAttrAccountиkSecAttrServiceвсе соответствовали элементу в связке ключей.в конце концов я понял, что
kSecAttrAccessibleне совпадают. Значение в брелке удерживается pdmn = dk (kSecAttrAccessibleAlways), но я использовалkSecAttrAccessibleWhenUnlocked.конечно, это значение не требуется в первую очередь для
SecItemCopyMatching, аOSStatusне былоerrSecParam, ниerrSecBadReq, но толькоerrSecItemNotFound(-25300), что сделало его немного сложнее найти.на
SecItemUpdateя испытал ту же проблему, но в этом методе даже с помощью того жеkSecAttrAccessibleнаqueryпараметр не работает. Только полное удаление этого атрибута исправило его.я надеюсь, что этот комментарий сэкономит несколько драгоценных моментов отладки для некоторых из вас.
ответ, данный @Tammo Freese, кажется правильным (но не упоминает все первичные ключи). Я искал некоторые доказательства в документации. Наконец, нашел:
в документации Apple упоминаются первичные ключи для каждого класса секретности (цитата ниже):
система считает элемент дубликатом для данной связки ключей, когда эта связка ключей уже имеет элемент того же класса с тем же набором составных первичных ключей. Каждый класс элемента keychain имеет другой набор первичных ключей, хотя несколько атрибутов используются совместно во всех классах. В частности, где это применимо, kSecAttrSynchronizable и kSecAttrAccessGroup являются частью набора первичных ключей. Дополнительные первичные ключи для каждого класса перечислены ниже:
- для общих паролей, первичные ключи включить kSecAttrAccount и kSecAttrService.
- интернет-паролей , первичные ключи включить kSecAttrAccount, kSecAttrSecurityDomain, kSecAttrServer, kSecAttrProtocol, kSecAttrAuthenticationType, kSecAttrPort и kSecAttrPath.
- для сертификатов, первичные ключи включить kSecAttrCertificateType, kSecAttrIssuer, и kSecAttrSerialNumber.
- для ключевых элементов, первичные ключи включить kSecAttrKeyClass, kSecAttrKeyType, kSecAttrApplicationLabel, kSecAttrApplicationTag, kSecAttrKeySizeInBits, и kSecAttrEffectiveKeySize.
- для элементов идентификации, которые представляют собой сертификат и закрытый ключ в комплекте вместе, первичные ключи являются то же самое, что и для сертификата. потому что закрытый ключ может быть сертифицирован более одного раза, уникальность сертификат определяет личность.
Comments