私の質問は、iOS(iPhone、iPadなど)のキーチェーンに関係します。Mac OS Xでのキーチェーンの実装は、同じ答えで同じ質問を引き起こすと思います(しかし、確信はありません)。
iOSでは、5種類(クラス)のキーチェーンアイテムを提供しています。kSecClass
タイプを判別するには、キーに対してこれらの5つの値のいずれかを選択する必要があります。
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の3つの属性がリクエスト2の属性と同じである場合、他の属性に関係なく、同じ汎用パスワードキーチェーンアイテムを受け取ります。この属性の1つ(または2つまたはすべて)がその値を変更すると、異なるアイテムが取得されます。
ただしkSecAttrService
、タイプのアイテムでのみ使用できるためkSecClassGenericPassword
、他のタイプのアイテムの「一意のキー」の一部にすることはできません。また、キーチェーンアイテムを一意に決定する属性を明確に指摘するドキュメントはないようです。
「GenericKeychain」の「KeychainItemWrapper」クラスのサンプルコードでは、属性kSecAttrGeneric
を使用してアイテムを一意にしていますが、これはバグです。この例の2つのエントリは、それらkSecAttrAccessGroup
が異なるため(1つはアクセスグループセットを持ち、もう1つは解放できるため)、2つの異なるエントリとしてのみ格納されます。Appleを使用して、アクセスグループなしで2番目のパスワードを追加しようとすると、KeychainItemWrapper
失敗します。
だから、私の質問に答えてください:
- それは、真実であることの組み合わせ
kSecAttrAccessGroup
、kSecAttrAccount
およびkSecAttrService
kSecClassがあるキーチェーン項目の「一意のキーは」ありますかkSecClassGenericPassword
? - その場合は、どの属性がキーチェーン項目がユニークなの
kSecClass
ではありませんかkSecClassGenericPassword
?