私の質問は、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
リンゴのドキュメント、ブログ、フォーラム エントリを長い間読んだ後、 type のキーチェーン アイテムが属性kSecAttrAccessGroup
、 、kSecAttrAccount
およびから一意性を取得することがわかりましたkSecAttrService
。
リクエスト 1 のこれら 3 つの属性がリクエスト 2 と同じである場合、他の属性に関係なく、同じ汎用パスワード キーチェーン アイテムを受け取ります。この属性の 1 つ (または 2 つ、またはすべて) が値を変更すると、別のアイテムが得られます。
ただしkSecAttrService
、 type のアイテムでのみ使用できるためkSecClassGenericPassword
、他のタイプのアイテムの「一意のキー」の一部にすることはできず、どの属性がキーチェーン アイテムを一意に決定するかを明確に指摘するドキュメントはないようです。
「GenericKeychain」のクラス「KeychainItemWrapper」のサンプルコードでは、属性kSecAttrGeneric
を使ってアイテムをユニークにしていますが、これはバグです。この例の 2 つのエントリは、2 つの別個のエントリとして保存されます。これは、それらkSecAttrAccessGroup
が異なるためです (1 つはアクセス グループ セットを持ち、もう 1 つはそれを解放します)。Apple の を使用して、アクセス グループなしで 2 つ目のパスワードを追加しようとすると、KeychainItemWrapper
失敗します。
それでは、私の質問に答えてください:
- との組み合わせが
kSecAttrAccessGroup
、kSecClass が であるキーチェーン項目の「一意のキー」であるというのは本当ですか?kSecAttrAccount
kSecAttrService
kSecClassGenericPassword
kSecClass
そうでない場合、キーチェーンアイテムを一意にする属性はどれkSecClassGenericPassword
ですか?