Keychain asoslari


ULASHISH

Keychain asoslari

Kichik maxfiy ma’lumotlarni (tokenlar, parollar) to‘g‘ri kirish nazorati bilan Keychain API’lari yordamida xavfsiz saqlang.


Maxfiy ma’lumotni saqlash (qo‘shish)

SecItemAdd ni elementni tavsiflovchi dictionary bilan birga ishlating.

Sintaksis:

  • SecItemAdd(attrs as CFDictionary, nil)
  • class kSecClassGenericPassword
  • account/service kalitlari.

Misol

import Security

func saveToken(_ token: String) {
  let data = token.data(using: .utf8)!
  let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: "com.example.auth",
    kSecAttrAccount as String: "session",
    kSecValueData as String: data,
    kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlock
  ]
  SecItemDelete(query as CFDictionary) // replace if exists
  let status = SecItemAdd(query as CFDictionary, nil)
  assert(status == errSecSuccess)
}
import SwiftUI

struct ContentView: View {
  var body: some View {
    Text("Keychain Add Example")
      .padding()
  }
}
import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup { ContentView() }
  }
}

Ushbu misol tokenni generic password sifatida yozadi va xuddi shu service/account uchun mavjud qiymatni almashtiradi.



Maxfiy ma’lumotni o‘qish (so‘rov)

Saqlangan baytlarni olish uchun SecItemCopyMatching ni kSecReturnData bilan birga ishlating.

Sintaksis: SecItemCopyMatching(query as CFDictionary, &item)

Misol

import Security

func loadToken() -> String? {
  let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: "com.example.auth",
    kSecAttrAccount as String: "session",
    kSecReturnData as String: true,
    kSecMatchLimit as String: kSecMatchLimitOne
  ]
  var item: CFTypeRef?
  let status = SecItemCopyMatching(query as CFDictionary, &item)
  guard status == errSecSuccess, let data = item as? Data else { return nil }
  return String(data: data, encoding: .utf8)
}
import SwiftUI

struct ContentView: View {
  var body: some View {
    Text("Keychain Query Example")
      .padding()
  }
}
import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup { ContentView() }
  }
}

Ushbu misol avval saqlangan tokenni service/account bo‘yicha moslab o‘qiydi va ma’lumotlarni qaytaradi.


Yangilash yoki o‘chirish

Yangilanadigan atributlar dictionary’sini uzatib SecItemUpdate bilan yangilang; SecItemDelete bilan o‘chiring.

Sintaksis:

  • SecItemUpdate(query, updates)
  • SecItemDelete(query)

Misol

import Security

func deleteToken() {
  let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: "com.example.auth",
    kSecAttrAccount as String: "session",
  ]
  SecItemDelete(query as CFDictionary)
}
import SwiftUI

struct ContentView: View {
  var body: some View {
    Text("Keychain Delete Example")
      .padding()
  }
}
import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup { ContentView() }
  }
}

Ushbu misol saqlangan maxfiy ma’lumotni o‘chiradi. Qiymat yoki atributlarni o‘zgartirish kerak bo‘lganda update’dan foydalaning.

Maslahat: Hisob ma’lumotlari (credentials) uchun Keychain’ni afzal ko‘ring; maxfiy ma’lumotlarni UserDefaults da saqlamang.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!