키 체인 항목을 고유하게 만드는 것은 무엇입니까 (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
그리고kSecAttrService
kSecClass는 키 체인 항목의 "고유 키가"kSecClassGenericPassword
? - 키 체인 항목이 고유
kSecClass
하지 않은 경우 고유하게 만드는 속성은kSecClassGenericPassword
무엇입니까?
(Apple의 오픈 소스 파일에서 파생 됨, Schema.m4 , KeySchema.m4 및 SecItem.cpp 참조 ).
- 클래스의 키 체인 항목의 경우
kSecClassGenericPassword
기본 키는kSecAttrAccount
및 의 조합입니다kSecAttrService
. - 클래스의 키 체인 항목에 대해
kSecClassInternetPassword
, 기본 키의 조합입니다kSecAttrAccount
,kSecAttrSecurityDomain
,kSecAttrServer
,kSecAttrProtocol
,kSecAttrAuthenticationType
,kSecAttrPort
와kSecAttrPath
. - 클래스 키 체인 항목의의
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
'IT' 카테고리의 다른 글
Django 설정 기본 로깅 (0) | 2020.08.30 |
---|---|
.h 또는 .c 파일에 포함되어 있습니까? (0) | 2020.08.30 |
연결 목록의 중간에 삽입하는 이유 O (1)? (0) | 2020.08.30 |
.NET 어셈블리에 서명하지 않는 데 문제가 있습니까? (0) | 2020.08.30 |
ARG 또는 ENV,이 경우 어느 것을 선호합니까? (0) | 2020.08.30 |