Sigurnost

Kako je trezor izgrađen i što bi se moglo pronaći u slučaju proboja.

Zadnje ažuriranje 21. rujna 2026. · AssuredAuth, od strane CircleRoll LLC

Ovo je javni opis kako AssuredAuth štiti dvofaktorske tajne, lozinke i kartice koje u njemu čuvate. Napisan je tako da čitatelj koji je svjesni sigurnosti može provjeriti svaku tvrdnju u odnosu na aplikaciju i u odnosu na objavljene testne vektore (dostupne svakom recenzentu na zahtjev na hello@assuredauth.com). Govori ono što je istina i ništa više: ništa ovdje ne tvrdi da je izvan napada i ništa nije obećano u postocima.

Ukratko: trezor postoji na jednom mjestu, vašem telefonu. Svaka vrijednost u njemu je šifrirana ključem koji posjeduje sigurnosni hardver telefona i ne može ga izvesti. Ne koristimo nikakav trezorski poslužitelj, ne čuvamo kopiju niti ključ. Datoteka sigurnosne kopije napušta telefon tek nakon što je šifrirana lozinkom koja se nikada nigdje ne pohranjuje.

Prijavi problem: hello@assuredauth.com. Pogledajte "Prijavljivanje slabosti" na kraju.

1. Što je šifrirano, s čime

PodaciNa telefonuKljuč
Dvofaktorske tajne (TOTP/HOTP/Steam sjemenke) Na telefonuPrivjesak za ključeve (iOS) / Android Trgovina koju podržava Keystore KljučHardverski vezan ključ platforme; redak baze podataka sadrži samo referencu (secretRef), nikada početnu vrijednost (seed).
Lozinke (vrijednost lozinke, napomene) Na telefonuZatvoreni redak: AES-256-GCM, slučajni 96-bitni nonce po vrijednosti KljučSlučajni 256-bitni podatkovni ključ, sam omotan hardverskim ključem u §2
Kartice (broj, rok trajanja, ime na kartici, CVC) Na telefonuIsti pečat kao i za lozinke; CVC nije obavezan i pohranjuje se samo ako ga unesete KljučIsti podatkovni ključ
Metapodaci (nazivi usluga, korisnička imena, ikone, redoslijed sortiranja) Na telefonuBaza podataka aplikacije (SwiftData / Room) KljučZaštićeno šifriranjem datoteka operacijskog sustava; tretira se kao netajno
Datoteka sigurnosne kopije (.authbackup) Na telefonuGdje god ga stavite: Datoteke, iCloud Drive, aplikacija Google Drive, mapa s podacima, tablica za dijeljenje KljučKljuč izveden iz vaše lozinke (§3). Apple i Google primaju zapečaćenu datoteku i ništa drugo
Aplikacija za Watch / Wear Na telefonuVlastiti privjesak za ključeve sata / Šifrirane dijeljene postavke KljučKljučevi platforme za sat; preneseni putem kanala uparenog uređaja platforme
Promet proširenja za stolna računala (jednokratni kodovi na zahtjev) Na telefonuNe pohranjuje se; prenosi se kao omotnice šifrirane od kraja do kraja KljučPar ključeva X25519 po uparivanju, privatni ključ u privjesku ključeva / spremištu ključeva; relej vidi samo šifrirani tekst

Dijagnostika nema metodu koja prihvaća tajnu vrijednost. Nijedan analitički događaj ne nosi polje trezora. Nijedna vrijednost iz trezora se nikada ne zapisuje u zapisnik, ni u jednoj izradi.

2. Gdje se ključevi nalaze, na svakoj platformi

iOS. Ključ podataka omotan je ključem generiranim unutar Secure Enclavea (kSecAttrTokenIDSecureEnclave) s kontrolom pristupa .privateKeyUsage + .userPresence, pristupnost ...ThisDeviceOnly, u dijeljenoj grupi za pristup Keychain aplikacije tako da proširenje AutoFill može koristiti isti ključ. Privatni ključ ne može se pročitati iz Enclavea od strane aplikacije, sigurnosne kopije ili programa za ispravljanje pogrešaka; Enclave pristaje koristiti ga tek nakon što je korisnik prisutan (Face ID, Touch ID ili šifra uređaja). ThisDeviceOnly znači da iCloud ili iTunes sigurnosna kopija telefona ne sadrži ključ; vraćeni telefon započinje s praznim trezorom i traži vašu datoteku sigurnosne kopije i šifru. Telefon bez lozinke ne može zaštititi .userPresence ključ (Enclave odbija stvoriti jedan), a simulator ide istim putem po dizajnu (njegov upit za prisutnost je upozorenje na koje nijedan test ne može odgovoriti): tamo je podatkovni ključ obična stavka privjeska za ključeve samo za uređaj - još uvijek izvan svake sigurnosne kopije, još uvijek nečitljiva dok je telefon zaključan, ali bez drugog upita - a sigurnosni zaslon kaže upravo to i predlaže postavljanje lozinke.

Android. Ključ podataka je omotan AndroidKeyStore AES-256 ključem, generiranim u StrongBoxu kada uređaj ima jedan (inače TEE), sa setUserAuthenticationRequired(true) i 30-sekundnom valjanošću autentifikacije nakon biometrijskih ili vjerodajnica uređaja, setUnlockedDeviceRequired(true) i setInvalidatedByBiometricEnrollment(true) ostavljenim uključenima. Ta posljednja zastavica je iskrena, a ne nosi opterećenje: Android je primjenjuje samo na ključeve koji zahtijevaju biometrijske podatke pri svakoj upotrebi, tako da na ovom 30-sekundnom ključu s dopuštenim vjerodajnicama uređaja ne mijenja ništa - ono što sprječava da se netko ubaci u sustav jest da je za registraciju potreban PIN i da uklanjanje zaključavanja zaslona trajno poništava ključ. Ključevi pohrane ključeva ne mogu se izvesti i isključeni su iz Androidove sigurnosne kopije u oblaku. Domena koju aplikacija imenuje na vlastitim prikazima (webDomain) smatra se vjerodostojnom samo iz poznatog preglednika; iz bilo kojeg drugog paketa također mora biti ona koju je sustav provjerio za taj paket (Digital Asset Links), budući da bilo koja aplikacija može zatražiti bilo koju domenu.

Što to znači za ukradenu datoteku baze podataka. SQLite datoteka i zapečaćeni retci su šifrirani tekst. Ključ koji ih otvara nalazi se u sigurnosnom hardveru na telefonu s kojeg je datoteka došla i ne može se kopirati s datotekom. Nema se što nagađati izvan mreže: podatkovni ključ je slučajan, nije izveden iz nečega što je osoba odabrala.

3. Datoteka sigurnosne kopije

Sigurnosne kopije su jedina stvar koja napušta telefon, pa su one jedino mjesto gdje je u principu moguć offline napad. Dizajn čini taj napad skupim i daje mu što manje prostora za rad:

Datoteka je JSON i čitljiva u bilo kojem tekstualnom editoru; samo je šifrirani tekst neproziran. Netko tko pronađe datoteku za pet godina, kada je aplikacija uklonjena, može točno vidjeti kako je zapečaćena i otvoriti je s OpenSSL-om ili bilo kojom Argon2 bibliotekom.

Format v1 (isporučuje se u verziji 1.0, ostaje čitljiv)

{
  "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>"
}
KorakBajtovi
keyPBKDF2-HMAC-SHA256(passphrase as UTF-8, salt, 600000 rounds, 32 bytes)
aadUTF-8("authbackup:1:600000:") ‖ salt (sirovi salt bajtovi, ne base64)
ciphertext, tagAES-256-GCM(key, nonce, plaintext, aad); oznaka 16 bajtova, pohranjena odvojeno
plaintextUTF-8 JSON, sortirani ključevi: {"accounts":[…],"exportedAt":"…Z","passwords":[…],"version":1}

Napomena o kompatibilnosti: Android 1.0 je napisao varijantu v1 — kdf malim slovima, bez oznake ključa (16-bajtna oznaka dodana šifriranom tekstu), bez dodatnih podataka. Obje platforme nastavljaju čitati te datoteke (kada oznaka nedostaje: podijeli posljednjih 16 bajtova, otvori s praznim AAD-om; usporedi kdf bez razlikovanja velikih i malih slova) i obje sada zapisuju samo gornji raspored.

Format v2 (trenutni; zadani za nove sigurnosne kopije)

{
  "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>"
}
KorakBajtovi
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); oznaka 16 bajtova, pohranjena odvojeno
plaintextUTF-8 JSON, sortirani ključevi: {"accounts":[…],"cards":[…],"exportedAt":"…Z","passwords":[…],"version":2}

Argon2id je referentna C implementacija (phc-winner-argon2, CC0), dostupna na obje platforme. 64 MiB i 3 prolaza traju oko sekundu na trenutnom telefonu i svako pogađanje košta tu memoriju i vrijeme na bilo kojem hardveru - svojstvo koje PBKDF2 nema protiv GPU rigova i razlog zašto v2 postoji. Čitač ignorira ključeve koje ne zna, pa v1 čitač s v2 tijelom jednostavno nikada ne vidi kartice.

Dokaz

Tri datoteke testnih vektora (sigurnosna kopija v1, sigurnosna kopija v2 i Argon2id) generira treća implementacija, neovisno o obje aplikacije (Nodeov OpenSSL za PBKDF2 i AES-GCM, WebAssembly Argon2id provjeren u vrijeme generiranja u odnosu na objavljene odgovore referentne implementacije). Svaka sadrži lozinku, sol, jednokratni broj, čisti tekst, izvedeni ključ, AAD, očekivani šifrirani tekst i oznaku te cijelu datoteku. Jedinični testovi na iOS-u i Androidu čitaju iste datoteke i potvrđuju iste bajtove - tako da se sigurnosna kopija zapečaćena na jednoj platformi dokazuje, a ne pretpostavlja, da se otvara na drugoj, a slaganje sva tri nije dvije kopije iste pogreške. Popratni alat otvara datoteku koju je telefon zapravo napisao s istom tom trećom implementacijom i provjerava zaglavlje prema gore navedenim pravilima (točno ključevi formata, tako da ne može biti prisutan nagovještaj ili ime; 16-bajtna salt, 12-bajtni nonce, 16-bajtna oznaka pohranjena zasebno; verzija 2 na točno 64 MiB / 3 / 1; pogrešna lozinka odbijena); automatizirano iOS pokretanje zapisuje jednu na simulatoru i otvara je na taj način, te pretražuje spremnik aplikacije simulatora, spremnik grupe aplikacija i bazu podataka privjeska ključeva za svaku unesenu lozinku i broj kartice kao UTF-8 i UTF-16 (0 pogodaka).

4. Model prijetnje

SituacijaŠto imajuŠto dobiju
Izgubljen ili ukraden telefon, zaključan Što imajuUređaj, datoteka baze podataka, zapečaćeni retci Što dobijuŠifrirani tekst. Ključ za omatanje nalazi se u sigurnosnoj enklavi / trezoru i otpušta se tek nakon zaključavanja uređaja uz novi biometrijski kod ili lozinku. Daljinsko brisanje telefona (Pronađi moj / Pronađi moj uređaj) uništava materijal ključa zajedno s njim.
Ukradena datoteka sigurnosne kopije Što imajuDatoteka .authbackup s računa u oblaku, e-pošte, prijenosnog računala Što dobijuTijelo AES-256-GCM-a pod ključem izvedenim iz lozinke od najmanje 12 znakova, sa soli po datoteci i Argon2id-om na 64 MiB × 3 prolaza (v2) ili PBKDF2 na 600 000 rundi (v1). Nema nagovještaja, nema korisničkog imena, nema jasnog popisa računa. Svako pogađanje košta punu derivaciju; nema prečaca. Jaka lozinka je ovdje cijela obrana, a aplikacija to kaže na listu.
Ukraden uređaj s otključanim zaslonom Što imajuTelefon u ruci, otključan Što dobijuPopis kodova. Trezor (lozinke, kartice) nalazi se iza zaključavanja aplikacije i ponovno se zaključava prema vremenskom odbrojavanju za automatsko zaključavanje (odmah / 1 min / 5 min); dešifrirana vrijednost postoji u memoriji samo dok je prikazuje na zaslonu. Automatsko ispunjavanje i izvoz običnog teksta zahtijevaju novi biometrijski podatak čak i kada je aplikacija otvorena. Uključite zaključavanje aplikacije s "Odmah" ako vas to brine.
Zlonamjerna aplikacija na istom telefonu Što imajuTrikovi s pješčanikom druge aplikacije, međuspremnikom, pristupačnošću ili preklapanjem Što dobijuNe može čitati naše datoteke (platformski sandbox) niti koristiti naš ključ (ključ je vezan uz naš identitet potpisivanja i prisutnost korisnika). Kopije se brišu iz međuspremnika nakon 30 sekundi; na Androidu je kopija označena kao osjetljiva i isključena iz povijesti međuspremnika. Zasloni trezora postavljaju FLAG_SECURE na Androidu (nema snimaka zaslona, ​​nema snimanja zaslona, ​​prazno u prekidaču); iOS prazni sličicu prekidača. Automatsko popunjavanje na Androidu poslužuje se samo aplikacijama koje je sustav provjerio u odnosu na spremljenu domenu (Digital Asset Links - poveznice na digitalnu imovinu), tako da se aplikaciji koja izgleda slično ne nudi vaša lozinka.
Stranica za krađu identiteta Što imajuStranica koja izgleda kao ona koju ste spremili Što dobijuNišta se ne popunjava. Podudaranje se vrši prema registrirajućoj domeni (javni popis sufiksa, u paketu i ažuriran s aplikacijom): login.example.com i example.com se podudaraju, example.com.evil.net i examp1e.com se ne podudaraju. Preglednik u aplikaciji podudara se na isti način i popunjava samo okvir koji je zatražio, ponovno provjeravajući vlastito podrijetlo tog okvira u trenutku ispunjavanja; host bez vlastite registrirajuće domene - IP adresa, golo ime na lokalnoj mreži - podudara se točno i ništa manje. iOS AutoFill dodaje Appleovu provjeru povezanih domena. Lozinka koju morate ručno zalijepiti u sličan domen i dalje je rizik; aplikacija to ne može ukloniti, samo izbjegava pomaganje.
Naši vlastiti serveri Što imaju— Što dobijuNe postoji poslužitelj trezora. AssuredAuth nema račune, nema prijave i nema kopije vašeg trezora, tako da na našoj strani nema ničega vašeg što bi se moglo ukrasti i provaliti. Dvije stvari se izvršavaju na strani poslužitelja, a nijedna od njih ne dotiče trezor: relejni poštanski sandučić za proširenje za stolna računala, koji pohranjuje omotnice šifrirane od početka do kraja (jednokratni kodovi, brišu se prilikom čitanja; relej nikada nema ključ), i izlazni poslužitelji opcionalne privatne veze, koji prenose promet i ne čuvaju zapisnike pristupa.
Sudski poziv ili zahtjev vlade Što imajuPravni postupak upućen nama Što dobijuNišta za predati: nemamo trezor, nemamo ključ, nemamo lozinku ni sigurnosnu kopiju. Možemo biti prisiljeni to reći; ne možemo biti prisiljeni proizvesti ono što ne postoji.

5. Međuspremnik, snimke zaslona i memorija

6. Automatsko popunjavanje: što se popunjava, a što ne

GdjeLozinkeKartice
iOS: Safari i aplikacije (proširenje za automatsko popunjavanje) LozinkeDa, nakon novog Face ID-a / Touch ID-a / lozinke u ekstenziji (LAContext) i samo za registrabilnu domenu za koju je unos spremljen, s Appleovom provjerom povezanih domena za aplikacije KarticeNe. Automatsko popunjavanje kartice u Safariju je isključivo Appleovo; na zaslonu kartice piše "Ispunjava se u pregledniku AssuredAuth i s kopiranjem" i ne obećava ništa drugo.
Android: aplikacije i Chrome (AutofillService) LozinkeDa, autentifikacija po skupu podataka: sustav prikazuje BiometricPrompt prije ispunjavanja; paket aplikacije podudara se samo kada ga Digital Asset Links poveže sa spremljenom domenom KarticeDa, naznake za creditCardNumber, creditCardExpiration* i creditCardSecurityCode, ista biometrijska vrata
Preglednik AssuredAuth (obje platforme) LozinkeDa, putem registrabilne domene - hosta koji nema vlastitih podudaranja - u okvir koji je tražio, biometrijski prije ispunjavanja KarticeDa, detekcijom polja, biometrijski prije ispunjavanja
Gumbi za kopiranje LozinkeIza zaključavanja aplikacije, međuspremnik od 30 sekundi KarticeBroj, istek, CVC (ista pravila)

Ništa se ne popunjava na sličnom domaćinu. Ništa se ne popunjava bez biometrije.

7. Ono što se nikad ne događa

Nema poslužitelja trezora. Nema analitike koja nosi polje trezora. Nema izvoza običnog teksta bez lista potvrde i novog biometrijskog podatka. Nema SDK-a treće strane učitanog na zaslon trezora. Nema snimke zaslona trezora. Nema naznake lozinke. Nema zapisivanja vrijednosti, ni u jednoj verziji.

8. Od čega se ne možemo zaštititi

Lozinka dovoljno slaba da se može pogoditi. Telefon čiji je operativni sustav kompromitiran u korijenu (jailbreak ili rootani uređaj može lagati aplikaciji o svemu navedenom). Osoba koja se promatra dok tipka. Zlonamjerni softver na radnoj površini u koju lijepite sadržaj. Ovo kažemo kako bi se gornji popis čitao onakvim kakav jest: stvari koje dizajn može ukloniti, uklonjeno.

9. Status pregleda

Ovaj dizajn je testiran na temelju objavljenih poznatih odgovora na obje platforme i na temelju vlastitih višeplatformskih vektora. Vanjski pregled je na popisu vlasnika prije nego što se trezor oglašava na popisu trgovine; dok se to ne dogodi, ovaj dokument će to ovdje navesti.

10. Gdje stvari teku

Ništa iz trezora ne napušta telefon, ali nekoliko stvari oko njega radi na računalima drugih ljudi. Ovo je popis i što svaki od njih sadrži; sami tokovi podataka opisani su u pravilima o privatnosti na https://assuredauth.com/privacy.

Svaki sadrži ono što piše u njegovom retku i ništa iz trezora. Popis se mijenja kada se proizvod mijenja, a i ovaj odjeljak se mijenja s njim.

Prijavljivanje slabosti

Ako smatrate da ste pronašli slabost u bilo čemu od ovdje opisanog, pišite na hello@assuredauth.com s naslovom "Sigurnost". Molimo navedite platformu, verziju aplikacije i korake; dovoljan je dokaz koji koristi vaše vlastite podatke i molimo vas da ih ne uspoređujete s podacima drugih ljudi. Ne nudimo PGP ključ; ako izvješće ne treba putovati običnom e-poštom, recite to u prvoj poruci i mi ćemo se dogovoriti na drugi način.

Što obećavamo zauzvrat: potvrđujemo u roku od tri radna dana, obavještavamo vas dok radimo na tome, ispravljamo ono što je istinito prije nego što se bilo što o tome objavi i ovdje vas navodimo kao autora ako želite da budete navedeni. Nećemo poduzeti pravne mjere zbog istraživanja provedenog u dobroj vjeri u dolje navedenom opsegu.

U opsegu: iOS i Android aplikacije, aplikacije za sat, proširenje za stolna računala, asuredauth.com i njegov API. Izvan opsega: sami App Store i Google Play, gore navedeni pružatelji usluga, socijalni inženjering bilo koga i uskraćivanje usluge.

Trenutno nema nagrade. Na prijavu se odgovara popravkom i zahvalom, a ne novcem.