[Swift] iOS 키체인 관리

코랑·2023년 4월 19일

ios

목록 보기
1/3

Keychain



위 그림에서 Item을 만들때 CFDictionary 타입의 query를 만드는데 이것은 어떻게 조합하는 것인가?

1. kSecClass: 이 키체인은 어떤 정보를 담고있는가

kSecClassGenericPassword: 일반적인 비밀번호
kSecClassInternetPassword: 웹사이트 비밀번호
kSecClassCertificate: 인증서
kSecClassKey: 개인 키
kSecClassIdentity: 인증서 + 개인키

2. Attributes

공통

  • kSecAttrAccessible: 키체인 접근 권한 설정 key
    • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: 키체인 데이터가 디바이스 잠금 해제 시에만 접근 가능함. (+ passcode가 설정 돼 있을 때만 사용 가능함)
    • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: 사용자에의해 잠금이 해제되어있는 동안에만 접근 가능
    • kSecAttrAccessibleWhenUnlocked: 사용자에의해 잠금이 해제되어있는 동안에만 접근 가능
    • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: 재시작 후 사용자가 한번 기기가 잠금해제 하기 전까지 접근이 불가능
    • kSecAttrAccessibleAfterFirstUnlock: 재시작 후 사용자가 한번 기기가 잠금해제 하기 전까지 접근이 불가능
  • kSecAttrSynchronizable: cloud 연동 여부

특정 클래스에서만 가능한 것들

  • kSecAttrAccount: kSecClassGenericPassword, kSecClassInternetPasword일 때는 kSecAttrAccount에 대한 정보를 반드시 입력해줘야함
  • GenericPassword
    - kSecAttrAccess(macOS only)
    - kSecAttrAccessControl
    - kSecAttrAccessGroup (iOS; also macOS if kSecAttrSynchronizable specified)
    - kSecAttrAccessible (iOS; also macOS if kSecAttrSynchronizable specified)
    - kSecAttrCreationDate
    - kSecAttrModificationDate
    - kSecAttrDescription
    - kSecAttrComment
    - kSecAttrCreator
    - kSecAttrType
    - kSecAttrLabel
    - kSecAttrIsInvisible
    - kSecAttrIsNegative
    - kSecAttrAccount
    - kSecAttrService
    - kSecAttrGeneric
    - kSecAttrSynchronizable
  • InternetPassword
    - kSecAttrAccess (macOS only)
    - kSecAttrAccessGroup(iOS; also macOS if kSecAttrSynchronizable specified)
    - kSecAttrAccessible (iOS; also macOS if kSecAttrSynchronizable specified)
    - kSecAttrCreationDate
    - kSecAttrModificationDate
    - kSecAttrDescription
    - kSecAttrComment
    - kSecAttrCreator
    - kSecAttrType
    - kSecAttrLabel
    - kSecAttrIsInvisible
    - kSecAttrIsNegative
    - kSecAttrAccount
    - kSecAttrSecurityDomain
    - kSecAttrServer
    - kSecAttrProtocol
    - kSecAttrAuthenticationType
    - kSecAttrPort
    - kSecAttrPath
    - kSecAttrSynchronizable
  • Certificate
    - kSecAttrAccess (macOS only)
    - kSecAttrAccessGroup (iOS only)
    - kSecAttrAccessible (iOS only)
    - kSecAttrCertificateType
    - kSecAttrCertificateEncoding
    - kSecAttrLabel
    - kSecAttrSubject
    - kSecAttrIssuer
    - kSecAttrSerialNumber
    - kSecAttrSubjectKeyID
    - kSecAttrPublicKeyHash
  • Key
    - kSecAttrAccess (macOS only)
    - kSecAttrAccessGroup (iOS only)
    - kSecAttrAccessible (iOS only)
    - kSecAttrKeyClass
    - kSecAttrLabel
    - kSecAttrApplicationLabel
    - kSecAttrIsPermanent
    - kSecAttrApplicationTag
    - kSecAttrKeyType
    - kSecAttrPRF
    - kSecAttrSalt
    - kSecAttrRounds
    - kSecAttrKeySizeInBits
    - kSecAttrEffectiveKeySize
    - kSecAttrCanEncrypt
    - kSecAttrCanDecrypt
    - kSecAttrCanDerive
    - kSecAttrCanSign
    - kSecAttrCanVerify
    - kSecAttrCanWrap
    - kSecAttrCanUnwrap
  • Identity => Certification+key

3.키체인 만들기

  • 키체인 만들기: SecItemAdd(attributes:CFDictionary, result) 사용
  • 키체인 찾기: SecItemCopyMatching(query: CFDictionary, result)
    • let kSecReturnData: data 타입 리턴
    • let kSecReturnAttributes: attribute 리턴
    • let kSecReturnRef: SecKeychainItem, SecKey, SecCertificate, SecIdentity, or CFData.
    • let kSecReturnPersistentRef: 영구 저장되는 Data
  • 키체인 지우기: SecItemDelete(query: CFDictionary)
  • 키체인 수정: SecItemUpdate(query: CFDictionary, result)텍스트

0개의 댓글