مبانی Keychain (Keychain Basics)
اینجا «کی چین (Keychain)» را خیلی ساده می گوییم. کی چین صندوق رمز است. توکن و گذرواژه را امن نگه می دارد. تمرکز ما امنیت و سادگی است. کلید سئو: کی چین iOS.
کی چین چیست؟
کی چین فضای امن سیستم است. «راز (Secret)» مثل توکن اینجاست ذخیره می شود. با «کنترل دسترسی (Access Control)» از آن محافظت می کنیم. مثل کمد قفل دار مدرسه است.
برای مسیر تکمیلی، راهنمای App Clips را هم ببین. همچنین می توانی راهنمای کی چین iOS را نشانه گذاری کنی.
افزودن راز با SecItemAdd
اول «صفت ها (Attributes)» را می سازیم. سپس با SecItemAdd ذخیره می کنیم. اسم سرویس و حساب باید ثابت باشند.
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);
let status = SecItemAdd(query as CFDictionary, nil);
assert(status == errSecSuccess);
}
اینجا اگر مقدار قبلی باشد، حذف می شود. سپس مقدار تازه ذخیره می شود. این روش جایگزینی امن می دهد.
خواندن راز با SecItemCopyMatching
برای خواندن، دنبال همان سرویس و حساب می گردیم. سپس بایت ها را رشته می کنیم.
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 else {
return nil;
}
guard let data = item as? Data else {
return nil;
}
return String(data: data, encoding: .utf8);
}
اگر چیزی پیدا نشد، مقدار تهی برمی گردد. بنابراین خطا ساده مدیریت می شود.
به روزرسانی یا حذف با SecItemUpdate/Delete
برای تغییر، از SecItemUpdate استفاده کن. اما حذف با SecItemDelete آسان تر است.
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);
}
نکته: برای اعتبارنامه از کی چین استفاده کن. رازها را در UserDefaults نگذار.
گام های عملی سریع
- 1) سرویس و حساب را مشخص کن.
- 2) داده رمز را به بایت تبدیل کن.
- 3) SecItemAdd را با صفات صدا بزن.
- 4) برای خواندن، SecItemCopyMatching را صدا بزن.
- 5) برای حذف، SecItemDelete را اجرا کن.
جمع بندی سریع
- کی چین صندوق رمز سیستم است.
- سرویس و حساب را ثابت نگه دار.
- ذخیره با SecItemAdd انجام می شود.
- خواندن با SecItemCopyMatching انجام می شود.
- حذف با SecItemDelete ساده است.