Моє запитання стосується брелоків в iOS (iPhone, iPad, ...). Я думаю (але не впевнений), що реалізація брелоків під 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різний (один має набір групи доступу, а другий дозволяє звільнити його). Якщо ви спробуєте додати другий пароль без групи доступу, використовуючи Apple KeychainItemWrapper, ви не зможете.
Тож, будь ласка, дайте відповіді на мої запитання:
- Чи вірно, що поєднання
kSecAttrAccessGroup,kSecAttrAccountіkSecAttrServiceце «унікальний ключ» з брелка елемента якого kSecClass цеkSecClassGenericPassword? - Які атрибути роблять предмет брелока унікальним, якщо його
kSecClassнемаєkSecClassGenericPassword?