私の質問は、iOS (iPhone、iPad、...) のキーチェーンに関するものです。Mac OS X でのキーチェーンの実装でも同じ質問が生じ、同じ答えが出るのではないかと思います (確信はありませんが)。
kSecClass
iOS は、キーチェーン項目の 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
の属性から得られることがわかりました。kSecAttrAccessGroup
kSecAttrAccount
kSecAttrService
リクエスト 1 の 3 つの属性がリクエスト 2 と同じである場合、他の属性に関係なく、同じ汎用パスワード キーチェーン アイテムを受け取ります。これらの属性の 1 つ (または 2 つ、あるいはすべて) の値が変更されると、異なるアイテムが取得されます。
ただしkSecAttrService
、 は タイプのアイテムでのみ使用可能であるkSecClassGenericPassword
ため、他のタイプのアイテムの「一意のキー」の一部にすることはできません。また、どの属性がキーチェーン アイテムを一意に決定するかを明確に示すドキュメントはないようです。
「GenericKeychain」のクラス「KeychainItemWrapper」のサンプル コードでは、属性を使用してkSecAttrGeneric
アイテムを一意にしていますが、これはバグです。この例の 2 つのエントリは、 がkSecAttrAccessGroup
異なるため (1 つにはアクセス グループが設定され、もう 1 つにはアクセス グループが解放されている)、2 つの異なるエントリとして保存されます。Apple の を使用して、アクセス グループなしで 2 番目のパスワードを追加しようとするとKeychainItemWrapper
、失敗します。
それで、私の質問に答えてください:
- 、および の組み合わせが、
kSecAttrAccessGroup
kSecClassが であるキーチェーン項目の「一意のキー」であるというのは本当ですか?kSecAttrAccount
kSecAttrService
kSecClassGenericPassword
- キーチェーン アイテムが
kSecClass
ユニークでない場合にユニークにする属性は何ですかkSecClassGenericPassword
?
ベストアンサー1
主キーは以下のとおりです(Appleのオープンソースファイルから取得、スキーマ.m4、キースキーマ.m4そしてセクションアイテム.cpp):
- クラスのキーチェーン項目の場合
kSecClassGenericPassword
、主キーはkSecAttrAccount
との組み合わせになりますkSecAttrService
。 - クラスのキーチェーン項目の場合、主キーは、、、、、、およびの
kSecClassInternetPassword
組み合わせです。kSecAttrAccount
kSecAttrSecurityDomain
kSecAttrServer
kSecAttrProtocol
kSecAttrAuthenticationType
kSecAttrPort
kSecAttrPath
- クラスのキーチェーン項目の場合、主キーは、、および
kSecClassCertificate
の組み合わせです。kSecAttrCertificateType
kSecAttrIssuer
kSecAttrSerialNumber
- クラス のキーチェーン項目の場合、主キーは、、、、、および SecItem によってまだ公開されていない作成者、開始日、終了日
kSecClassKey
の組み合わせです。kSecAttrApplicationLabel
kSecAttrApplicationTag
kSecAttrKeyType
kSecAttrKeySizeInBits
kSecAttrEffectiveKeySize
- クラスのキーチェーン項目については、オープン ソース ファイルで主キー フィールドに関する情報が見つかりませんでしたが、ID は秘密キーと証明書の組み合わせであるため、主キーはと
kSecClassIdentity
の主キー フィールドの組み合わせであると想定しています。kSecClassKey
kSecClassCertificate
各キーチェーン項目はキーチェーン アクセス グループに属しているため、キーチェーン アクセス グループ (フィールドkSecAttrAccessGroup
) はこれらすべての主キーに追加されたフィールドのように見えます。