Keamanan
Kepriye brankas dibangun, lan apa sing bakal ditemokake yen ana pelanggaran.
Diperbarui terakhir 21 September 2026 · AssuredAuth, dening CircleRoll LLC
Iki minangka katrangan umum babagan kepiye AssuredAuth nglindhungi rahasia rong faktor, sandhi, lan kertu sing disimpen ing njero. Iki ditulis supaya pamaca sing mikir babagan keamanan bisa mriksa saben klaim marang aplikasi kasebut lan marang vektor tes sing diterbitake (kasedhiya kanggo reviewer apa wae miturut panyuwunan ing hello@assuredauth.com). Iki ujar apa sing bener lan ora luwih saka iku: ora ana sing ngaku ora bisa diserang, lan ora ana sing dijanjekake kanthi persentase.
Versi cekak: brankas ana ing sak panggonan, yaiku telpon sampeyan. Saben nilai ing njero brankas dienkripsi nganggo kunci sing disimpen ing perangkat keras keamanan telpon lan ora bisa diekspor. Kita ora mbukak server brankas, ora nyimpen salinan, lan ora nyimpen kunci. File serep bakal metu saka telpon mung sawise dienkripsi nganggo frasa sandhi sing ora tau disimpen ing ngendi wae.
Laporkan masalah: hello@assuredauth.com. Deloken "Nglaporake kelemahane" ing pungkasan.
1. Apa sing dienkripsi, nganggo apa
| Data | Ing telpon | Kunci |
|---|---|---|
| Rahasia rong faktor (TOTP/HOTP/Wiji uap) | Ing telponToko sing didhukung Keystore (iOS) / Android | KunciKunci platform sing kaiket karo perangkat keras; baris basis data mung nyimpen referensi (secretRef), ora tau nyimpen wiji |
| Sandi (nilai sandi, cathetan) | Ing telponBaris sing ditutup: AES-256-GCM, nonce 96-bit acak saben nilai | KunciKunci data 256-bit acak, sing dibungkus karo kunci perangkat keras ing §2 |
| Kartu (nomer, kadaluwarsa, jeneng ing kartu, CVC) | Ing telponSegel padha karo sandhi; CVC iku opsional lan mung disimpen yen sampeyan ngetik | KunciKunci data sing padha |
| Metadata (jeneng layanan, jeneng panganggo, ikon, urutan urut) | Ing telponBasis data aplikasi (SwiftData / Room) | KunciDilindhungi dening enkripsi file sistem operasi; dianggep minangka ora rahasia |
| Berkas serep (.authbackup) | Ing telponNang endi wae sampeyan nyimpen: File, iCloud Drive, Google Drive appDataFolder, lembar enggo bareng | KunciKunci sing dijupuk saka frasa sandhi sampeyan (§3). Apple lan Google nampa file sing wis disegel lan ora ana liyane |
| Kanca jam tangan/pakai | Ing telponGantungan Kunci jam tangane dhewe / EncryptedSharedPreferences | KunciTombol platform jam tangan; ditransfer liwat saluran piranti sing dipasangake ing platform kasebut |
| Lalu lintas ekstensi desktop (kode sapisan miturut panyuwunan) | Ing telponOra disimpen; dikirim minangka amplop sing dienkripsi saka wiwitan nganti pungkasan | KunciPasangan kunci X25519 saben pasangan, kunci pribadi ing Keychain / Keystore; relay mung ndeleng ciphertext |
Diagnostik ora duwe metode sing nampa rahasia. Ora ana acara analitik sing nggawa kolom vault. Ora ana nilai saka vault sing ditulis menyang log, ing sembarang build.
2. Panggonane tombol-tombol kasebut, ing saben platform
iOS. Kunci data dibungkus karo kunci sing digawe ing njero Secure Enclave (kSecAttrTokenIDSecureEnclave) nganggo kontrol akses .privateKeyUsage + .userPresence, aksesibilitas …ThisDeviceOnly, ing grup akses Keychain sing dienggo bareng ing aplikasi supaya ekstensi AutoFill bisa nggunakake kunci sing padha. Kunci pribadi ora bisa diwaca saka Enclave dening aplikasi, dening serep, utawa dening debugger; Enclave mung setuju nggunakake sawise pangguna ana (Face ID, Touch ID utawa sandhi piranti). ThisDeviceOnly tegese serep iCloud utawa iTunes saka telpon ora nggawa kunci kasebut; telpon sing dipulihake diwiwiti karo brankas kosong lan njaluk file serep lan frasa sandhi sampeyan. Telpon tanpa kode sandhi ora bisa mbukak kunci .userPresence (Enclave ora gelem nggawe), lan simulator njupuk dalan sing padha miturut desain (prompt anane minangka tandha bebaya sing ora bisa dijawab dening tes): ing kana kunci data minangka item Keychain khusus piranti — isih metu saka saben serep, isih ora bisa diwaca nalika telpon dikunci, nanging tanpa prompt kapindho — lan layar Keamanan ngomong persis kaya ngono lan menehi saran kanggo nyetel kode sandhi.
Android. Kunci data dibungkus karo kunci AndroidKeyStore AES-256, sing digawe ing StrongBox nalika piranti duwe siji (kajaba TEE), kanthi setUserAuthenticationRequired(true) lan validitas otentikasi 30 detik sawise kredensial biometrik utawa piranti, setUnlockedDeviceRequired(true), lan setInvalidatedByBiometricEnrollment(true) ditinggalake. Tandha pungkasan kasebut jujur tinimbang nanggung beban: Android mung ngetrapake kanggo kunci sing mbutuhake biometrik ing saben panggunaan, mula ing kunci 30 detik iki kanthi kredensial piranti sing diidini ora ngowahi apa-apa - sing nyegah driji wong liya mlebu yaiku ndhaptar butuh PIN, lan mbusak kunci layar bakal mbatalake kunci kasebut kanggo salawase. Kunci Keystore ora bisa diekspor lan ora kalebu ing serep maya Android. Domain sing dijenengi aplikasi ing tampilan dhewe (webDomain) mung dipercaya saka browser sing dikenal; saka paket liyane, uga kudu dadi salah siji sing wis diverifikasi sistem kanggo paket kasebut (Digital Asset Links), amarga aplikasi apa wae bisa ngaku domain apa wae.
Apa tegese iki kanggo file basis data sing dicolong. File SQLite lan baris sing disegel iku ciphertext. Kunci sing mbukak file kasebut ana ing perangkat keras keamanan ing telpon asale file kasebut lan ora bisa disalin karo file kasebut. Ora ana sing bisa ditebak nalika offline: kunci data acak, ora dijupuk saka apa wae sing dipilih wong.
3. Berkas serep
Serep iku siji-sijine barang sing metu saka telpon, mula ing prinsip iki minangka siji-sijine papan kanggo serangan offline. Desaine ndadekake serangan kasebut larang lan menehi wektu kanggo nggarap sabisa-bisane:
- Frasa sandhi paling ora 12 karakter (lembar kasebut nolak luwih sithik lan nuduhake bilah kekuwatan).
- Ora ana pitunjuk frasa sandhi sing disimpen ing ngendi wae, ing file utawa ing aplikasi.
- Uyah 16-byte lan nonce 12-byte acak kanggo saben file sing ditulis.
- Kabèh awaké nganggo AES-256-GCM, mula frasa sandhi sing salah utawa file sing rusak bakal ditolak, lan ora bakal didekripsi dadi sampah.
- Header (format, versi, parameter KDF, uyah) kaiket ing tag GCM minangka data otentikasi tambahan, saengga file sing faktor kerjane wis diowahi ora bakal dibukak.
File kasebut awujud JSON lan bisa diwaca ing editor teks apa wae; mung ciphertext sing ora transparan. Sapa wae sing nemokake file kasebut sajrone limang taun, nalika aplikasi kasebut wis ilang, bisa ndeleng persis kepiye file kasebut disegel lan mbukak nganggo OpenSSL utawa perpustakaan Argon2 apa wae.
Format v1 (dikirim ing 1.0, tetep bisa diwaca)
{
"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>"
}
| Langkah | Byte |
|---|---|
key | PBKDF2-HMAC-SHA256(passphrase as UTF-8, salt, 600000 rounds, 32 bytes) |
aad | UTF-8("authbackup:1:600000:") ‖ salt (byte uyah mentah, dudu base64) |
ciphertext, tag | AES-256-GCM(key, nonce, plaintext, aad); tag 16 byte, disimpen kanthi kapisah |
plaintext | UTF-8 JSON, tombol-tombol wis diurutake: {"accounts":[…],"exportedAt":"…Z","passwords":[…],"version":1} |
Cathetan kompatibilitas: Android 1.0 nulis varian saka v1 — kdf nganggo huruf cilik, tanpa kunci tag (tag 16-byte sing ditambahake ing ciphertext), ora ana data tambahan. Kaloro platform kasebut tetep maca file kasebut (nalika tag ora ana: bagi 16 byte pungkasan, bukak nganggo AAD kosong; bandhingake kdf kanthi huruf gedhe-cilik) lan loro-lorone saiki mung nulis tata letak ing ndhuwur.
Format v2 (saiki; standar kanggo serep anyar)
{
"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>"
}
| Langkah | Byte |
|---|---|
key | Argon2id(version 0x13, passphrase as UTF-8, salt, m = 65536 KiB, t = 3, p = 1, tagLength 32, no secret, no associated data) |
aad | UTF-8("authbackup:2:argon2id:65536:3:1:") ‖ salt |
ciphertext, tag | AES-256-GCM(key, nonce, plaintext, aad); tag 16 byte, disimpen kanthi kapisah |
plaintext | UTF-8 JSON, tombol-tombol wis diurutake: {"accounts":[…],"cards":[…],"exportedAt":"…Z","passwords":[…],"version":2} |
Argon2id kuwi implementasi referensi C (phc-winner-argon2, CC0), sing didol ing loro platform kasebut. 64 MiB lan 3 pass butuh wektu sak detik ing telpon saiki lan saben tebakan ngentekake memori lan wektu ing perangkat keras apa wae — properti sing ora diduweni PBKDF2 nglawan rig GPU, lan alesan kenapa v2 ana. Pamaca ora nggatekake tombol sing ora dingerteni, mula pamaca v1 sing diwenehi awak v2 ora nate ndeleng kertu.
Bukti
Telung file vektor uji coba (serep v1, serep v2 lan Argon2id) digawe dening implementasi katelu, ora gumantung saka loro aplikasi kasebut (OpenSSL Node kanggo PBKDF2 lan AES-GCM, WebAssembly Argon2id sing dicenthang nalika generasi nglawan jawaban sing diterbitake implementasi referensi). Saben file ngemot passphrase, salt, nonce, plaintext, kunci turunan, AAD, ciphertext lan tag sing diarepake, lan file lengkap. Tes unit ing iOS lan ing Android maca file sing padha lan negesake byte sing padha - mula serep sing disegel ing siji platform kabukten, ora dianggep, mbukak ing platform liyane, lan persetujuan saka kabeh telu dudu rong salinan saka kesalahan sing padha. Piranti pendamping mbukak file sing ditulis telpon nganggo implementasi katelu sing padha lan mriksa header karo aturan ing ndhuwur (persis tombol format, mula ora ana pitunjuk utawa jeneng sing bisa ana; uyah 16-byte, nonce 12-byte, tag 16-byte disimpen kanthi kapisah; versi 2 persis 64 MiB / 3 / 1; frasa sandhi sing salah ditolak); iOS otomatis sing mlaku nulis siji ing simulator lan mbukak kanthi cara kasebut, lan nggoleki wadhah aplikasi simulator, wadhah Grup Aplikasi, lan basis data keychain kanggo saben sandhi sing diunggulake lan nomer kertu minangka UTF-8 lan UTF-16 (0 klik).
4. Model ancaman
| Kahanan | Apa sing diduweni | Apa sing dipikolehi |
|---|---|---|
| Telpon ilang utawa dicolong, dikunci | Apa sing diduweniPiranti, file basis data, baris sing disegel | Apa sing dipikolehiCiphertext. Kunci sing dibungkus ana ing Secure Enclave / StrongBox lan mung bisa dicopot sawise piranti dikunci ditambah biometrik utawa kode sandhi anyar. Ngusap telpon saka kadohan (Temokake Pirantiku / Temokake Pirantiku) bakal ngrusak materi kunci kasebut. |
| File serep sing dicolong | Apa sing diduweniFile .authbackup saka akun maya, email, laptop | Apa sing dipikolehiAwak AES-256-GCM nganggo kunci sing dijupuk saka frasa sandi paling ora 12 karakter, nganggo uyah saben file lan Argon2id kanthi kecepatan 64 MiB × 3 pass (v2) utawa PBKDF2 kanthi 600.000 babak (v1). Ora ana pitunjuk, ora ana jeneng panganggo, ora ana dhaptar akun sing jelas. Saben tebakan mbutuhake derivasi lengkap; ora ana dalan pintas. Frasa sandi sing kuwat minangka pertahanan lengkap ing kene, lan aplikasi kasebut ujar kaya ngono ing lembar kasebut. |
| Piranti sing dicolong nalika layar ora dikunci | Apa sing diduweniTelpon ing tanganmu, ora dikunci | Apa sing dipikolehiDhaptar Kode. Brankas (sandhi, kertu) ana ing mburi kunci aplikasi lan ngunci maneh ing timer kunci otomatis (langsung / 1 menit / 5 menit); nilai sing didekripsi mung ana ing memori nalika layar nuduhake. Isi otomatis lan ekspor teks biasa njaluk biometrik anyar sanajan aplikasi dibukak. Aktifake kunci aplikasi nganggo "Langsung" yen iki sing sampeyan kuwatirake. |
| Aplikasi jahat ing telpon sing padha | Apa sing diduweniTrik sandbox, clipboard, aksesibilitas, utawa overlay aplikasi liyane | Apa sing dipikolehiIku ora bisa maca file kita (platform sandboxing) utawa nggunakake kunci kita (kunci kasebut kaiket karo identitas penandatanganan kita lan anane pangguna). Salinan bakal dibusak saka clipboard sawise 30 detik; ing Android salinan kasebut ditandhani sensitif lan ora kalebu ing riwayat clipboard. Layar vault nyetel FLAG_SECURE ing Android (ora ana gambar layar, ora ana rekaman layar, kosong ing switcher); iOS bakal ngosongake thumbnail switcher. Isi otomatis ing Android mung dilayani kanggo aplikasi sing wis diverifikasi sistem marang domain sing disimpen (Digital Asset Links), mula aplikasi sing mirip ora ditawani sandhi sampeyan. |
| Kaca phishing | Apa sing diduweniSitus sing katon kaya sing wis disimpen | Apa sing dipikolehiOra ana sing kebak. Pencocokan ditindakake miturut domain sing bisa didaftarake (dhaptar akhiran umum, dibundel lan dianyari karo aplikasi): login.example.com lan example.com cocog, example.com.evil.net lan examp1e.com ora. Browser ing aplikasi cocog kanthi cara sing padha lan mung kebak ing pigura sing dijaluk, dicenthang maneh karo asal pigura kasebut nalika diisi; host tanpa domain sing bisa didaftarake dhewe — alamat IP, jeneng kosong ing jaringan lokal — cocog persis lan ora ana sing luwih longgar. iOS AutoFill nambahake pamriksan domain sing digandhengake Apple. Sandhi sing kudu sampeyan tempel nganggo tangan menyang sing mirip isih dadi risiko; aplikasi ora bisa mbusak, mung supaya ora mbantu. |
| Server kita dhewe | Apa sing diduweni— | Apa sing dipikolehiOra ana server brankas. AssuredAuth ora duwe akun, ora duwe fitur mlebu lan ora duwe salinan brankas sampeyan, mula ora ana barang sampeyan sing bisa dicolong lan dibobol. Ana rong barang sing mlaku ing sisih server, sing ora ana sing kena pengaruh brankas: kothak layang relay kanggo ekstensi desktop, sing nyimpen amplop sing dienkripsi saka ujung nganti ujung (kode sapisan, dibusak nalika diwaca; relay ora tau duwe kunci), lan server metu sambungan pribadi opsional, sing nggawa lalu lintas lan ora nyimpen log akses. |
| Subpoena utawa panjaluk pemerintah | Apa sing diduweniProses hukum sing ditujokake kanggo kita | Apa sing dipikolehiOra ana sing kudu diserahake: kita ora duwe brankas, ora ana kunci, ora ana frasa sandhi lan ora ana serep. Kita bisa dipeksa ngomong kaya ngono; kita ora bisa dipeksa ngasilake apa sing ora ana. |
5. Clipboard, gambar layar, lan memori
- Salinan bakal nempatake nilai ing clipboard sajrone 30 detik, banjur mbusak yen isih duweke kita. Ing Android, klip kasebut ditandhani EXTRA_IS_SENSITIVE saengga sistem ndhelikake saka pratinjau lan riwayat clipboard; ing iOS, item pasteboard mung kanggo lokal (ora diserahke menyang piranti liyane).
- Layar vault (Sandi, Sandi, Kartu, Kartu, lembar frasa sandi, ekspor teks biasa) nyetel FLAG_SECURE ing Android. iOS ora duwe tandha sing padha; aplikasi kasebut ngosongake gambar cilik ing pengalih aplikasi lan nilaine ana ing mburi toggle mripat minangka standar.
- Nilai sing wis didekripsi mung ana ing memori nalika layar nuduhake lan bakal dibusak nalika ilang utawa aplikasi dikunci. Kunci data dibukak kanggo panjalukan lan ora disimpen ing cache ing kunci kasebut.
- Ekspor teks biasa ana (dadi sampeyan bisa tansah metu) lan ana ing mburi lembar konfirmasi lan biometrik anyar, lan layare uga FLAG_SECURE.
6. Isi Otomatis: apa sing diisi, lan apa sing ora
| Ngendi | Sandi | Kartu |
|---|---|---|
| iOS: Safari lan aplikasi (ekstensi IsiOtomatis) | SandiYa, sawise Face ID / Touch ID / kode sandhi anyar ing ekstensi (LAContext), lan mung kanggo domain sing bisa didaftarkan sing disimpen entri kasebut, kanthi pamriksa domain sing digandhengake Apple kanggo aplikasi | KartuOra. Isi otomatis kertu ing Safari mung Apple; layar kertu kasebut ujar "Isi ing browser AssuredAuth lan nganggo Salinan" lan ora janji liyane. |
| Android: aplikasi lan Chrome (AutofillService) | SandiYa, otentikasi saben set data: sistem nuduhake BiometricPrompt sadurunge diisi; paket aplikasi mung cocog nalika Digital Asset Links nggandhengake karo domain sing disimpen | KartuYa, pitunjuk creditCardNumber, creditCardExpiration* lan creditCardSecurityCode, gerbang biometrik sing padha |
| Browser AssuredAuth (loro platform) | SandiYa, kanthi domain sing bisa didaftarake — host sing ora ana sing cocog persis — menyang pigura sing dijaluk, biometrik sadurunge diisi | KartuYa, kanthi deteksi lapangan, biometrik sadurunge diisi |
| Tombol salin | SandiIng mburi kunci aplikasi, clipboard 30 detik | KartuNomer, kadaluwarsa, CVC (aturan sing padha) |
Ora ana sing bisa ngisi host sing mirip. Ora ana sing bisa ngisi tanpa biometrik.
7. Apa sing ora tau kedadeyan
Ora ana server vault. Ora ana analitik sing nggawa kolom vault. Ora ana ekspor teks biasa tanpa lembar konfirmasi lan biometrik anyar. Ora ana SDK pihak katelu sing dimuat ing layar vault. Ora ana tangkapan layar layar vault. Ora ana pitunjuk frasa sandhi. Ora ana pencatatan nilai, ing sembarang versi.
8. Apa sing ora bisa kita lindungi
Frasa sandhi sing cukup ringkih kanggo ditebak. Telpon sing sistem operasine wis disusupi ing root (piranti sing wis jailbreak utawa rooted bisa ngapusi aplikasi babagan kabeh sing kasebut ing ndhuwur). Wong sing diawasi nalika ngetik. Malware ing desktop sing sampeyan tempel. Kita ngomong iki supaya dhaptar ing ndhuwur diwaca apa anane: bab-bab sing bisa dicopot dening desain, dicopot.
9. Status ulasan
Desain iki wis diuji unit marang jawaban sing wis diterbitake ing loro platform lan marang vektor lintas platform dhewe. Tinjauan eksternal ana ing dhaptar pemilik sadurunge brankas diiklanake ing dhaptar toko; nganti kedadeyan, dokumen iki bakal ujar kaya ngono ing kene.
10. Ing ngendi barang-barang mlaku
Ora ana barang ing brankas sing metu saka telpon, nanging ana sawetara barang ing sakubenge sing bisa mlaku ing mesin wong liya. Iki dhaptaré, lan apa sing ana ing saben brankas; aliran data kasebut diterangake ing kabijakan privasi ing https://assuredauth.com/privacy.
- Google Cloud / Firebase — kothak layang relay kanggo ekstensi desktop (amplop sing dienkripsi saka ujung nganti ujung, dibusak nalika diwaca), token push, status tuku, lan pesen sing dikirim liwat formulir kontak.
- Vercel — assuretauth.com, kaca-kacané lan fungsi-fungsi cilik ing mburiné.
- Vultr — server metu saka sambungan pribadi. Lalu lintas ngliwati server kasebut; ora ana sing disimpen.
- Apple lan Google Play — tumbasan lan langganan, ing toko dhewe-dhewe.
- PostHog — analitik produk: cacahing apa sing digunakake, ora ana kaitane karo identitas.
- RevenueCat — kahanan langganan: aktif utawa kadaluwarsa, lan ing rencana endi.
Saben nyimpen apa sing diomongake baris kasebut lan ora ana sing saka brankas. Dhaptar kasebut owah nalika produk kasebut owah, lan bagean iki uga owah.
Nglaporake kelemahane
Menawi panjenengan pitados manggihaken kekirangan ing salebeting ingkang dipunjlentrehaken ing mriki, sumangga nyerat dhateng hello@assuredauth.com kanthi subjek "Keamanan". Sumangga dipunlebetaken platform, versi aplikasi, lan langkah-langkahipun; bukti ingkang migunakaken data panjenengan piyambak sampun cekap, lan kula nyuwun supados panjenengan boten nguji data tiyang sanes. Kita boten nawakaken kunci PGP; menawi laporan boten kedah dikirim liwat email, sumangga dipunaturi ing pesen kapisan lan kita badhe ngatur cara sanes.
Apa sing kita janjikake minangka balesan: kita ngakoni sajrone telung dina kerja, menehi informasi marang sampeyan nalika kita nggarap, ndandani apa sing nyata sadurunge ana sing diterbitake, lan menehi kredit marang sampeyan ing kene yen sampeyan pengin diwenehi kredit. Kita ora bakal njupuk tindakan hukum kanggo riset sing ditindakake kanthi itikad apik ing ruang lingkup ing ngisor iki.
Ing lingkup: aplikasi iOS lan Android, aplikasi jam tangan, ekstensi desktop, assuretauth.com lan API-ne. Ing njaba lingkup: App Store lan Google Play dhewe, panyedhiya sing kadhaptar ing ndhuwur, rekayasa sosial sapa wae, lan penolakan layanan.
Ora ana hadiah wektu iki. Laporan dijawab nganggo koreksi lan matur nuwun, ora nganggo dhuwit.