Kuo skiriasi Keychain nuo User Defaults?
sobes.tech AI
Atsakymas iš AI
UserDefaults naudojamas saugoti mažus, ne konfidencialius duomenis, tokius kaip naudotojo nustatymai ar programos būsena. Duomenys saugomi kaip raktas-reikšmės poros .plist faile ir yra prieinami visoms programos dalims. UserDefaults nešifruoja duomenų ir nėra tinkamas saugoti kritiškai svarbios informacijos.
Keychain naudojamas saugiai saugoti konfidencialius duomenis, tokius kaip slaptažodžiai, sertifikatai, tokenai ir kita jautri informacija. Duomenys yra šifruojami ir saugomi specializuotoje saugykloje, prie kurios turi prieigą tik ta programa, kuri juos įrašė. Keychain palaikomas operacinės sistemos lygiu ir užtikrina aukštą duomenų apsaugos lygį.
Pagrindiniai skirtumai:
| Savybė | UserDefaults | Keychain |
|---|---|---|
| Paskirtis | Saugojimas ne konfidencialių nustatymų | Saugojimas konfidencialių duomenų (slaptažodžių, tokenų) |
| Saugumas | Nėra įmontuoto šifravimo | Duomenys yra šifruojami |
| Prieiga | Prieinama visoms programos dalims | Prieinama tik programai, kuri juos įrašė |
| Duomenų kiekis | Tinka mažiems duomenų kiekiams | Tinka mažiems konfidencialių duomenų kiekiams |
| Įgyvendinimas | Paprastas API, saugojimas .plist faile |
Sudėtingesnis API, saugojimas sisteminiame saugykloje |
Pavyzdys naudojant UserDefaults:
// Vertės išsaugojimas
UserDefaults.standard.set("dark", forKey: "theme")
// Vertės gavimas
let theme = UserDefaults.standard.string(forKey: "theme")
Pavyzdys naudojant Keychain (reikalauja darbų su SecItem API arba apvalkale):
// Slaptažodžio pridėjimas (supaprastintas, reikalauja klaidų apdorojimo ir papildomų parametrų)
let password = "mySecretPassword".data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "myAccount",
kSecValueData as String: password
]
let statusAdd = SecItemAdd(query as CFDictionary, nil)
// Statuso apdorojimas
// Slaptažodžio gavimas (supaprastintas, reikalauja klaidų apdorojimo)
let queryGet: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "myAccount",
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne
]
var item: CFTypeRef?
let statusGet = SecItemCopyMatching(queryGet as CFDictionary, &item)
if statusGet == errSecSuccess {
let retrievedData = item as! Data
let retrievedPassword = String(data: retrievedData, encoding: .utf8)
// Naudojimas slaptažodžio
}