API Key Kini Tersimpan di Keychain Sistem, Bukan Teks Biasa
Snipset kini menyimpan API key dan token di keychain sistem: DPAPI di Windows, Secret Service di Linux. Apa yang pindah, cara kerjanya, dan kalau tak ada.

Snipset terhubung ke beberapa layanan luar atas namamu: Ollama, penyedia pencarian web, bot Telegram, Todoist, dan ElevenLabs. Masing-masing butuh API key atau token, dan sampai rilis Oktober sebagian key itu tersimpan di tabel pengaturan Snipset sebagai teks biasa. Sejak Windows 0.6.857 dan Linux 0.6.873, semuanya pindah ke keychain sistem: dienkripsi dengan akun Windows-mu lewat DPAPI, atau disimpan lewat Secret Service di Linux.
Di tulisan ini kami jelaskan key mana saja yang pindah, bagaimana tiap platform melindunginya, apa yang terjadi saat Snipset pertama kali dibuka setelah update, dan apa yang dilakukan Snipset kalau keychain tidak tersedia.
Kenapa API Key dalam Teks Biasa Itu Masalah
API key itu seperti kata sandi yang biasanya tidak kedaluwarsa sendiri. Siapa pun yang memegangnya bisa memakai layanan itu sebagai kamu.
Snipset menyimpan datanya di database lokal di komputermu. Itu bagus untuk privasi, tapi file lokal gampang tersalin lewat cara-cara biasa: folder sinkronisasi, image disk, atau laptop yang kamu jual tanpa dihapus dulu. Kalau key disimpan sebagai teks biasa, setiap salinan file itu juga salinan key-mu.
Kami ingin database-mu aman untuk disalin. Setelah perubahan ini, key dan token yang tercantum di bawah hanya ada di database Windows sebagai ciphertext yang terikat ke akun Windows-mu, dan di Linux, setelah pemindahan selesai, tidak ada di database sama sekali.
Key Apa Saja yang Dilindungi Snipset
Secret store di aplikasi desktop (apps/desktop/src-tauri/src/secret_store/mod.rs) mengenal sembilan jenis rahasia:
| Rahasia | Dipakai untuk |
|---|---|
| API key Ollama | Permintaan ke Ollama yang butuh key |
| Key Tavily, Brave Search, dan TinyFish | Pencarian web, satu key per penyedia |
| Token bot Telegram | Bot Snipset milikmu |
| Token API Todoist | Sinkronisasi tugas |
| API key ElevenLabs | Read aloud dengan suara ElevenLabs |
| Key Gemini | Speech-to-text cloud, kalau kamu menyalakannya |
Masih ada satu slot lama, yang kesembilan: key pencarian web tunggal yang dulu dipakai bersama oleh semua penyedia. Slot ini hanya dibaca sekali, saat pemindahan (penjelasannya di bawah).
Setiap key dicek sebelum disimpan. Key yang panjangnya di luar batas ditolak, key ElevenLabs dan token Telegram tidak boleh berisi spasi, dan menyimpan kolom kosong berarti menghapus key-nya. Tidak ada satu pun pengecekan ini yang mencetak nilainya: error dari secret store selalu membawa alasan tetap, tidak pernah rahasianya.
Cara Kerja Keychain Sistem di Linux
Di Linux, Snipset memakai API Secret Service, standar D-Bus yang ditulis bersama oleh pengembang GNOME Keyring dan KWallet. Spesifikasi freedesktop.org menyebutnya sebagai cara aplikasi "menyimpan rahasia dengan aman di layanan yang berjalan di sesi login pengguna". GNOME Keyring menyediakannya, KeePassXC bisa menyediakannya, dan KDE Wallet menyediakannya kalau opsi Secret Service-nya dinyalakan.
Di kode Rust, backend Linux berjalan lewat crate keyring. Setiap key menjadi satu item dengan nama layanan snipset-secrets dan nama akun sendiri, misalnya todoist-api-token atau elevenlabs-api-key. Jadi kalau kamu membuka pengelola keyring-mu, kamu bisa melihat persis key apa saja yang dipegang Snipset, dan menghapusnya dari sana kalau mau. Key Gemini tetap memakai nama item lamanya dari sebelum perubahan ini, supaya instalasi yang sudah ada tetap menemukannya.
Ada satu detail implementasi yang sempat bikin aplikasi crash sebelum kami membereskannya: backend keyring menjalankan runtime async kecilnya sendiri untuk bicara ke D-Bus, dan memulainya dari dalam runtime async Tauri membuat panic. Di build rilis, panic itu mematikan seluruh aplikasi. Karena itu setiap panggilan keychain berjalan di thread OS biasa, di luar runtime mana pun (apps/desktop/src-tauri/src/utils/keyring_thread.rs).
Cara DPAPI Melindungi Key di Windows
Windows tidak punya Secret Service, tapi punya Data Protection API (DPAPI). Snipset memanggil CryptProtectData pada key lalu menyimpan hasilnya di tabel pengaturan dengan awalan dpapi:. Menurut dokumentasi Microsoft, biasanya hanya pengguna dengan kredensial login yang sama yang bisa mendekripsi data itu, dan biasanya hanya di komputer yang sama. DPAPI juga menambahkan pengecekan integritas, jadi ciphertext yang diubah akan gagal didekripsi, bukan menghasilkan key yang salah.
Kami memakai flag CRYPTPROTECT_UI_FORBIDDEN, yang meminta Windows menggagalkan panggilan alih-alih menampilkan dialog.
Android tidak memakai secret store desktop ini.
Yang Terjadi Saat Pertama Dibuka Setelah Update
Versi lama menyimpan empat nilai sebagai teks biasa di tabel pengaturan: key Ollama, token bot Telegram, token Todoist, dan key pencarian web bersama. Saat Snipset dibuka, sebuah thread latar belakang memindahkannya ke secret store. Untuk setiap nilai, Snipset:
- Mengecek apakah secret store sudah punya nilai. Kalau sudah, nilai itu disimpan setelah update, jadi lebih baru dan dibiarkan, lalu baris teks biasa yang lama dihapus.
- Kalau belum, menulis nilai lama ke store lalu membacanya kembali.
- Menghapus baris teks biasa yang lama hanya kalau hasil bacanya cocok.
Kalau ada langkah yang gagal, baris lama tetap di tempatnya dan Snipset mencoba lagi saat dibuka berikutnya. Tidak ada yang hilang hanya karena keyring-mu kebetulan terkunci pagi itu.
Key pencarian web bersama lalu pindah ke slot penyedianya sendiri: ke Tavily atau Brave, berdasarkan pengaturan penyedia atau bentuk key-nya. Sekali lagi, salinan bersama baru dihapus setelah slot baru terbaca dengan nilai yang sama. TinyFish datang setelah slot bersama itu ada, jadi dari awal punya slot sendiri.
Karena pemindahan berjalan di latar belakang, bot Telegram menunggu sampai 30 detik sebelum mulai. Bot hanya jalan kalau token-nya sudah ada di secret store, jadi tanpa jeda itu bot bisa tetap mati saat pertama kali dibuka setelah upgrade.
Kalau Keychain Tidak Tersedia
Di Linux, Secret Service bisa saja tidak berjalan sama sekali (misalnya di window manager minimalis tanpa GNOME Keyring), atau keyring-nya terkunci. Di Windows, DPAPI bisa gagal. Kode memperlakukan ketiganya dengan cara yang sama: secret store melaporkan dirinya tidak tersedia.
Lalu yang dilakukan Snipset:
- Menyimpan key gagal dengan pesan yang jelas. Kamu akan melihat: "Keychain sistem kamu tidak tersedia. Pasang atau buka kunci GNOME Keyring atau KeePassXC, atau aktifkan opsi Secret Service di KDE Wallet."
- Tidak ada fallback ke teks biasa. Kami memutuskan keychain yang hilang harus jadi error yang terlihat, bukan diam-diam kembali ke perilaku lama.
- Sinkronisasi Todoist bertingkah seolah token belum diisi. Token yang tidak bisa dibaca dianggap sama dengan tidak ada token.
- Baris lama menunggu. Upgrade di mesin tanpa keychain membiarkan baris teks biasa yang lama di tempatnya dan mencoba pemindahan lagi setiap kali dibuka, jadi key-mu tidak dihancurkan sebelum ada tempat aman untuknya.
- Backup tetap bersih. Baris rahasia tidak ikut masuk backup. Memulihkan backup lama yang masih berisi key teks biasa akan memindahkannya ke store, dan kalau store menolak, key itu dibuang, bukan ditulis balik sebagai teks biasa.
Yang Tidak Dilindungi oleh Perubahan Ini
Keychain melindungi key saat tersimpan. Keychain tidak melindunginya dari program yang sudah berjalan di bawah akunmu. DPAPI mau mendekripsi untuk program yang berjalan sebagai pengguna Windows yang sama, dan spesifikasi Secret Service membolehkan koleksi yang sudah terbuka diakses aplikasi lain di sesimu. Kalau ada malware yang berjalan sebagai kamu, ia bisa meminta key dengan cara yang sama seperti Snipset.
Yang berubah adalah kasus yang umum: database atau file pengaturan yang tersalin tidak lagi membawa key-key ini. Snipset juga menyembunyikan key dari toast error dan log, dan tidak ada rahasia tersimpan yang dikembalikan lewat IPC, control API lokal, atau backup.
Ringkasan
Di Windows dan Linux, key dan token yang tercantum di atas kini berada di perlindungan milik sistem operasinya sendiri: DPAPI yang terikat ke akun Windows-mu, atau keychain Secret Service di desktop-mu. Key yang sudah ada pindah sendiri saat pertama kali dibuka, dan keychain yang tidak tersedia memunculkan error, bukan kembali ke teks biasa.
Siap menghubungkan layanan-layananmu tanpa meninggalkan key berserakan? Lihat paket Snipset.
