Keychain — konsep kunci, arsitektur dan cara kerjanya

Penulis: IT Sectr Diterbitkan: 2026-03-14 Waktu membaca: 10 mnt

Keychain — adalah penyimpanan aman kredensial di iOS, watchOS, macOS dan tvOS yang mengelola kata sandi, kunci dan sertifikat pada tingkat perangkat keras. Tidak seperti UserDefaults, data di Keychain dienkripsi dan diisolasi oleh sandbox aplikasi. Menurut Apple Developer Documentation, Keychain menggunakan mekanisme Secure Enclave dan enkripsi perangkat keras AES-256 untuk melindungi informasi rahasia.

Poin utama

  • Keychain — penyimpanan sistem iOS untuk kata sandi, kunci dan sertifikat dengan enkripsi perangkat keras
  • Security framework menyediakan fungsi C SecItemAdd, SecItemCopyMatching dan SecItemDelete untuk bekerja dengan Keychain
  • Akses ke Keychain dibatasi oleh sandbox aplikasi, tetapi akses bersama dimungkinkan melalui keychain access groups
  • Atribut kSecAttrAccessible menentukan tingkat perlindungan: dari Always hingga WhenUnlockedThisDeviceOnly
  • Keychain mendukung penyimpanan kata sandi, kunci simetris dan asimetris, sertifikat X.509

Apa itu Keychain?

Keychain — adalah basis data aman dari sistem operasi Apple, yang dirancang untuk menyimpan kata sandi, kunci kriptografi, sertifikat dan data rahasia lainnya secara aman. Keychain pertama kali muncul di Mac OS 8.6 pada tahun 1999, dan di iOS — sejak versi pertama SDK.

Definisi dan tujuan

Keychain memecahkan masalah fundamental pengembangan seluler: menyimpan rahasia (token, kata sandi, kunci enkripsi) di sistem file yang tidak aman. Tidak seperti UserDefaults atau SQLite, data di Keychain disimpan dalam bentuk terenkripsi dan secara otomatis dienkripsi saat ditulis ke disk.

Setiap aplikasi iOS beroperasi di sandbox terisolasi dan hanya memiliki akses ke keychain miliknya sendiri. Namun pengembang dapat mengonfigurasi akses bersama ke Keychain antar aplikasi dari pengembang yang sama melalui keychain access groups. Pengguna iCloud Keychain juga menyinkronkan data antar perangkat melalui enkripsi end-to-end.

Menurut Apple Security White Paper (2025), Keychain menggunakan enkripsi perangkat keras AES-256 dengan kunci yang terikat pada pengidentifikasi unik perangkat (UID), yang membuat data tidak dapat diakses saat diekstraksi dari perangkat.

Bagaimana Keychain bekerja di iOS?

Keychain berfungsi sebagai layanan berlapis: aplikasi memanggil Security framework, yang berinteraksi dengan daemon securityd, yang mengelola basis data SQLite Keychain yang terenkripsi. Setiap entri dienkripsi dengan kunci terpisah, dan kunci itu sendiri dilindungi oleh modul perangkat keras Secure Enclave pada perangkat dengan chip A7 dan yang lebih baru.

Arsitektur Security framework

Security framework menyediakan antarmuka C untuk bekerja dengan Keychain Services. Fungsi utama: SecItemAdd (menambah), SecItemCopyMatching (mencari), SecItemUpdate (memperbarui) dan SecItemDelete (menghapus). Setiap operasi menerima kamus atribut CFDictionaryRef yang menjelaskan jenis permintaan.

Data diklasifikasikan menurut kelas: kSecClassGenericPassword (kata sandi sembarang), kSecClassInternetPassword (kata sandi untuk layanan internet), kSecClassCertificate (sertifikat), kSecClassKey (kunci kriptografi) dan kSecClassIdentity (kombinasi kunci dan sertifikat).

Proses penyimpanan data

Saat menyimpan kata sandi, aplikasi membentuk kamus dengan atribut: layanan, akun, tingkat akses, label. Security framework mengirimkan data ke daemon securityd, yang mengenkripsi entri dengan kunci yang terikat pada perangkat dan menyimpannya di Keychain SQLite. Ekstraksi terjadi serupa: permintaan berdasarkan atribut, pencarian, dekripsi dan pengembalian data.

Fitur penting: saat menghapus aplikasi, iOS secara otomatis membersihkan Keychain dari entri yang dibuat oleh aplikasi ini (sejak iOS 10.3+). Saat menginstal ulang aplikasi, data Keychain dari instalasi sebelumnya tidak dapat diakses, kecuali jika iCloud Keychain digunakan.

swift
import Security

func savePassword(service: String, account: String, password: Data) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account,
        kSecValueData as String: password,
        kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
    ]
    SecItemAdd(query as CFDictionary, nil)
}

Jenis data di Keychain

Keychain mendukung lima kelas data utama, masing-masing memiliki kumpulan atribut dan area penerapannya sendiri. Pemilihan kelas menentukan kunci pencarian mana yang tersedia dan bagaimana data dienkripsi.

Kata sandi dan akun

Kelas kSecClassGenericPassword dan kSecClassInternetPassword dirancang untuk menyimpan kata sandi teks. Versi internet juga menyimpan data server: domain, protokol, port dan jalur autentikasi. GenericPassword digunakan untuk menyimpan kata sandi apa pun tanpa keterikatan ke server.

Saat menyimpan kata sandi internet, dapat ditentukan kSecAttrServer (domain), kSecAttrProtocol (HTTPS, FTP dll.), kSecAttrPort dan kSecAttrPath. Ini memungkinkan identifikasi entri yang tepat saat pengisian otomatis melalui AutoFill.

Kunci kriptografi dan sertifikat

Kelas kSecClassKey menyimpan kunci simetris (AES) dan asimetris (RSA, EC). Kelas kSecClassCertificate — sertifikat X.509. Kelas kSecClassIdentity menggabungkan kunci privat dan sertifikat yang sesuai menjadi satu entri.

Untuk kunci asimetris, Keychain mendukung atribut: kSecAttrKeyType (RSA, EC), kSecAttrKeySizeInBits (2048, 256), kSecAttrIsPermanent (apakah disimpan di Keychain). Untuk sertifikat: kSecAttrLabel (nama yang dapat dibaca manusia), kSecAttrSubject (DN pemilik), kSecAttrIssuer (DN penerbit).

Kelas KeychainTujuanTipe data
kSecClassGenericPasswordKata sandi aplikasiData (NSString)
kSecClassInternetPasswordKata sandi serverData + atribut server
kSecClassCertificateSertifikat X.509SecCertificate
kSecClassKeyKunci kriptografiSecKey
kSecClassIdentityKunci + sertifikatSecIdentity

Bekerja dengan Keychain melalui API

Antarmuka utama untuk berinteraksi dengan Keychain dalam kode asli iOS — fungsi Security framework. Untuk Swift dan Objective-C tersedia satu antarmuka C, yang dibungkus dalam fungsi yang nyaman.

Operasi dasar SecItemAdd dan SecItemCopyMatching

Fungsi SecItemAdd menambahkan elemen baru ke Keychain. Input menerima kamus dengan kelas, data dan atribut. Mengembalikan status errSecSuccess (0) atau kode kesalahan. Fungsi SecItemCopyMatching melakukan pencarian berdasarkan atribut dan mengembalikan data yang ditemukan.

Untuk pencarian digunakan bendera kSecReturnData — jika true, fungsi mengembalikan konten entri. Bendera kSecMatchLimit menentukan jumlah hasil: kSecMatchLimitOne (satu) atau kSecMatchLimitAll (semua).

swift
func readPassword(service: String, account: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    var item: CFTypeRef?
    let status = SecItemCopyMatching(query as CFDictionary, &item)
    guard status == errSecSuccess else { return nil }
    return item as? Data
}

Menghapus dan memperbarui entri

SecItemUpdate memungkinkan mengubah atribut atau data dari entri yang ada. SecItemDelete menghapus semua entri yang sesuai dengan kamus yang diberikan. Saat menghapus, penting untuk menentukan atribut yang cukup agar tidak secara tidak sengaja menghapus entri orang lain di shared keychain.

swift
func deletePassword(service: String, account: String) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account
    ]
    SecItemDelete(query as CFDictionary)
}

Tingkat akses dan perlindungan data

Setiap entri Keychain memiliki atribut kSecAttrAccessible, yang menentukan kapan data tersedia untuk dibaca. Ini sangat penting untuk keamanan: tingkat akses yang salah dapat membuat data rentan atau sebaliknya, tidak dapat diakses pada saat yang diperlukan.

Konstanta ketersediaan

kSecAttrAccessibleWhenUnlocked — data hanya tersedia saat perangkat tidak terkunci. kSecAttrAccessibleAfterFirstUnlock — tersedia setelah pembukaan kunci pertama setelah restart. kSecAttrAccessibleAlways — selalu tersedia (tidak disarankan). Postfix ThisDeviceOnly melarang transfer data melalui cadangan.

Pada perangkat dengan Secure Enclave, kunci enkripsi Keychain dapat dilindungi tambahan dengan biometrik: kSecAccessControlBiometryCurrentSet atau kSecAccessControlUserPresence. Ini menambahkan persyaratan Face ID atau Touch ID untuk setiap operasi baca.

iCloud Keychain dan sinkronisasi

iCloud Keychain menyinkronkan entri antar perangkat Apple melalui enkripsi end-to-end. Apple tidak memiliki akses ke data yang didekripsi. Untuk mengaktifkan sinkronisasi, tambahkan atribut kSecAttrSynchronizable dengan nilai kCFBooleanTrue.

Penting: entri yang disinkronkan tidak boleh mengandung atribut ThisDeviceOnly, karena harus tersedia di perangkat lain. Saat kehilangan semua perangkat, iCloud Keychain dipulihkan melalui kode pemulihan atau kunci cadangan iCloud.

Best Practices untuk memilih tingkat akses

Untuk token autentikasi gunakan kSecAttrAccessibleWhenUnlockedThisDeviceOnly — data hanya tersedia pada perangkat yang tidak terkunci dan tidak disalin ke cadangan. Untuk sertifikat yang harus tersedia untuk tugas latar belakang, gunakan kSecAttrAccessibleAfterFirstUnlock. Jangan pernah menggunakan kSecAttrAccessibleAlways untuk data rahasia.

Disarankan untuk selalu menambahkan postfix ThisDeviceOnly untuk data yang tidak memerlukan sinkronisasi. Ini mencegah penyalinan rahasia secara tidak sengaja ke iCloud atau iTunes backup, di mana mereka dapat diekstraksi dengan alat analisis. Untuk data kritis, gabungkan ketersediaan dengan kSecAccessControlUserPresence — ini menambahkan persyaratan biometrik atau kode untuk mendekripsi entri.

Saat menggunakan iCloud Keychain, perlu diingat bahwa entri yang disinkronkan tersedia di semua perangkat pengguna: jika penyerang mendapatkan akses ke satu perangkat, data dapat dikompromikan di semua perangkat. Untuk rahasia terisolasi, gunakan ThisDeviceOnly.

Pertanyaan yang sering diajukan

Apa perbedaan Keychain dengan UserDefaults?

UserDefaults menyimpan data dalam bentuk terbuka di file .plist, yang dapat diakses saat analisis IPA. Keychain mengenkripsi setiap entri secara terpisah, menggunakan enkripsi perangkat keras dan mendukung tingkat akses, biometrik dan sinkronisasi melalui iCloud.

Bagaimana cara membersihkan Keychain saat pengujian?

Pada setiap menjalankan di simulator iOS, Keychain dibersihkan. Pada perangkat nyata, hapus aplikasi — iOS akan menghapus semua entri Keychain pengembang ini. Untuk pembersihan selektif, panggil SecItemDelete dengan atribut yang sesuai.

Bisakah dua aplikasi menggunakan Keychain bersama?

Ya, melalui keychain access groups. Aplikasi harus memiliki team ID yang sama di tanda tangan dan entitlements dengan keychain-access-groups yang sama. Pengembang mengonfigurasi akses bersama di Xcode Capabilities.

Berapa ukuran maksimum data di Keychain?

Apple tidak mendokumentasikan batas ketat, tetapi dalam praktiknya disarankan untuk tidak melebihi 1–4 KB per entri. Untuk volume besar, gunakan enkripsi file dan penyimpanan kunci di Keychain, dan data itu sendiri — di Documents.

Apakah Keychain aman setelah jailbreak?

Setelah jailbreak, perlindungan Keychain berkurang, karena penyerang mendapatkan akses root dan dapat membaca Keychain SQLite secara langsung. Untuk data kritis, gunakan enkripsi tambahan dengan kunci yang diperoleh dari server.

Kesimpulan

  • Keychain — penyimpanan aman iOS untuk kata sandi, kunci dan sertifikat dengan enkripsi perangkat keras AES-256
  • Security framework menyediakan C-API: SecItemAdd untuk menulis, SecItemCopyMatching untuk membaca, SecItemDelete untuk menghapus
  • Kelas data Keychain: GenericPassword, InternetPassword, Certificate, Key, Identity — masing-masing dengan kumpulan atributnya sendiri
  • kSecAttrAccessible mengelola tingkat akses: WhenUnlocked, AfterFirstUnlock, Always, dengan opsi ThisDeviceOnly
  • iCloud Keychain menyinkronkan entri antar perangkat melalui enkripsi end-to-end dengan atribut kSecAttrSynchronizable
  • Biometrik (Face ID / Touch ID) melindungi akses ke Keychain melalui kSecAccessControlBiometryCurrentSet
  • Gunakan Keychain untuk menyimpan token OAuth, kata sandi dan kunci kriptografi — jangan simpan rahasia di UserDefaults

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga