TIL81 ✨

YaR Lab·2023년 8월 13일
0

TIL✨

목록 보기
69/135
post-thumbnail

🗓️23.08.14

KeyChain Data 저장하기

  • KeyChain에 Data를 저장하기 위해 필요한 요소에는 무엇이 있는지 확인해봅시다.
    • Data, Attribute, KeychainItem은 서로 어떤 관계일까요?
      : Data는 저장하고 싶은 정보, Attribute는 데이터에 대한 접근성을 제어하고 검색을 위한 공개된 속성, keychainItem은 이 두 값을 모두 포함한 아이템
    • 우리가 메인 화면에서 비밀번호를 만들어, Data로 저장하고 싶다면, 어떤 과정을 거쳐야 할까요?
      : kSecClass를 정해준 뒤 kSecValueData에 저장하고 싶은 데이터를 Data타입으로 변환하여 Item query를 만듬
    • 필요한 KeychainItem의 각 Attribute가 어떤 의미를 가지는지 이해해봅시다.
      • kSecClass는 저장하는 데이터의 종류
      • kSecAttrAccount는 계정이름
static func addPassword(password: String) {
    let password = password.data(using: .utf8)
    
    let addquery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                   kSecValueData as String: password]
    
    let status = SecItemAdd(addquery as CFDictionary, nil)
    
    if status == errSecSuccess {
        print("비밀번호 등록 성공")
    } else {
        print("등록 실패")
    }
}

KeyChain Data 꺼내오기

  • SecItemCopyMatching 메서드의 두 매개변수를 확인해봅시다.
    • query는 무엇에 활용될까요?
      : 키체인에 저장된 Data를 검색하고 접근하는데 사용
    • query 를 구성하는 요소들에는 무엇이 있을까요?
      : 키체인에 Data를 저장할때 사용된 Attribute를 포함
    • result는 무엇에 활용될까요?
      : 받아온 값을 저장하는 곳
static func receivePassword() -> String? {
    let getquery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                   kSecReturnData as String: true]
    var password: AnyObject?
    
    let status = SecItemCopyMatching(getquery as CFDictionary, &password)
    
    if status == errSecSuccess {
        guard let password = password as? Data, let password = String(data: password, encoding: .utf8) else {
            print("가져오기 실패")
            return nil
        }
        
        print("비밀번호 가져오기 성공")
        
        return password
    } else {
        print("가져오기 실패")
        
        return nil
    }
}

KeyChain Data 업데이트하기

static func updatePassword(_ changePassword: String) -> Bool {
    let changePassword = changePassword.data(using: .utf8)
    let changequery: [String: Any] = [kSecValueData as String: changePassword]
    
    let genericQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword]
    
    let status = SecItemUpdate(genericQuery as CFDictionary, changequery as CFDictionary)
    
    if status == errSecSuccess {
        print("비밀번호 변경 성공")
        return true
    } else {
        print("비밀번호 변경 실패")
        return false
    }
}

참고 링크

🍎 Storing Keys in the Keychain
🍎 Searching for Keychain Items
🍎 Updating and Deleting Keychain Items
🍎 Keychain Items
🍎 Item Attribute Keys and Values

Enum의 rawValue

공부해야할 것

https://velog.io/@eddy_song/alan-kay-OOP

https://velog.io/@eddy_song/oop-starting-point

https://search.shopping.naver.com/book/catalog/32482589668?cat_id=50010920&frm=PBOKMOD&query=객체지향의+사실과+오해&NaPm=ct%3Dllan59tc%7Cci%3Db4455c3a645b28f959442a40cf72ac77293bc72b%7Ctr%3Dboknx%7Csn%3D95694%7Chk%3D58a47bd01b64cd5114cbc82d5fb7f61ca02e698a

0개의 댓글