Keamanan

Bagaimana brankas itu dibangun, dan apa yang akan ditemukan jika terjadi pelanggaran.

Terakhir diperbarui 21 September 2026 · AssuredAuth, oleh CircleRoll LLC

Ini adalah deskripsi publik tentang bagaimana AssuredAuth melindungi rahasia otentikasi dua faktor, kata sandi, dan kartu yang Anda simpan di dalamnya. Deskripsi ini ditulis agar pembaca yang peduli keamanan dapat memeriksa setiap klaim terhadap aplikasi dan terhadap vektor pengujian yang dipublikasikan (tersedia untuk setiap peninjau atas permintaan di hello@assuredauth.com). Deskripsi ini menyatakan apa yang benar dan tidak lebih: tidak ada yang diklaim kebal terhadap serangan, dan tidak ada yang dijanjikan dalam persentase.

Singkatnya: brankas tersebut hanya ada di satu tempat, yaitu ponsel Anda. Setiap nilai di dalamnya dienkripsi dengan kunci yang dipegang oleh perangkat keras keamanan ponsel dan tidak dapat diekspor. Kami tidak menjalankan server brankas, tidak menyimpan salinan, dan tidak menyimpan kunci. File cadangan hanya akan meninggalkan ponsel setelah dienkripsi menggunakan kata sandi yang tidak pernah disimpan di mana pun.

Laporkan masalah: hello@assuredauth.com. Lihat "Melaporkan kelemahan" di bagian akhir.

1. Apa yang dienkripsi, dengan apa?

DataDi ponselKunci
Rahasia otentikasi dua faktor (TOTP/HOTP/Steam seeds) Di ponselKeychain (iOS) / Android Keystore yang didukung oleh penyimpanan data KunciKunci yang terikat pada perangkat keras platform; baris basis data hanya menyimpan referensi (secretRef), bukan seed.
Kata sandi (nilai kata sandi, catatan) Di ponselBaris tersegel: AES-256-GCM, nonce acak 96-bit per nilai KunciKunci data acak 256-bit, yang dibungkus oleh kunci perangkat keras di §2
Kartu (nomor, tanggal kedaluwarsa, nama di kartu, CVC) Di ponselSegelnya sama dengan kata sandi; CVC bersifat opsional dan hanya disimpan jika Anda memasukkannya. KunciKunci data yang sama
Metadata (nama layanan, nama pengguna, ikon, urutan pengurutan) Di ponselBasis data aplikasi (SwiftData / Room) KunciDilindungi oleh enkripsi file sistem operasi; diperlakukan sebagai bukan rahasia.
File cadangan (.authbackup) Di ponselDi mana pun Anda meletakkannya: File, iCloud Drive, Google Drive appDataFolder, lembar berbagi. KunciKunci yang diperoleh dari kata sandi Anda (§3). Apple dan Google menerima file yang disegel dan tidak ada yang lain.
Pendamping Watch / Wear Di ponselKeychain/EncryptedSharedPreferences milik jam tangan itu sendiri KunciKunci platform jam tangan; ditransfer melalui saluran perangkat yang dipasangkan platform tersebut.
Lalu lintas ekstensi desktop (kode sekali pakai berdasarkan permintaan) Di ponselTidak disimpan; diteruskan sebagai amplop terenkripsi ujung-ke-ujung. KunciSatu pasang kunci X25519 per pemasangan, kunci privat di Keychain / Keystore; relay hanya melihat ciphertext.

Diagnostik tidak memiliki metode yang menerima rahasia. Tidak ada peristiwa analitik yang membawa bidang vault. Tidak ada nilai dari vault yang pernah ditulis ke log, dalam build apa pun.

2. Di mana letak kunci-kunci tersebut, di setiap platform.

iOS. Kunci data dibungkus oleh kunci yang dihasilkan di dalam Secure Enclave (kSecAttrTokenIDSecureEnclave) dengan kontrol akses .privateKeyUsage + .userPresence, aksesibilitas …ThisDeviceOnly, di grup akses Keychain bersama aplikasi sehingga ekstensi AutoFill dapat menggunakan kunci yang sama. Kunci privat tidak dapat dibaca dari Enclave oleh aplikasi, oleh cadangan, atau oleh debugger; Enclave hanya setuju untuk menggunakannya setelah pengguna hadir (Face ID, Touch ID, atau kode sandi perangkat). ThisDeviceOnly berarti cadangan iCloud atau iTunes dari ponsel tidak membawa kunci; ponsel yang dipulihkan dimulai dengan brankas kosong dan meminta file cadangan dan frasa sandi Anda. Ponsel tanpa kode sandi tidak dapat mengakses kunci .userPresence (Enclave menolak untuk membuatnya), dan simulator mengambil jalur yang sama sesuai desainnya (permintaan kehadirannya adalah peringatan yang tidak dapat dijawab oleh pengujian apa pun): di sana kunci data adalah item Keychain khusus perangkat biasa — masih di luar setiap cadangan, masih tidak dapat dibaca saat ponsel terkunci, tetapi tanpa permintaan kedua — dan layar Keamanan mengatakan persis itu dan menyarankan untuk mengatur kode sandi.

Android. Kunci data dibungkus oleh kunci AES-256 AndroidKeyStore, yang dihasilkan di StrongBox jika perangkat memilikinya (jika tidak, TEE), dengan setUserAuthenticationRequired(true) dan validitas otentikasi 30 detik setelah biometrik atau kredensial perangkat, setUnlockedDeviceRequired(true), dan setInvalidatedByBiometricEnrollment(true) dibiarkan aktif. Pengaturan terakhir ini bersifat jujur ​​dan bukan beban: Android hanya menerapkannya pada kunci yang memerlukan biometrik setiap kali digunakan, jadi pada kunci 30 detik ini dengan kredensial perangkat yang diizinkan, pengaturan tersebut tidak mengubah apa pun — yang mencegah akses orang asing adalah pendaftaran memerlukan PIN, dan penghapusan kunci layar akan membatalkan kunci tersebut selamanya. Kunci Keystore tidak dapat diekspor dan dikecualikan dari pencadangan cloud Android. Domain yang disebutkan aplikasi pada tampilannya sendiri (webDomain) hanya dipercaya dari browser yang dikenal; dari paket lain, domain tersebut juga harus merupakan domain yang telah diverifikasi sistem untuk paket tersebut (Digital Asset Links), karena aplikasi apa pun dapat mengklaim domain apa pun.

Apa artinya ini bagi file basis data yang dicuri. File SQLite dan baris-baris yang disegel adalah teks terenkripsi. Kunci yang membukanya tersimpan dalam perangkat keras keamanan di ponsel tempat file tersebut berasal dan tidak dapat disalin bersama file tersebut. Tidak ada yang bisa ditebak secara offline: kunci data bersifat acak, tidak berasal dari apa pun yang dipilih seseorang.

3. File cadangan

Cadangan data adalah satu-satunya hal yang keluar dari ponsel, jadi pada prinsipnya, cadangan data adalah satu-satunya tempat di mana serangan offline dimungkinkan. Desainnya membuat serangan itu mahal dan meminimalkan target yang dapat diserang:

File tersebut berformat JSON dan dapat dibaca di editor teks apa pun; hanya teks terenkripsi yang buram. Seseorang yang menemukan file tersebut dalam lima tahun ke depan, setelah aplikasi tersebut hilang, dapat melihat persis bagaimana file tersebut disegel dan membukanya dengan OpenSSL atau pustaka Argon2 apa pun.

Format v1 (dikirim dalam versi 1.0, tetap mudah dibaca)

{
  "format": "authbackup",
  "version": 1,
  "kdf": "PBKDF2-HMAC-SHA256",
  "rounds": 600000,
  "salt": "<base64, 16 bytes>",
  "cipher": "AES-256-GCM",
  "nonce": "<base64, 12 bytes>",
  "ciphertext": "<base64>",
  "tag": "<base64, 16 bytes>"
}
LangkahByte
keyPBKDF2-HMAC-SHA256(passphrase as UTF-8, salt, 600000 rounds, 32 bytes)
aadUTF-8("authbackup:1:600000:") ‖ salt (byte garam mentah, bukan base64)
ciphertext, tagAES-256-GCM(key, nonce, plaintext, aad); tag 16 byte, disimpan secara terpisah
plaintextJSON UTF-8, kunci diurutkan: {"accounts":[…],"exportedAt":"…Z","passwords":[…],"version":1}

Catatan kompatibilitas: Android 1.0 menulis varian v1 — kdf dalam huruf kecil, tanpa kunci tag (tag 16-byte yang ditambahkan ke ciphertext), tanpa data tambahan. Kedua platform tetap membaca file tersebut (ketika tag tidak ada: pisahkan 16 byte terakhir, buka dengan AAD kosong; bandingkan kdf tanpa memperhatikan huruf besar/kecil) dan keduanya sekarang hanya menulis tata letak di atas.

Format v2 (terbaru; format default untuk pencadangan baru)

{
  "format": "authbackup",
  "version": 2,
  "kdf": "Argon2id",
  "memoryKiB": 65536,
  "passes": 3,
  "lanes": 1,
  "salt": "<base64, 16 bytes>",
  "cipher": "AES-256-GCM",
  "nonce": "<base64, 12 bytes>",
  "ciphertext": "<base64>",
  "tag": "<base64, 16 bytes>"
}
LangkahByte
keyArgon2id(version 0x13, passphrase as UTF-8, salt, m = 65536 KiB, t = 3, p = 1, tagLength 32, no secret, no associated data)
aadUTF-8("authbackup:2:argon2id:65536:3:1:") ‖ salt
ciphertext, tagAES-256-GCM(key, nonce, plaintext, aad); tag 16 byte, disimpan secara terpisah
plaintextJSON UTF-8, kunci diurutkan: {"accounts":[…],"cards":[…],"exportedAt":"…Z","passwords":[…],"version":2}

Argon2id adalah implementasi C referensi (phc-winner-argon2, CC0), yang disertakan pada kedua platform. 64 MiB dan 3 kali pemrosesan membutuhkan waktu sekitar satu detik pada ponsel saat ini dan membuat setiap tebakan membutuhkan memori dan waktu yang sama pada perangkat keras apa pun — sifat yang tidak dimiliki PBKDF2 dibandingkan dengan perangkat GPU, dan alasan mengapa v2 ada. Pembaca mengabaikan kunci yang tidak dikenalnya, jadi pembaca v1 yang diberi bodi v2 tidak akan pernah melihat kartu.

Bukti

Tiga file vektor uji (backup v1, backup v2, dan Argon2id) dihasilkan oleh implementasi ketiga, yang independen dari kedua aplikasi (OpenSSL Node untuk PBKDF2 dan AES-GCM, Argon2id WebAssembly yang diperiksa pada saat pembuatan terhadap jawaban yang dipublikasikan oleh implementasi referensi). Masing-masing berisi frasa sandi, salt, nonce, plaintext, kunci turunan, AAD, ciphertext dan tag yang diharapkan, serta file lengkap. Pengujian unit pada iOS dan Android membaca file yang sama dan menegaskan byte yang sama — sehingga backup yang disegel pada satu platform terbukti, bukan diasumsikan, dapat dibuka pada platform lain, dan kesepakatan dari ketiganya bukanlah dua salinan dari kesalahan yang sama. Alat pendamping membuka file yang sebenarnya ditulis oleh ponsel dengan implementasi ketiga yang sama dan memeriksa header terhadap aturan di atas (tepat dengan kunci format, sehingga tidak ada petunjuk atau nama yang boleh ada; salt 16-byte, nonce 12-byte, tag 16-byte disimpan secara terpisah; versi 2 tepat 64 MiB / 3 / 1; frasa sandi yang salah ditolak); proses iOS otomatis menulis satu file pada simulator dan membukanya dengan cara itu, dan mencari di kontainer aplikasi simulator, kontainer Grup Aplikasi, dan basis data keychain untuk setiap kata sandi dan nomor kartu yang diinisialisasi sebagai UTF-8 dan UTF-16 (0 hasil).

4. Model ancaman

SituasiApa yang mereka milikiApa yang mereka dapatkan
Ponsel hilang atau dicuri, terkunci Apa yang mereka milikiPerangkat, berkas basis data, baris yang disegel Apa yang mereka dapatkanTeks sandi. Kunci pembungkus berada di dalam Secure Enclave / StrongBox dan hanya akan dilepaskan setelah perangkat terkunci ditambah dengan biometrik atau kode sandi baru. Menghapus data ponsel dari jarak jauh (Temukan Ponsel Saya / Temukan Perangkat Saya) akan menghancurkan materi kunci tersebut.
File cadangan yang dicuri Apa yang mereka milikiFile .authbackup dari akun cloud, email, atau laptop. Apa yang mereka dapatkanSebuah body AES-256-GCM di bawah kunci yang diturunkan dari frasa sandi minimal 12 karakter, dengan salt per file dan Argon2id pada 64 MiB × 3 pass (v2) atau PBKDF2 pada 600.000 putaran (v1). Tanpa petunjuk, tanpa nama pengguna, tanpa daftar akun yang ditampilkan secara jelas. Setiap tebakan membutuhkan derivasi penuh; tidak ada jalan pintas. Frasa sandi yang kuat adalah seluruh pertahanan di sini, dan aplikasi tersebut menyatakannya pada lembar data.
Perangkat curian dengan layar tidak terkunci. Apa yang mereka milikiPonsel di tangan Anda, tidak terkunci. Apa yang mereka dapatkanDaftar Kode. Brankas (kata sandi, kartu) berada di balik kunci aplikasi dan terkunci ulang pada pengatur waktu penguncian otomatis (segera / 1 menit / 5 menit); nilai yang didekripsi hanya ada di memori selama layar menampilkannya. Pengisian otomatis dan ekspor teks biasa meminta biometrik baru bahkan saat aplikasi terbuka. Aktifkan kunci aplikasi dengan "Segera" jika ini yang Anda khawatirkan.
Aplikasi berbahaya di ponsel yang sama Apa yang mereka milikiSandbox aplikasi lain, clipboard, trik aksesibilitas atau overlay. Apa yang mereka dapatkanAplikasi ini tidak dapat membaca file kita (sandboxing platform) atau menggunakan kunci kita (kunci terikat pada identitas penandatanganan kita dan keberadaan pengguna). Salinan akan terhapus dari clipboard setelah 30 detik; di Android, salinan tersebut ditandai sebagai sensitif dan dikecualikan dari riwayat clipboard. Layar Vault mengatur FLAG_SECURE di Android (tidak ada tangkapan layar, tidak ada perekaman layar, kosong di pengalih); iOS mengosongkan thumbnail pengalih. Pengisian otomatis di Android hanya diberikan kepada aplikasi yang telah diverifikasi sistem terhadap domain yang tersimpan (Tautan Aset Digital), sehingga aplikasi yang mirip tidak akan ditawari kata sandi Anda.
Halaman phishing Apa yang mereka milikiSitus yang terlihat seperti situs yang Anda simpan. Apa yang mereka dapatkanTidak ada yang terisi. Pencocokan dilakukan berdasarkan domain yang dapat didaftarkan (daftar akhiran publik, yang disertakan dan diperbarui bersama aplikasi): login.example.com dan example.com cocok, example.com.evil.net dan examp1e.com tidak cocok. Browser dalam aplikasi mencocokkan dengan cara yang sama dan hanya mengisi ke dalam bingkai yang meminta, diperiksa ulang terhadap asal bingkai itu sendiri pada saat pengisian; host tanpa domain yang dapat didaftarkan sendiri — alamat IP, nama kosong di jaringan lokal — cocok persis dan tidak ada yang lebih longgar. iOS AutoFill menambahkan pemeriksaan domain terkait Apple. Kata sandi yang harus Anda tempel secara manual ke dalam tampilan yang mirip masih berisiko; aplikasi tidak dapat menghilangkan itu, hanya menghindari membantu.
Server kami sendiri Apa yang mereka miliki— Apa yang mereka dapatkanTidak ada server brankas. AssuredAuth tidak memiliki akun, tidak ada proses masuk, dan tidak ada salinan brankas Anda, jadi tidak ada data Anda di pihak kami yang dapat dicuri dan diretas. Ada dua hal yang berjalan di sisi server, dan keduanya tidak menyentuh brankas: kotak surat relai untuk ekstensi desktop, yang menyimpan amplop terenkripsi ujung-ke-ujung (kode sekali pakai, dihapus setelah dibaca; relai tidak pernah memiliki kunci), dan server keluar koneksi pribadi opsional, yang membawa lalu lintas dan tidak menyimpan log akses.
Surat panggilan pengadilan atau permintaan pemerintah Apa yang mereka milikiProses hukum yang ditujukan kepada kami Apa yang mereka dapatkanTidak ada yang perlu diserahkan: kami tidak memiliki brankas, kunci, kata sandi, atau cadangan data. Kami dapat dipaksa untuk mengatakan itu; tetapi kami tidak dapat dipaksa untuk memberikan apa yang tidak ada.

5. Clipboard, tangkapan layar, dan memori

6. Pengisian Otomatis: apa yang terisi, dan apa yang tidak

Di manaKata sandiKartu
iOS: Safari dan aplikasi (ekstensi AutoFill) Kata sandiYa, setelah Face ID / Touch ID / kode sandi baru di ekstensi (LAContext), dan hanya untuk domain yang dapat didaftarkan tempat entri tersebut disimpan, dengan pemeriksaan domain terkait Apple untuk aplikasi. KartuTidak. Fitur pengisian otomatis kartu di Safari adalah milik Apple sepenuhnya; layar kartu bertuliskan "Mengisi di browser AssuredAuth dan dengan Copy" dan tidak menjanjikan hal lain.
Android: aplikasi dan Chrome (AutofillService) Kata sandiYa, otentikasi per-dataset: sistem menampilkan BiometricPrompt sebelum pengisian; paket aplikasi hanya cocok ketika Digital Asset Links mengaitkannya dengan domain yang tersimpan. KartuYa, creditCardNumber, creditCardExpiration* dan creditCardSecurityCode menunjukkan bahwa itu adalah gerbang biometrik yang sama.
Browser AssuredAuth (kedua platform) Kata sandiYa, melalui domain yang dapat didaftarkan — host yang tidak memiliki kecocokan persis dengan domainnya sendiri — ke dalam bingkai yang diminta, biometrik sebelum pengisian. KartuYa, melalui deteksi lapangan, biometrik sebelum pengisian.
Tombol salin Kata sandiDi balik kunci aplikasi, papan klip 30 detik KartuNomor, tanggal kedaluwarsa, CVC (aturan yang sama)

Tidak ada yang bisa diisi jika menggunakan pembawa acara yang mirip. Tidak ada yang bisa diisi tanpa data biometrik.

7. Apa yang tidak pernah terjadi

Tidak ada server brankas. Tidak ada analitik yang menyertakan kolom brankas. Tidak ada ekspor teks biasa tanpa lembar konfirmasi dan biometrik baru. Tidak ada SDK pihak ketiga yang dimuat di layar brankas. Tidak ada tangkapan layar dari layar brankas. Tidak ada petunjuk frasa sandi. Tidak ada pencatatan nilai, dalam build apa pun.

8. Hal-hal yang tidak dapat kita lindungi

Kata sandi yang terlalu lemah untuk ditebak. Ponsel yang sistem operasinya telah disusupi (perangkat yang di-jailbreak atau di-root dapat memberikan informasi yang salah kepada aplikasi tentang semua hal di atas). Seseorang yang diawasi saat mengetik. Malware di desktop tempat Anda menempelkan teks. Kami mengatakan ini agar daftar di atas dibaca sebagaimana adanya: hal-hal yang dapat dihilangkan oleh sebuah desain, lalu dihilangkan.

9. Tinjau status

Desain ini telah diuji unit terhadap jawaban yang telah dipublikasikan di kedua platform dan terhadap vektor lintas platformnya sendiri. Tinjauan eksternal ada dalam daftar pemilik sebelum vault diiklankan di daftar toko; sampai hal itu terjadi, dokumen ini akan menyatakannya di sini.

10. Di mana segala sesuatu berjalan

Tidak ada data dari brankas yang keluar dari ponsel, tetapi beberapa hal di sekitarnya berjalan di mesin orang lain. Berikut adalah daftarnya, dan apa yang ada di masing-masing brankas; alur data itu sendiri dijelaskan dalam kebijakan privasi di https://assuredauth.com/privacy.

Masing-masing berisi apa yang tertulis pada judulnya dan tidak ada informasi dari arsip. Daftar ini berubah ketika produk berubah, dan bagian ini pun ikut berubah.

Melaporkan kelemahan

Jika Anda yakin telah menemukan kelemahan dalam hal apa pun yang dijelaskan di sini, kirimkan email ke hello@assuredauth.com dengan subjek "Keamanan". Harap sertakan platform, versi aplikasi, dan langkah-langkahnya; bukti yang menggunakan data Anda sendiri sudah cukup, dan kami meminta agar Anda tidak menguji terhadap data orang lain. Kami tidak menyediakan kunci PGP; jika laporan tidak boleh dikirim melalui email biasa, sebutkan hal tersebut dalam pesan pertama dan kami akan mengatur cara lain.

Yang kami janjikan sebagai imbalan: kami akan memberikan konfirmasi dalam waktu tiga hari kerja, terus memberi Anda informasi selama proses pengerjaan, memperbaiki hal-hal yang tidak relevan sebelum dipublikasikan, dan mencantumkan nama Anda di sini jika Anda ingin dicantumkan. Kami tidak akan mengambil tindakan hukum atas penelitian yang dilakukan dengan itikad baik dalam lingkup di bawah ini.

Yang termasuk dalam cakupan: aplikasi iOS dan Android, aplikasi jam tangan, ekstensi desktop, assuredauth.com dan API-nya. Yang tidak termasuk dalam cakupan: App Store dan Google Play itu sendiri, penyedia yang tercantum di atas, rekayasa sosial terhadap siapa pun, dan penolakan layanan.

Saat ini tidak ada imbalan yang diberikan. Laporan akan ditanggapi dengan perbaikan dan ucapan terima kasih, bukan dengan uang.