IT

키 체인 항목을 고유하게 만드는 것은 무엇입니까 (iOS에서)?

lottoking 2020. 8. 30. 09:02
반응형

키 체인 항목을 고유하게 만드는 것은 무엇입니까 (iOS에서)?


제 질문은 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속성 kSecAttrAccessGroup, kSecAttrAccount에서 고유 한 것을 얻는 것을 알게되었습니다 kSecAttrService.

요청 1의 세 속성이 요청 2와 같으면 다른 속성에 관계없이 동일한 비밀번호 키 체인 항목을받습니다. 이 속성 중 하나 (또는 ​​둘 또는 모두)가 해당 값을 변경하면 다른 항목이 발생합니다.

그러나 kSecAttrService유형의 항목에만 사용할 수 kSecClassGenericPassword있으므로 다른 유형의 항목의 "고유 키"의 일부가 될 수 있습니다. 어떤 속성이 키 체인을 고유하게 사용할 것인지 결정하는지 명확하게 지적하는 문서가없는 것입니다.

"GenericKeychain"의 "KeychainItemWrapper"클래스에있는 샘플 코드는 속성 kSecAttrGeneric을 사용하여 항목을 고유하게 만들지 만 이는 버그입니다. 이 예의 두 항목 kSecAttrAccessGroup은 서로 다르기 때문에 두 개의 고유 항목으로 만 저장됩니다 (하나는 액세스 그룹 세트가있는 다른 하나는 해제 할 수 있음). 액세스 그룹없이 Apple을 사용하여 두 번째 비밀번호를 추가 KeychainItemWrapper하려고 시도합니다.

제 질문에 답 해주세요.

  • 그것은 사실이다의 조합 kSecAttrAccessGroup, kSecAttrAccount그리고 kSecAttrServicekSecClass는 키 체인 항목의 "고유 키가" kSecClassGenericPassword?
  • 키 체인 항목이 고유 kSecClass하지 않은 경우 고유하게 만드는 속성은 kSecClassGenericPassword무엇입니까?

(Apple의 오픈 소스 파일에서 파생 됨, Schema.m4 , KeySchema.m4SecItem.cpp 참조 ).

  • 클래스의 키 체인 항목의 경우 kSecClassGenericPassword기본 키는 kSecAttrAccount의 조합입니다 kSecAttrService.
  • 클래스의 키 체인 항목에 대해 kSecClassInternetPassword, 기본 키의 조합입니다 kSecAttrAccount, kSecAttrSecurityDomain, kSecAttrServer, kSecAttrProtocol, kSecAttrAuthenticationType, kSecAttrPortkSecAttrPath.
  • 클래스 키 체인 항목의의 kSecClassCertificate경우 기본 키는 kSecAttrCertificateType, kSecAttrIssuer의 조합입니다 kSecAttrSerialNumber.
  • 클래스의 키 체인 항목에 대해 kSecClassKey, 기본 키의 조합입니다 kSecAttrApplicationLabel, kSecAttrApplicationTag, kSecAttrKeyType, kSecAttrKeySizeInBits, kSecAttrEffectiveKeySize,와 창조자, 아직 SecItem에 의해 노출되지 않은 날짜와 종료 날짜를 시작합니다 .
  • 클래스의 체인 항목의 경우 kSecClassIdentity오픈 소스 파일에서 기본 키 필드에 정보를 찾지 못했지만 ID는 개인 키와 인증서 조합 기본 키가 기본 키의 조합이라고 가정합니다. kSecClassKey및에 대한 필드 kSecClassCertificate.

각 키 체인 항목은 키 체인 접근 그룹에 속삭이 키 체인 접근 그룹 (필드 kSecAttrAccessGroup)이 기본 키에 모든 기본 키에 추가 된 필드 인 것처럼 느껴집니다 .


요 전에이 질문과 관련된 버그 (iOS 7.1)에 부딪 혔습니다. 내가 사용하던 SecItemCopyMatching읽기 kSecClassGenericPassword항목을 돌아 돌아 유지를 errSecItemNotFound위해 (-25300)를 kSecAttrAccessGroup, kSecAttrAccount그리고 kSecAttrService모든 키 체인 항목을 일치했다.

결국 나는 kSecAttrAccessible그것이 일치하지 않는다는 것을 깨달았 습니다. 키 체인의 값은 pdmn = dk ( kSecAttrAccessibleAlways)를 보유했지만 kSecAttrAccessibleWhenUnlocked.

물론이 값에 대한 첫 번째 장소 에 필요하지 않은 SecItemCopyMatching,이하지만 OSStatus있니 었 errSecParam도 계명 errSecBadReq하지만 단지 errSecItemNotFound(-25300)가 조금 까다 발견하게한다.

들어 SecItemUpdate저도 같은 문제가 발생하지만, 방법에서도 동일한이 사용했다 kSecAttrAccessible에서 query매개 변수가 작동하지 않았다. 이 속성을 없애 제거합니다.

이 의견이 여러분 중 일부를 위해 소중한 사람들 순간을 절약 할 수 있기를 바랍니다.


@Tammo Freese가 제공하는 답변이 올바른 것 제공합니다 (모든 기본 키를 언급합니다). 문서에서 증거를 찾고 있습니다. 결국 찾았다 :

각 비밀 등급에 대한 기본 키를 언급하는 Apple 문서 (아래 인용문) :

시스템은 해당 키 체인에 동일한 복합 기본 키 세트가있는 동일한 클래스의 항목이 이미있는 경우 해당 키 체인에 대한 항목이있는 경우에는 동일한 클래스의 항목이 있습니다. 모든 클래스 에서 몇 가지 속성이 공통적으로 사용되는 모든 키 체인 항목의 각 클래스에는 다른 기본 키 체인이 있습니다. 특히, 해당되는 경우 kSecAttrSynchronizable 및 kSecAttrAccessGroup은 기본 키 세트의 일부입니다 . 추가 클래스 별 기본 키는 다음과 가변합니다.

  • 일반 암호의 경우 기본 키 에는 kSecAttrAccount 및 kSecAttrService가 포함됩니다.
  • 인터넷 암호의 경우 기본 키 에는 kSecAttrAccount, kSecAttrSecurityDomain, kSecAttrServer, kSecAttrProtocol, kSecAttrAuthenticationType, kSecAttrPort 및 kSecAttrPath가 포함됩니다.
  • 인증서의 경우 기본 키 에는 kSecAttrCertificateType, kSecAttrIssuer 및 kSecAttrSerialNumber가 포함됩니다.
  • 키 항목의 경우 기본 키 에는 kSecAttrKeyClass, kSecAttrKeyType, kSecAttrApplicationLabel, kSecAttrApplicationTag, kSecAttrKeySizeInBits 및 kSecAttrEffectiveKeySize가 포함됩니다.
  • 인증서와 개인 키가 함께 번들 된 ID 항목의 경우 기본 키는 인증서와 동일합니다. 개인 키는 두 번 이상 인증 될 수 있으므로 인증서의 고유성에 따라 ID의 고유성이 결정됩니다.

참고 URL : https://stackoverflow.com/questions/11614047/what-makes-a-keychain-item-unique-in-ios

반응형