Что делает элемент брелка уникальным (в 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?

681   3  

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

    Ничего не найдено.