Статус цепочки ключей Swift -50

#swift #keychain

#swift #Связка ключей

Вопрос:

Я пытаюсь использовать связку ключей в swift для сохранения пароля, но когда я пытаюсь вызвать свой метод сохранения, он возвращает статус -50.

Вот моя функция:

  class func save(key: String, data: String) -> OSStatus {
        let query = [
            kSecClass as String       : kSecClassGenericPassword as String,
            kSecAttrAccount as String : key,
            kSecValueData as String   : data ]

        SecItemDelete(query as CFDictionary)

        return SecItemAdd(query as CFDictionary, nil)
    }

 class func load(key: String) -> String? {
        let query = [
            kSecClass as String       : kSecClassGenericPassword,
            kSecAttrAccount as String : key,
            kSecReturnData as String  : kCFBooleanTrue!,
            kSecMatchLimit as String  : kSecMatchLimitOne ] as [String : Any]

        var dataTypeRef: AnyObject? = nil

        let status: OSStatus = SecItemCopyMatching(query as CFDictionary, amp;dataTypeRef)

        if status == noErr {
            return dataTypeRef as! String?
        } else {
            return nil
        }
    }
  

И затем моя попытка вызвать эти функции:

 let status = KeyChain.save(key: "Ufde", data: "Eli")
                    print("status: ", status)
                    let receivedData = KeyChain.load(key: "Ufde") 
                        print(receivedData)
  

Я впервые пытаюсь использовать связку ключей, поэтому прошу прощения, если есть что-то действительно очевидное, что я здесь делаю неправильно/

Комментарии:

1. Я не слишком уверен, но вы уверены, что это -5 не -50 так? У меня есть подозрение, что SecItemDelete подводит вас, и, насколько я знаю, kSecAttrAccount для общего пароля не является уникальным. Еще одна вещь, которую я заметил, при сохранении вы говорите kSecClassGenericPassword as String , опустите это as String . Последнее, на что я хотел бы обратить внимание, это то, что kSecValueData ожидает Data или, если на то пошло CFData . Попробуйте String сначала преобразовать свой, прежде чем сохранять

Ответ №1:

Вы сохраняете пароль в виде строки внутри цепочки ключей. Преобразование строки пароля в данные

 class func save(key: String, password: String) -> OSStatus {
 let data = password.data(using: .utf8)!
 let query = [
     kSecClass as String       : kSecClassGenericPassword as String,
     kSecAttrAccount as String : key,
     kSecValueData as String   : data]
     SecItemDelete(query as CFDictionary)
     return SecItemAdd(query as CFDictionary, nil)
}