Sobes.tech
Junior

Koja je razlika između Keychain i User Defaults?

sobes.tech АИ

Одговор од АИ

UserDefaults се koristi za skladištenje malih, ne poverljivih podataka poput podešavanja korisnika ili stanja aplikacije. Podaci se čuvaju u obliku parova ključ-vrednost u fajlu .plist i dostupni su svim delovima aplikacije. UserDefaults ne šifruje podatke i nije pogodan za čuvanje kritičnih informacija.

Keychain se koristi za sigurno čuvanje poverljivih podataka, kao što su lozinke, sertifikati, tokeni i druge osetljive informacije. Podaci se šifruju i čuvaju u specijalizovanom skladištu, dostupnom samo aplikaciji koja ih je zapisala. Keychain je podržan na nivou operativnog sistema i obezbeđuje visok stepen zaštite podataka.

Ključne razlike:

Karakteristika UserDefaults Keychain
Svrha Čuvanje ne poverljivih podešavanja Čuvanje poverljivih podataka (lozinke, tokeni)
Bezbednost Ne sadrži ugrađeno šifrovanje Podaci su šifrovani
Pristup Dostupno svim delovima aplikacije Dostupno samo aplikaciji koja ih je sačuvala
Obim podataka Pogodno za male obime podataka Pogodno za male obime poverljivih podataka
Implementacija Jednostavan API, skladištenje u fajlu .plist Složeniji API, skladištenje u sistemskom skladištu

Primer korišćenja UserDefaults:

// Čuvanje vrednosti
UserDefaults.standard.set("dark", forKey: "theme")

// Dobijanje vrednosti
let theme = UserDefaults.standard.string(forKey: "theme")

Primer korišćenja Keychain (zahteva rad sa SecItem API ili omotima):

// Primer dodavanja lozinke ( pojednostavljeno, zahteva obradu grešaka i dodatne parametre)
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)
// Obrada statusa

// Primer dobijanja lozinke ( pojednostavljeno, zahteva obradu grešaka)
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)
    // Korišćenje lozinke
}