Turvalisus
Kuidas võlvkelder on ehitatud ja mida sissetung avastaks.
Viimati uuendatud 21. septembril 2026 · AssuredAuth, CircleRoll LLC poolt
See on avalik kirjeldus sellest, kuidas AssuredAuth kaitseb teie salvestatud kahefaktorilisi saladusi, paroole ja kaarte. See on kirjutatud nii, et turvalisusest huvitatud lugeja saaks kontrollida kõiki rakenduse ja avaldatud testvektorite vastu esitatud väiteid (mis on arvustajatele soovi korral aadressil hello@assuredauth.com saadaval). See ütleb ainult tõe ja mitte midagi enamat: siin ei väidata, et see oleks rünnakust väljas, ja protsentides ei lubata midagi.
Lühidalt: seif asub ühes kohas – teie telefonis. Iga selles olev väärtus on krüpteeritud võtmega, mida hoiab telefoni turvariistvara ja mida ei saa eksportida. Me ei halda seifiserverit, ei hoia koopiaid ega hoia võtit. Varukoopiafail lahkub telefonist alles pärast seda, kui see on krüpteeritud parooliga, mida ei salvestata kunagi kuhugi.
Probleemi teatamine: hello@assuredauth.com. Vaata lõpus olevat „Nõrkuse teatamine”.
1. Mis on krüpteeritud ja millega
| Andmed | Telefonis | Võti |
|---|---|---|
| Kahefaktorilised saladused (TOTP/HOTP/Steam seemned) | TelefonisVõtmehoidja (iOS) / Androidi võtmehoidja toetatud pood | VõtiPlatvormi riistvaraga seotud võti; andmebaasireal on ainult viide (secretRef), mitte kunagi algväärtus. |
| Paroolid (parooli väärtus, märkused) | TelefonisSuletud rida: AES-256-GCM, juhuslik 96-bitine nonss väärtuse kohta | VõtiJuhuslik 256-bitine andmevõti, mis ise on pakitud §2 riistvaravõtmesse |
| Kaardid (number, kehtivusaeg, kaardil olev nimi, CVC) | TelefonisSama pitser nagu paroolidel; CVC on valikuline ja salvestatakse ainult siis, kui selle sisestate. | VõtiSama andmevõti |
| Metaandmed (teenuste nimed, kasutajanimed, ikoonid, sortimisjärjestus) | TelefonisRakenduse andmebaas (SwiftData / Room) | VõtiKaitstud operatsioonisüsteemi failikrüptimisega; käsitletakse mittesalajana |
| Varukoopiafail (.authbackup) | TelefonisKuhu iganes sa selle paigutad: Failid, iCloud Drive, Google Drive'i rakendus, Andmekaust, jagamisleht | VõtiTeie paroolist tuletatud võti (§3). Apple ja Google saavad ainult suletud faili ja mitte midagi muud. |
| Watch/Wear kaasrakendus | TelefonisKella enda võtmehoidja / krüpteeritud jagatud eelistused | VõtiVaateplatvormi võtmed; edastatakse platvormi seotud seadme kanali kaudu |
| Töölaua laienduse liiklus (ühekordsed koodid nõudmisel) | TelefonisEi salvestata; edastatakse otsast lõpuni krüpteeritud ümbrikena | VõtiÜks X25519 võtmepaar sidumise kohta, privaatvõti võtmehoidjas / võtmehoidlas; relee näeb ainult krüptitud teksti |
Diagnostikal puudub meetod, mis aktsepteeriks saladust. Ükski analüüsisündmus ei kanna hoidlavälja. Varjualusest ei kirjutata kunagi logisse ühtegi väärtust, üheski järgus.
2. Kus võtmed igal platvormil asuvad
iOS. Andmevõti on mähitud turvalise enklaavi (kSecAttrTokenIDSecureEnclave) sees genereeritud võtmega, mille juurdepääsu kontroll on .privateKeyUsage + .userPresence, ligipääsetavus …ThisDeviceOnly, rakenduse jagatud võtmehoidja juurdepääsugrupis, et automaatse täitmise laiendus saaks sama võtit kasutada. Rakendus, varukoopia ega silur ei saa privaatvõtit enklaavist välja lugeda; enklaav nõustub seda kasutama alles pärast kasutaja kohalolekut (Face ID, Touch ID või seadme pääsukood). ThisDeviceOnly tähendab, et telefoni iCloudi või iTunes'i varukoopia ei sisalda võtit; taastatud telefon alustab tühja hoidlaga ja küsib teie varukoopiafaili ja parooli. Ilma pääsukoodita telefon ei saa .userPresence võtit väravaks muuta (Enclave keeldub seda loomast) ja simulaator läheb sama teed pidi (selle kohalolekuviip on hoiatus, millele ükski test ei suuda vastata): seal on andmevõti tavaline seadmepõhine võtmehoidja element – ikka veel igast varukoopiast väljas, endiselt loetamatu, kui telefon on lukus, kuid ilma teise viibata – ja turvaekraan ütleb täpselt seda ning soovitab pääsukoodi määrata.
Android. Andmevõti mähitakse AndroidKeyStore AES-256 võtmega, mis genereeritakse StrongBoxis, kui seadmel see on (muidu TEE), kusjuures on valitud setUserAuthenticationRequired(true) ja 30-sekundiline autentimiskehtivus pärast biomeetrilise või seadme mandaadi sisestamist, setUnlockedDeviceRequired(true) ja setInvalidatedByBiometricEnrollment(true). Viimane lipp on pigem aus kui koormust kandev: Android rakendab seda ainult võtmetele, mis nõuavad biomeetrilist autentimist igal kasutamisel, seega ei muuda see 30-sekundilise võtme puhul, millel on seadme mandaat lubatud, midagi – võõra sõrme hoiab eemal see, et registreerimiseks on vaja PIN-koodi ja ekraaniluku eemaldamine muudab võtme jäädavalt kehtetuks. Võtmesalvestuse võtmeid ei saa eksportida ja need on Androidi pilvevarundusest välja jäetud. Domeeni, mille rakendus oma vaadetes nimetab (webDomain), peetakse ainult teadaoleva brauseri domeeniks; mis tahes muu paketi puhul peab see olema samuti selline, mille süsteem on selle paketi (Digital Asset Links) jaoks kontrollinud, kuna iga rakendus saab taotleda mis tahes domeeni.
Mida see varastatud andmebaasifaili jaoks tähendab? SQLite'i fail ja pitseeritud read on krüpteeritud. Neid avav võti asub faili päritolu telefoni turvariistvaras ja seda ei saa koos failiga kopeerida. Võrguühenduseta pole midagi arvata: andmevõti on juhuslik ja mitte inimese valitud andmete põhjal.
3. Varufail
Varukoopiad on ainus asi, mis telefonist lahkub, seega on need ainsad kohad, kus võrguühenduseta rünnak on põhimõtteliselt võimalik. Disain muudab selle rünnaku kalliks ja pakub võimalikult vähe ressursse:
- Parool on vähemalt 12 tähemärki pikk (leht keeldub vähemast ja kuvab tugevusriba).
- Paroolifraasi vihjet ei salvestata kuhugi, ei faili ega rakendusse.
- Iga kirjutatud faili kohta värske juhuslik 16-baidine sool ja 12-baidine nonse.
- Kogu sisu on AES-256-GCM, seega vale parool või kahjustatud fail lükatakse tagasi ja seda ei dekrüpteerita kunagi prügiks.
- Päis (vorming, versioon, KDF-i parameetrid, sool) on seotud GCM-sildiga täiendavate autentitud andmetena, seega fail, mille töötegurit on vähendatud, ei avane.
Fail on JSON ja loetav mis tahes tekstiredaktoris; ainult krüptitud tekst on läbipaistmatu. Keegi, kes leiab faili viie aasta pärast, kui rakendus on kadunud, saab näha täpselt, kuidas see pitseeriti, ja avada selle OpenSSL-i või mis tahes Argon2 teegiga.
Formaat v1 (tarnitud versioonis 1.0, jääb loetavaks)
{
"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>"
}
| Samm | Baidid |
|---|---|
key | PBKDF2-HMAC-SHA256(passphrase as UTF-8, salt, 600000 rounds, 32 bytes) |
aad | UTF-8("authbackup:1:600000:") ‖ salt (toores soolabait, mitte base64) |
ciphertext, tag | AES-256-GCM(key, nonce, plaintext, aad); silt 16 baiti, salvestatud eraldi |
plaintext | UTF-8 JSON, võtmed sorteeritud: {"accounts":[…],"exportedAt":"…Z","passwords":[…],"version":1} |
Ühilduvusmärkus: Android 1.0 kirjutas v1 variandi – kdf väiketähtedega, ilma sildivõtmeta (16-baidine silt lisatakse krüptitud tekstile) ja ilma täiendavate andmeteta. Mõlemad platvormid loevad neid faile edasi (kui silt puudub: jagatakse viimased 16 baiti, avatakse tühja AAD-ga; võrrelge kdf-i suur- ja väiketähtede suhtes tundetult) ja mõlemad kirjutavad nüüd ainult ülaltoodud paigutust.
Vorming v2 (praegune; uute varukoopiate vaikesäte)
{
"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>"
}
| Samm | Baidid |
|---|---|
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); silt 16 baiti, salvestatud eraldi |
plaintext | UTF-8 JSON, võtmed sorteeritud: {"accounts":[…],"cards":[…],"exportedAt":"…Z","passwords":[…],"version":2} |
Argon2id on C-keele referentsi implementatsioon (phc-winner-argon2, CC0), mis on saadaval mõlemal platvormil. 64 MiB ja 3 läbimist võtavad praegusel telefonil umbes sekundi ning iga oletus maksab mis tahes riistvaral sama palju mälu ja aega – see on omadus, mis PBKDF2-l GPU-platvormide vastu puudub, ja see on ka v2 olemasolu põhjus. Lugeja ignoreerib võtmeid, mida ta ei tea, seega v1-lugeja, millel on v2-keha, lihtsalt ei näe kunagi kaarte.
Tõestus
Kolm testvektorfaili (varundus v1, varundus v2 ja Argon2id) genereeritakse kolmanda implementatsiooni poolt, mis on sõltumatud mõlemast rakendusest (Node'i OpenSSL PBKDF2 ja AES-GCM jaoks, WebAssembly Argon2id, mida kontrolliti genereerimise ajal võrdlusimplementatsiooni avaldatud vastuste suhtes). Igaüks neist sisaldab paroolifraasi, soola, nontsi, lihtteksti, tuletatud võtit, AAD-d, eeldatavat krüptiteksti ja silti ning kogu faili. iOS-i ja Androidi ühiktestid loevad samu faile ja kinnitavad samu baite – seega on ühel platvormil pitseeritud varukoopia teisel platvormil avatav, mitte eeldatud, ja kõigi kolme kokkulangevus ei ole sama vea kaks koopiat. Kaastööriist avab faili, mille telefon tegelikult sama kolmanda implementatsiooniga kirjutas, ja kontrollib päist ülaltoodud reeglite alusel (täpselt vormingu võtmed, seega ei tohi olla vihjet ega nime; 16-baidine sool, 12-baidine nonse, 16-baidine silt on eraldi salvestatud; versioon 2 täpselt 64 MiB / 3 / 1; vale parool keelduti); automaatne iOS-i käivitamine kirjutab ühe simulaatorisse ja avab selle sel viisil ning otsib simulaatori rakenduste konteinerist, rakenduste grupi konteinerist ja võtmehoidja andmebaasist iga seemneparooli ja kaardi numbrit UTF-8 ja UTF-16 kodeeringus (0 tabamust).
4. Ohumudel
| Olukord | Mis neil on | Mida nad saavad |
|---|---|---|
| Kadunud või varastatud telefon, lukustatud | Mis neil onSeade, andmebaasifail, suletud read | Mida nad saavadKrüptitud tekst. Pakkimisvõti asub turvalises enklaavis / StrongBoxis ja vabaneb alles pärast seadme lukustamist koos uue biomeetrilise või parooli sisestamisega. Telefoni kaugjuhtimisega pühkimine (Leia minu seade / Leia minu seade) hävitab võtmematerjali. |
| Varastatud varukoopiafail | Mis neil on.authbackup-fail pilvekontolt, e-kirjast või sülearvutist | Mida nad saavadAES-256-GCM sisu võtme all, mis on tuletatud vähemalt 12 tähemärgist koosnevast paroolist, failipõhise soola väärtusega ja Argon2id-ga 64 MiB × 3 läbimisel (v2) või PBKDF2-ga 600 000 ringil (v1). Puuduvad vihjed, kasutajanimi või kontode loend. Iga oletus maksab kogu tuletamise hinna; otseteed pole. Tugev parool on siin kogu kaitse ja rakendus ütleb seda ka lehel. |
| Varastatud seade, mille ekraan oli lukustamata | Mis neil onTelefon teie käes, lukustamata | Mida nad saavadKoodide loend. Seif (paroolid, kaardid) asub rakenduse luku taga ja lukustub uuesti automaatse lukustuse taimeriga (kohe / 1 minuti / 5 minuti pärast); dekrüpteeritud väärtus eksisteerib mälus ainult siis, kui seda ekraanil kuvatakse. Automaatne täitmine ja lihtteksti eksport küsivad värsket biomeetrilist teavet isegi siis, kui rakendus on avatud. Kui see tekitab sinus muret, lülita rakenduse lukustus sisse valikuga „Kohe“. |
| Pahatahtlik rakendus samas telefonis | Mis neil onTeise rakenduse liivakast, lõikelaud, ligipääsetavuse või ülekatte nipid | Mida nad saavadSee ei saa meie faile lugeda (platvormi liivakastiefekt) ega kasutada meie võtit (võti on seotud meie allkirjastamise identiteedi ja kasutaja kohalolekuga). Koopiad kustutatakse lõikelaualt 30 sekundi pärast; Androidis märgistatakse koopia tundlikuks ja see jäetakse lõikelaua ajaloost välja. Androidis seatakse Vaulti ekraanipildid FLAG_SECURE'iks (ekraanipilte ja ekraanisalvestust pole, vahetajas on tühi); iOS tühjendab vahetaja pisipildi. Androidis pakutakse automaattäitmist ainult rakendustele, mille süsteem on salvestatud domeeni (digitaalsete varade lingid) suhtes kontrollinud, seega ei pakuta sarnasele rakendusele teie parooli. |
| Õngitsusleht | Mis neil onSait, mis näeb välja nagu see, mille salvestasid | Mida nad saavadMiski ei täida. Vaste leidmine toimub registreeritava domeeni järgi (avalik sufiksite loend, mis on rakendusega kaasas ja uuendatakse): login.example.com ja example.com vastavad, example.com.evil.net ja examp1e.com mitte. Rakendusesisene brauser leiab vaste samamoodi ja täidab ainult küsiva raami, mida on uuesti kontrollitud selle raami enda päritoluga täitmise hetkel; host, millel pole oma registreeritavat domeeni – IP-aadress, paljas nimi kohalikus võrgus –, vastab täpselt ja mitte midagi lõdvemat. iOS-i automaatne täitmine lisab Apple'i seotud domeenide kontrolli. Parool, mille peate käsitsi sarnasele domeenile kleepima, on endiselt risk; rakendus ei saa seda eemaldada, ainult vältida abistamist. |
| Meie enda serverid | Mis neil on— | Mida nad saavadPuudub seifiserver. AssuredAuthil pole kontosid, sisselogimisi ega teie seifi koopiat, seega pole meie poolel midagi teie oma, mida saaks varastada või murda. Serveri poolel töötab kaks asja, millest kumbki ei puutu seifiga kokku: töölaua laienduse edastuspostkast, mis salvestab otsast lõpuni krüptitud ümbrikke (ühekordsed koodid, mis kustutatakse lugemisel; edastusel pole kunagi võtit), ja valikulise privaatühenduse väljumisserverid, mis edastavad liiklust ja ei pea juurdepääsulogisid. |
| Kohtukutse või valitsuse taotlus | Mis neil onMeile adresseeritud juriidiline protsess | Mida nad saavadMidagi pole üle anda: meil pole seifi, võtit, parooli ega varukoopiat. Meid saab sundida seda ütlema; meid ei saa sundida tootma seda, mida pole olemas. |
5. Lõikelaud, ekraanipildid ja mälu
- Kopeerimine asetab väärtuse lõikelauale 30 sekundiks ja seejärel kustutab selle, kui see on endiselt meie oma. Androidis on klipp märgitud kui EXTRA_IS_SENSITIVE, seega peidab süsteem selle lõikelaua eelvaate ja ajaloo eest; iOS-is on lõikelaua üksus ainult lokaalne (ei edastata teistele seadmetele).
- Vaulti ekraanid (paroolid, parool, kaardid, kaart, paroolifraasilehed, lihtteksti eksport) määravad Androidis FLAG_SECURE'i. iOS-il pole samaväärset lippu; rakendus tühjendab rakenduste vahetajas oma pisipildi ja väärtused on vaikimisi silmalüliti taga.
- Dekrüpteeritud väärtused salvestatakse mällu ainult seni, kuni ekraan neid kuvab, ja kustutatakse, kui see kaob või rakendus lukustub. Andmevõti pakitakse päringu jaoks lahti ja seda ei salvestata lukustuse vahemällu.
- Lihtteksti eksport on olemas (nii et saate alati lahkuda) ning selle taga on kinnitusleht ja värske biomeetria ning ka selle ekraan on FLAG_SECURE.
6. Automaatne täitmine: mis täidab ja mis mitte
| Kus | Paroolid | Kaardid |
|---|---|---|
| iOS: Safari ja rakendused (automaatse täitmise laiendus) | ParoolidJah, pärast värsket Face ID / Touch ID / pääsukoodi laienduses (LAContext) ja ainult registreeritava domeeni jaoks, mille jaoks kirje salvestati, koos Apple'i seotud domeenide kontrolliga rakenduste jaoks. | KaardidEi. Safaris kaardi automaatne täitmine on ainult Apple'i oma; kaardi ekraanil kuvatakse teade „Täidab AssuredAuth brauseri ja koopia abil” ning midagi muud ei lubata. |
| Android: rakendused ja Chrome (AutofillService) | ParoolidJah, andmestikupõhine autentimine: süsteem kuvab enne täitmist BiometricPrompt'i; rakenduse pakett leiab vaste ainult siis, kui Digital Asset Links seob selle salvestatud domeeniga. | KaardidJah, vihjed creditCardNumber, creditCardExpiration* ja creditCardSecurityCode, sama biomeetriline värav |
| AssuredAuth brauser (mõlemad platvormid) | ParoolidJah, registreeritava domeeni – hosti, millel endal pole täpselt ühtegi vastet – järgi küsivasse raami, biomeetrilised andmed enne täitmist | KaardidJah, välituvastuse abil, biomeetriline enne täitmist |
| Kopeerimisnupud | ParoolidRakenduse luku taga 30-sekundiline lõikelaud | KaardidNumber, aegumiskuupäev, CVC (samad reeglid) |
Miski ei täida oma andmeid välimuselt sarnase hosti puhul. Miski ei täida oma andmeid ilma biomeetriata.
7. Mis kunagi ei juhtu
Pole hoidlaserverit. Pole analüütikat, mis sisaldaks hoidlavälja. Pole lihtteksti eksporti ilma kinnituslehe ja värske biomeetriata. Pole hoidla ekraanile laaditud kolmanda osapoole SDK-d. Pole hoidla ekraanipilti. Pole paroolivihjet. Väärtuste logimist üheski järgus ei toimu.
8. Mille eest me end kaitsta ei saa
Parool, mis on piisavalt nõrk, et seda ära arvata. Telefon, mille operatsioonisüsteem on juurjuurdepääsuga ohustatud (jailbreakitud või juurjuurdepääsuga seade võib rakendusele kõige ülaltoodu kohta valetada). Inimene, keda kirjutamise ajal jälgitakse. Pahavara töölaual, kuhu kleebitakse. Me ütleme seda selleks, et ülaltoodud loendit loetaks sellisena, nagu see on: asjad, mida disain saab eemaldada, eemaldatakse.
9. Ülevaatuse staatus
Seda disaini on ühiktestitud avaldatud teadaolevate vastuste suhtes mõlemal platvormil ja oma platvormideüleste vektorite suhtes. Enne kui seif poe loendis reklaamitakse, on omaniku nimekirjas väline ülevaade; kuni see pole toimunud, mainitakse seda käesolevas dokumendis siin.
10. Kus asjad töötavad
Miski seifist ei lahku telefonist, kuid mõned selle ümber olevad asjad töötavad teiste inimeste masinates. See on nimekiri ja mida igaüks neist sisaldab; andmevooge endid on kirjeldatud privaatsuspoliitikas aadressil https://assuredauth.com/privacy.
- Google Cloud / Firebase – töölaua laienduse edastuspostkast (otsast lõpuni krüptitud ümbrikud, kustutatakse lugemisel), tõukemärgid, ostu olek ja kontaktvormi kaudu saadetud sõnumid.
- Vercel — assuredauth.com, selle lehed ja nende taga olevad väikesed funktsioonid.
- Vultr – privaatühenduse väljumisserverid. Liiklus läbib neid; midagi ei salvestata.
- Apple ja Google Play – ostud ja tellimused nende endi poodides.
- PostHog – tooteanalüütika: loendab, mida kasutatakse, ilma identiteedita.
- RevenueCat – tellimuse olek: aktiivne või aegunud ja millise paketi alla see kuulub.
Igaüks neist sisaldab oma rea andmeid ja mitte midagi seifist. Nimekiri muutub koos toote muutumisega ja see jaotis muutub koos sellega.
Nõrkuse teatamine
Kui arvate, et olete leidnud siin kirjeldatust nõrkuse, kirjutage aadressile hello@assuredauth.com teemaga "Turvalisus". Palun lisage platvorm, rakenduse versioon ja sammud; piisab tõendist, mis kasutab teie enda andmeid, ja palume teil seda mitte teiste inimeste omadega võrreldes testida. Me ei paku PGP-võtit; kui aruannet ei tohiks tavalise e-kirjaga edastada, öelge seda esimeses sõnumis ja me korraldame teise viisi.
Vastutasuks lubame: kinnitame teiega kolme tööpäeva jooksul, hoiame teid töö käigus kursis, parandame enne avaldamist kõik ebatäpsed faktid ja märgime teid siin ära, kui soovite, et teid siin mainitaks. Me ei astu allpool kirjeldatud ulatuses heas usus tehtud uurimistöö suhtes õiguslikke samme.
Ulatusse kuuluvad: iOS-i ja Androidi rakendused, kellarakendused, töölaua laiendus, assuredauth.com ja selle API. Ulatusse ei kuulu: App Store ja Google Play ise, eespool loetletud teenusepakkujad, igaühe sotsiaalne manipuleerimine ja teenusetõkestamine.
Praegusel hetkel preemiat ei ole. Teatele vastatakse paranduse ja tänuga, mitte rahaga.