116

私の質問は、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 が であるキーチェーン項目の「一意のキー」であるというのは本当ですか? kSecAttrAccountkSecAttrServicekSecClassGenericPassword
  • kSecClassそうでない場合、キーチェーンアイテムを一意にする属性はどれkSecClassGenericPasswordですか?
4

4 に答える 4