Tambahkan ke Chrome

Cara kerjanya

Tinjauan teknis untuk peninjau keamanan. Semua di sini dapat dicocokkan dengan kode sumber — termasuk bagian yang kurang menguntungkan kami, yang kami sebutkan alih-alih kami hilangkan.

Arsitektur

Tidak ada backend. Ekstensi ini adalah ekstensi Chrome Manifest V3 yang membuat kode TOTP/HOTP secara lokal dengan OTPAuth. Kami tidak mengoperasikan server, tidak menyimpan akun, dan tidak punya saluran yang bisa membawa data pengguna kepada kami.

Karena tidak ada server, tidak ada pula material kunci di sisi server, tidak ada penitipan kunci, dan tidak ada jalur pemulihan yang kami kendalikan. Jika pengguna lupa kata sandi dan kehilangan kode pemulihannya, kami tidak bisa membantu — memang dirancang begitu.

Kriptografi

Perlindungan kata sandi bersifat opsional dan mati secara bawaan. Saat dinyalakan:

Sandi
AES-256-GCM, IV acak 96-bit untuk tiap catatan dan tiap penulisan ulang
Derivasi kunci
PBKDF2-HMAC-SHA256, 600.000 iterasi, salt acak 128-bit (sesuai panduan OWASP)
Kunci utama
256-bit, dari crypto.getRandomValues, dibuat sekali; kata sandi hanya membungkusnya
Sidik jari
HMAC-SHA256 dengan subkunci turunan HKDF, dipakai untuk menggabungkan catatan antarperangkat
Penyimpanan kunci yang terbuka
chrome.storage.session — hanya di memori, tidak pernah ditulis ke disk, dihapus saat peramban ditutup, dan tak terjangkau oleh content script
Kunci otomatis
Setiap kali dibuka / setelah 5, 15, atau 60 menit tanpa aktivitas / sampai peramban ditutup
Implementasi
Hanya WebCrypto. Tidak ada primitif yang ditulis sendiri dan tidak ada pustaka kripto yang disertakan.

Mengapa kuncinya dua lapis

Data tidak pernah dienkripsi langsung dengan kunci turunan kata sandi. Catatan dienkripsi oleh kunci utama acak; keluaran PBKDF2 hanya membungkus kunci utama itu. Ada dua akibatnya, dan keduanya penting:

  • Mengganti kata sandi menulis ulang 32 byte, bukan mengenkripsi ulang setiap catatan, setiap cadangan, dan setiap ekspor. Justru pada penulisan ulang massal seperti itulah sistem penyimpanan kehilangan data.
  • Kode pemulihan 160-bit dapat membungkus kunci utama yang sama secara terpisah, jadi kata sandi yang terlupa masih bisa dipulihkan. Kode ditampilkan sekali, harus diketik ulang untuk konfirmasi, dan diganti setiap kali dipakai. Tidak ada yang ditulis ke disk sebelum pengguna mengonfirmasinya.

Apa yang dienkripsi dan apa yang tidak

Dengan perlindungan kata sandi aktif, seluruh catatan akun dienkripsi kecuali pengenal dan sidik jarinya — termasuk nama layanannya, sehingga profil yang dicuri tidak membocorkan di layanan mana saja pengguna punya akun. Saat diaktifkan, ekstensi mengenkripsi catatan, memverifikasinya dengan mendekripsi dan membandingkan, lalu barulah menghapus semua salinan teks biasa: penyimpanan lokal peramban, sinkronisasi, dan ketujuh snapshot cadangan bergilir.

Kami sebutkan terus terang, karena ini memengaruhi penilaian Anda:

  • Tanpa perlindungan kata sandi, akun disimpan tanpa enkripsi dan, jika Chrome Sync menyala, direplikasi lewat akun Google pengguna sendiri. Data itu tidak pernah sampai ke kami, tetapi ada pada Google. Sinkronisasi bisa dimatikan, dan itu sekaligus menghapus yang sudah ada di sana.
  • Riwayat penggunaan per situs — akun mana dipakai di domain mana — disimpan secara lokal dan tidak tercakup brankas selama masih dikumpulkan. Mengaktifkan perlindungan kata sandi menghapusnya; riwayat ini juga bisa dimatikan sendiri.

Model ancaman

Melindungi dari

  • Direktori profil peramban yang dicuri atau disalin
  • Malware infostealer yang menyedot data peramban sekaligus
  • Orang dengan akses fisik ke komputer yang ditinggal tanpa pengawasan
  • Catatan akun yang sampai ke Google lewat Chrome Sync
  • Berkas cadangan yang hilang atau dicuri (ekspor berproteksi kata sandi)

Tidak melindungi dari

  • Malware yang berjalan sebagai pengguna saat brankas sedang terbuka
  • Keylogger yang menangkap kata sandi ketika diketik
  • Peramban atau sistem operasi yang sudah disusupi
  • Pembobolan layanan pihak ketiga yang kodenya dipakai

Singkatnya: ini melindungi data saat tersimpan. Ia tidak, dan tidak bisa, menjaga perangkat yang saat dipakai sudah berada dalam kendali penyerang.

Izin

Manifes mendeklarasikan tepat dua izin dan tanpa izin host:

storage
Akun dan pengaturan di penyimpanan lokal, kunci yang terbuka di penyimpanan sesi, serta salinan sinkronisasi opsional
activeTab
Membaca nama host tab aktif untuk menyorot akun yang cocok, dan menangkap tab saat pengguna memindai kode QR dari layar

Tidak ada content script, tidak ada izin tabs, cookies, atau webRequest, dan tidak ada sumber daya yang bisa diakses web. Ekstensi tidak dapat membaca atau mengubah isi halaman mana pun.

Kamera

Pemindaian QR dengan kamera berjalan di halaman ekstensi yang dibuka dalam tab, bukan di popup — popup dimusnahkan begitu kehilangan fokus, dan permintaan izin melakukan persis itu. Untuk ini tidak perlu izin apa pun di manifes: yang dipakai adalah permintaan kamera bawaan peramban, diberikan per origin ekstensi dan bisa dicabut di setelan situs, dan tidak pernah muncul sebelum pengguna membuka pemindai. Video didekode secara lokal dan tidak pernah dikirim atau disimpan.

Lalu lintas jaringan keluar

Dalam pemakaian normal ekstensi tidak melakukan permintaan otomatis apa pun, dan Manifest V3 melarang kode jarak jauh. Semua koneksi yang mungkin ia buat:

HostKapanMembawa data pengguna?
worldtimeapi.org
timeapi.io
Pemeriksaan selisih jam, di-cache, gagal tanpa suara. TOTP rusak kalau jam melenceng.Tidak
authenticator.shHalaman sambutan saat pemasangan; halaman masukan saat pencopotan atau pemberian nilai.Tidak (log server web biasa)

Tidak ada font, skrip, gaya, atau gambar yang dimuat dari host pihak ketiga. Semua yang dibutuhkan untuk menggambar antarmuka sudah ada di dalam paket.

Memverifikasi apa yang kami publikasikan

Anda tidak perlu memercayai satu pun hal di atas begitu saja. Ekstensi ini sumber terbuka, dan setiap rilis dapat direproduksi:

  1. Unduh .crx yang dipublikasikan dari Chrome Web Store lalu ekstrak
  2. Checkout tag git yang sesuai
  3. Jalankan npm ci && npm run build di Node 20 LTS
  4. Bandingkan dist/ yang dihasilkan dengan paket yang diekstrak

SHA-256 untuk setiap berkas di dalam dist/ hasil build dipublikasikan pada setiap rilis GitHub sebagai SHA256SUMS-v<version>.txt, dalam format sha256sum, sehingga langkah 4 cukup satu kali menjalankan sha256sum -c. Perbedaan seharusnya terbatas pada urutan berkas di dalam arsip dan spasi pada keluaran terminifikasi antarversi patch Node.

Dependensi runtime sengaja sedikit — OTPAuth, React, jsQR, Zustand, Framer Motion, dan Lucide — dikunci oleh lockfile yang ikut di-commit. SBOM CycloneDX tersedia atas permintaan.

Baca kode sumbernya

Yang tidak kami punya

Kami vendor kecil dan independen. Jika salah satu hal berikut adalah syarat mutlak dalam proses Anda, lebih baik tahu sekarang daripada tiga minggu setelah evaluasi berjalan:

  • Tidak ada sertifikasi SOC 2, ISO 27001, atau yang setara
  • Belum pernah memesan uji penetrasi pihak ketiga sampai hari ini
  • Tidak ada program bug bounty berbayar

Sebagai gantinya kami menawarkan keterbukaan penuh kode sumber, build yang dapat diverifikasi, permukaan izin yang minimal, dan tidak adanya infrastruktur server yang bisa menyimpan data Anda sejak awal.

Menghubungi kami

Laporan kerentanan dan pertanyaan keamanan: security@authenticator.sh. Kebijakan pengungkapan, cakupan, waktu tanggap, dan ketentuan safe harbour ada di halaman kebijakan keamanan; apa yang disimpan dan apa yang keluar dari perangkat dijelaskan di kebijakan privasi.

Dengan senang hati kami mengisi kuesioner penilaian vendor tertulis atau menelusuri kode bersama tim keamanan Anda.

Untuk hal apa pun yang bukan soal keamanan — pemasangan, pemulihan akun, pertanyaan penagihan dari sebuah penerapan — lihat dukungan. Mohon jangan mengirim laporan kerentanan ke sana; kotak masuk itu tidak diperlakukan sebagai rahasia.