1. ホーム
  2. objective-c

[解決済み] キーチェーンのアイテムは何がユニークなのか(iOSの場合)?

2022-05-18 04:45:24

質問

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


iOS では、キーチェーンのアイテムに 5 つのタイプ (クラス) が用意されています。キーには、これら 5 つの値のいずれかを選択する必要があります。 kSecClass というキーで、その種類を決定します。

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 , kSecAttrAccountkSecAttrService .

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

しかし kSecAttrServicekSecClassGenericPassword でしか使用できないため、他のタイプのアイテムの "ユニーク キー" の一部にはなりえず、どの属性がキーチェーン アイテムを一意に決定するかを明確に指摘する文書もないようです。

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

では、私の質問に答えてください。

  • の組み合わせは本当ですか? kSecAttrAccessGroup , kSecAttrAccountkSecAttrService は、kSecClassが kSecClassGenericPassword ?
  • キーチェーンのアイテムが kSecClasskSecClassGenericPassword ?

どのように解決するのですか?

主キーは以下の通りです (Appleのオープンソースファイルから派生しました。 Schema.m4 , キースキーマ.m4 SecItem.cpp ):

  • クラスのキーチェーン・アイテムの場合 kSecClassGenericPassword の組み合わせで、主キーは kSecAttrAccountkSecAttrService .
  • クラスのキーチェーン・アイテムの場合 kSecClassInternetPassword の組み合わせで、主キーは kSecAttrAccount , kSecAttrSecurityDomain , kSecAttrServer , kSecAttrProtocol , kSecAttrAuthenticationType , kSecAttrPortkSecAttrPath .
  • クラスのキーチェーン・アイテムの場合 kSecClassCertificate の組み合わせで、主キーは kSecAttrCertificateType , kSecAttrIssuerkSecAttrSerialNumber .
  • クラスのキーチェーン・アイテムの場合 kSecClassKey の組み合わせで、主キーは kSecAttrApplicationLabel , kSecAttrApplicationTag , kSecAttrKeyType , kSecAttrKeySizeInBits , kSecAttrEffectiveKeySize そして、SecItem ではまだ公開されていない作成者、開始日、終了日です。
  • クラスのキーチェーンアイテムの場合 kSecClassIdentity オープンソースのファイルでは主キーのフィールドに関する情報は見つかりませんでしたが、 ID は秘密鍵と証明書の組み合わせであることから、主キーは kSecClassKeykSecClassCertificate .

各キーチェーンアイテムはキーチェーンアクセスグループに属しているため、キーチェーンアクセスグループのように感じます(フィールド kSecAttrAccessGroup ) は、これらすべての主キーに追加されたフィールドであるように感じられます。