#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)
}