キーチェーンアイテムをユニークにする要素は何ですか (iOS の場合)? 質問する

キーチェーンアイテムをユニークにする要素は何ですか (iOS の場合)? 質問する

私の質問は、iOS (iPhone、iPad、...) のキーチェーンに関するものです。Mac OS X でのキーチェーンの実装でも同じ質問が生じ、同じ答えが出るのではないかと思います (確信はありませんが)。


kSecClassiOS は、キーチェーン項目の 5 つのタイプ (クラス) を提供します。タイプを決定するには、キーに対してこれらの 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)

Apple のドキュメント、ブログ、フォーラムのエントリを長い間読んできた結果、 タイプのキーチェーン項目の一意性は、 、およびkSecClassGenericPasswordの属性から得られることがわかりました。kSecAttrAccessGroupkSecAttrAccountkSecAttrService

リクエスト 1 の 3 つの属性がリクエスト 2 と同じである場合、他の属性に関係なく、同じ汎用パスワード キーチェーン アイテムを受け取ります。これらの属性の 1 つ (または 2 つ、あるいはすべて) の値が変更されると、異なるアイテムが取得されます。

ただしkSecAttrService、 は タイプのアイテムでのみ使用可能であるkSecClassGenericPasswordため、他のタイプのアイテムの「一意のキー」の一部にすることはできません。また、どの属性がキーチェーン アイテムを一意に決定するかを明確に示すドキュメントはないようです。

「GenericKeychain」のクラス「KeychainItemWrapper」のサンプル コードでは、属性を使用してkSecAttrGenericアイテムを一意にしていますが、これはバグです。この例の 2 つのエントリは、 がkSecAttrAccessGroup異なるため (1 つにはアクセス グループが設定され、もう 1 つにはアクセス グループが解放されている)、2 つの異なるエントリとして保存されます。Apple の を使用して、アクセス グループなしで 2 番目のパスワードを追加しようとするとKeychainItemWrapper、失敗します。

それで、私の質問に答えてください:

  • 、および の組み合わせが、kSecAttrAccessGroupkSecClassが であるキーチェーン項目の「一意のキー」であるというのは本当ですか?kSecAttrAccountkSecAttrServicekSecClassGenericPassword
  • キーチェーン アイテムがkSecClassユニークでない場合にユニークにする属性は何ですかkSecClassGenericPassword?

ベストアンサー1

主キーは以下のとおりです(Appleのオープンソースファイルから取得、スキーマ.m4キースキーマ.m4そしてセクションアイテム.cpp):

  • クラスのキーチェーン項目の場合kSecClassGenericPassword、主キーはkSecAttrAccountとの組み合わせになりますkSecAttrService
  • クラスのキーチェーン項目の場合、主キーは、、、、、、およびのkSecClassInternetPassword組み合わせです。kSecAttrAccountkSecAttrSecurityDomainkSecAttrServerkSecAttrProtocolkSecAttrAuthenticationTypekSecAttrPortkSecAttrPath
  • クラスのキーチェーン項目の場合、主キーは、、およびkSecClassCertificateの組み合わせです。kSecAttrCertificateTypekSecAttrIssuerkSecAttrSerialNumber
  • クラス のキーチェーン項目の場合、主キーは、、、、、および SecItem によってまだ公開されていない作成者、開始日、終了日kSecClassKeyの組み合わせです。kSecAttrApplicationLabelkSecAttrApplicationTagkSecAttrKeyTypekSecAttrKeySizeInBitskSecAttrEffectiveKeySize
  • クラスのキーチェーン項目については、オープン ソース ファイルで主キー フィールドに関する情報が見つかりませんでしたが、ID は秘密キーと証明書の組み合わせであるため、主キーはとkSecClassIdentityの主キー フィールドの組み合わせであると想定しています。kSecClassKeykSecClassCertificate

各キーチェーン項目はキーチェーン アクセス グループに属しているため、キーチェーン アクセス グループ (フィールドkSecAttrAccessGroup) はこれらすべての主キーに追加されたフィールドのように見えます。

おすすめ記事