Zabezpečení
Jak je trezor postaven a co by se v něm našlo při průniku.
Naposledy aktualizováno 21. září 2026 · AssuredAuth, společností CircleRoll LLC
Toto je veřejný popis toho, jak AssuredAuth chrání dvoufaktorová tajná data, hesla a karty, které v něm uchováváte. Je napsán tak, aby si čtenář se zaměřením na bezpečnost mohl ověřit každé tvrzení oproti aplikaci a oproti publikovaným testovacím vektorům (k dispozici každému recenzentovi na vyžádání na adrese hello@assuredauth.com). Říká to, co je pravda, a nic víc: nic zde netvrdí, že je mimo útok, a nic není slibováno v procentech.
Stručně řečeno: úložiště existuje na jednom místě, ve vašem telefonu. Každá hodnota v něm je zašifrována klíčem, který uchovává bezpečnostní hardware telefonu a nelze jej exportovat. Neprovozujeme žádný server úložiště, neuchováváme žádnou kopii ani klíč. Záložní soubor opouští telefon až poté, co je zašifrován pomocí hesla, které se nikde neukládá.
Nahlásit problém: hello@assuredauth.com. Viz „Nahlášení slabiny“ na konci.
1. Co je šifrováno a čím
| Data | Na telefonu | Klíč |
|---|---|---|
| Dvoufaktorové tajemství (TOTP/HOTP/Steam seeds) | Na telefonuKlíčenka (iOS) / Obchod podporovaný úložištěm klíčů pro Android | KlíčHardwarově vázaný klíč platformy; řádek databáze obsahuje pouze referenci (secretRef), nikdy ne seed. |
| Hesla (hodnota hesla, poznámky) | Na telefonuZapečetěný řádek: AES-256-GCM, náhodný 96bitový nonce na hodnotu | KlíčNáhodný 256bitový datový klíč, sám obalený hardwarovým klíčem v §2 |
| Karty (číslo, platnost, jméno na kartě, CVC) | Na telefonuStejná pečeť jako u hesel; CVC je volitelný a ukládá se pouze v případě, že jej zadáte. | KlíčStejný datový klíč |
| Metadata (názvy služeb, uživatelská jména, ikony, pořadí řazení) | Na telefonuDatabáze aplikace (SwiftData / Room) | KlíčChráněno šifrováním souborů operačního systému; považováno za netajné |
| Záložní soubor (.authbackup) | Na telefonuKamkoli to umístíte: Soubory, iCloud Drive, aplikace Google Drive, DataFolder, sdílený list | KlíčKlíč odvozený z vašeho hesla (§3). Apple a Google obdrží zapečetěný soubor a nic jiného. |
| Aplikace pro Watch / Wear | Na telefonuVlastní klíčenka k hodinkám / EncryptedSharedPreferences | KlíčKlíče platformy pro hodinky; přenášené přes kanál spárovaného zařízení platformy |
| Provoz rozšíření pro počítače (jednorázové kódy na vyžádání) | Na telefonuNeukládá se; přenáší se jako obálky šifrované mezi konci | KlíčPár klíčů X25519 na párování, soukromý klíč v řetězci klíčů / úložišti klíčů; relé vidí pouze šifrovaný text. |
Diagnostika nemá žádnou metodu, která by přijímala tajný kód. Žádná analytická událost neobsahuje pole úložiště. Žádná hodnota z úložiště se nikdy nezapisuje do protokolu, a to ani v žádném sestavení.
2. Kde se klíče nacházejí na každé platformě
iOS. Datový klíč je zabalen v klíči vygenerovaném uvnitř Secure Enclave (kSecAttrTokenIDSecureEnclave) s řízením přístupu .privateKeyUsage + .userPresence, accessibility …ThisDeviceOnly, ve sdílené přístupové skupině Keychain aplikace, takže rozšíření AutoFill může používat stejný klíč. Soukromý klíč nelze z Enclave přečíst aplikací, zálohou ani ladicím programem; Enclave souhlasí s jeho použitím pouze po přítomnosti uživatele (Face ID, Touch ID nebo přístupový kód zařízení). ThisDeviceOnly znamená, že záloha telefonu na iCloudu nebo iTunes klíč neobsahuje; obnovený telefon začíná s prázdným trezorem a požaduje váš záložní soubor a přístupovou frázi. Telefon bez hesla nemůže zablokovat klíč .userPresence (Enclave ho odmítá vytvořit) a simulátor se záměrně vydává stejnou cestou (jeho výzva k zjištění přítomnosti je upozornění, na které žádný test nemůže odpovědět): datový klíč je tam obyčejná položka Keychain určená pouze pro zařízení – stále mimo každou zálohu, stále nečitelná, když je telefon uzamčen, ale bez druhé výzvy – a obrazovka Zabezpečení to přesně říká a navrhuje nastavení hesla.
Android. Datový klíč je obalen klíčem AndroidKeyStore AES-256, vygenerovaným v StrongBoxu, pokud zařízení nějaký má (jinak TEE), s parametrem setUserAuthenticationRequired(true) a 30sekundovou platností ověření po biometrickém nebo zařízení přihlašovacím údaji, parametry setUnlockedDeviceRequired(true) a setInvalidatedByBiometricEnrollment(true) ponechanými zapnutými. Poslední příznak je spíše upřímný než zátěžový: Android jej aplikuje pouze na klíče, které vyžadují biometrické údaje při každém použití, takže u tohoto 30sekundového klíče s povoleným přihlašovacím údajem zařízení se nic nemění – co drží prst cizí osoby mimo dosah, je to, že registrace vyžaduje PIN a že odstranění zámku obrazovky klíč trvale zneplatní. Klíče úložiště klíčů nelze exportovat a jsou vyloučeny ze zálohy cloudu Androidu. Doména, kterou aplikace pojmenovává ve svých vlastních zobrazeních (webDomain), je důvěryhodná pouze ze známého prohlížeče; z jakéhokoli jiného balíčku musí být také doménou, kterou systém pro daný balíček ověřil (Digital Asset Links), protože jakákoli aplikace si může nárokovat jakoukoli doménu.
Co to znamená pro ukradený soubor databáze. Soubor SQLite a zapečetěné řádky jsou šifrovaný text. Klíč, který je otevírá, je uložen v bezpečnostním hardwaru telefonu, ze kterého soubor pochází, a nelze jej s ním kopírovat. Offline není třeba nic hádat: datový klíč je náhodný, není odvozen z ničeho, co si daná osoba vybrala.
3. Záložní soubor
Zálohy jsou to jediné, co opouští telefon, takže jsou v principu jediným místem, kde je offline útok možný. Díky tomuto designu je tento útok drahý a zároveň má co nejméně prostoru pro práci:
- Přístupová fráze má alespoň 12 znaků (list odmítá kratší a zobrazuje ukazatel síly).
- Žádná nápověda k heslu není uložena nikde, v souboru ani v aplikaci.
- Pro každý zapsaný soubor se vygeneruje nová náhodná 16bajtová hodnota salt a 12bajtový nonce.
- Celé tělo je AES-256-GCM, takže špatné heslo nebo poškozený soubor je odmítnut a nikdy není dešifrován do odpadu.
- Záhlaví (formát, verze, parametry KDF, salt) je vázáno na tag GCM jako další ověřená data, takže soubor, jehož pracovní faktor byl upraven dolů, se neotevře.
Soubor je ve formátu JSON a čitelný v jakémkoli textovém editoru; neprůhledný je pouze zašifrovaný text. Někdo, kdo soubor najde za pět let, když je aplikace pryč, může přesně vidět, jak byl zapečetěn, a otevřít ho pomocí OpenSSL nebo jakékoli knihovny Argon2.
Formát v1 (dodává se ve verzi 1.0, zůstává čitelný)
{
"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>"
}
| Krok | Bajty |
|---|---|
key | PBKDF2-HMAC-SHA256(passphrase as UTF-8, salt, 600000 rounds, 32 bytes) |
aad | UTF-8("authbackup:1:600000:") ‖ salt (neupravené bajty saltu, ne base64) |
ciphertext, tag | AES-256-GCM(key, nonce, plaintext, aad); tag 16 bajtů, uložen samostatně |
plaintext | UTF-8 JSON, klíče seřazené: {"accounts":[…],"exportedAt":"…Z","passwords":[…],"version":1} |
Poznámka ke kompatibilitě: Android 1.0 napsal variantu v1 — kdf malými písmeny, bez klíče tag (16bajtový tag připojený k šifrovanému textu), bez dalších dat. Obě platformy tyto soubory neustále čtou (pokud tag chybí: rozdělí posledních 16 bajtů, otevře s prázdným AAD; porovná kdf bez rozlišování velkých a malých písmen) a obě nyní zapisují pouze výše uvedené rozložení.
Formát v2 (aktuální; výchozí pro nové zálohy)
{
"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>"
}
| Krok | Bajty |
|---|---|
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 bajtů, uložen samostatně |
plaintext | UTF-8 JSON, klíče seřazené: {"accounts":[…],"cards":[…],"exportedAt":"…Z","passwords":[…],"version":2} |
Argon2id je referenční implementace v jazyce C (phc-winner-argon2, CC0), která je dostupná na obou platformách. 64 MiB a 3 průchody trvají na současném telefonu asi sekundu a každý odhad stojí stejnou paměť a čas na jakémkoli hardwaru – vlastnost, kterou PBKDF2 postrádá proti GPU sestavám, a důvod, proč v2 existuje. Čtečka ignoruje klíče, které nezná, takže čtečka v1 s tělem v2 jednoduše nikdy karty nevidí.
Důkaz
Tři soubory testovacích vektorů (záloha v1, záloha v2 a Argon2id) jsou generovány třetí implementací, nezávisle na obou aplikacích (Node's OpenSSL pro PBKDF2 a AES-GCM, Argon2id z WebAssembly kontrolovaný v době generování oproti publikovaným odpovědím referenční implementace). Každý z nich obsahuje heslo, salt, nonce, prostý text, odvozený klíč, AAD, očekávaný šifrovaný text a tag a celý soubor. Jednotkové testy na iOS a Androidu čtou stejné soubory a potvrzují stejné bajty – takže záloha zapečetěná na jedné platformě je prokázána, nikoli předpokládána, že se otevře na druhé platformě, a shoda všech tří není dvě kopie stejné chyby. Doprovodný nástroj otevře soubor, který telefon skutečně zapsal se stejnou třetí implementací, a zkontroluje hlavičku podle výše uvedených pravidel (přesně klíče formátu, takže nemůže být přítomna žádná nápověda ani název; 16bajtová salt, 12bajtový nonce, 16bajtová tag uložená odděleně; verze 2 přesně na 64 MiB / 3 / 1; nesprávné heslo odmítnuto); automatizovaný běh iOS zapíše soubor do simulátoru a tímto způsobem jej otevře a prohledá kontejner aplikací simulátoru, kontejner skupin aplikací a databázi klíčenek pro každé nasazené heslo a číslo karty v kódování UTF-8 a UTF-16 (0 zásahů).
4. Model hrozeb
| Situace | Co mají | Co dostanou |
|---|---|---|
| Ztracený nebo ukradený telefon, zamčený | Co majíZařízení, databázový soubor, zapečetěné řádky | Co dostanouŠifrovaný text. Zabalovací klíč je v Secure Enclave / Trezoru a uvolní se až po uzamčení zařízení a zadání nového biometrického kódu nebo hesla. Vzdálené vymazání telefonu (Najít můj / Najít moje zařízení) zničí materiál klíče spolu s ním. |
| Ukradený záložní soubor | Co majíSoubor .authbackup z cloudového účtu, e-mailu, notebooku | Co dostanouTělo AES-256-GCM pod klíčem odvozeným z hesla o délce alespoň 12 znaků, s `saltem` pro každý soubor a Argon2id s 64 MiB × 3 průchody (v2) nebo PBKDF2 s 600 000 průchody (v1). Žádná nápověda, žádné uživatelské jméno, žádný seznam účtů v otevřeném kódu. Každý odhad stojí plné odvození; neexistuje žádná zkratka. Silné heslo je zde celou obranou a aplikace to uvádí na listu. |
| Ukradené zařízení s odemčenou obrazovkou | Co majíTelefon v ruce, odemčený | Co dostanouSeznam kódů. Úložiště (hesla, karty) je za zámkem aplikace a znovu se uzamkne po uplynutí časovače automatického zámku (ihned / 1 minuta / 5 minut); dešifrovaná hodnota existuje v paměti pouze tehdy, když je zobrazena na obrazovce. Automatické vyplňování a export prostého textu vyžadují nový biometrický údaj, i když je aplikace otevřená. Pokud se o tento případ obáváte, zapněte zámek aplikace s možností „Okamžitě“. |
| Škodlivá aplikace ve stejném telefonu | Co majíTriky s pískovištěm, schránkou, přístupností nebo překrytím jiné aplikace | Co dostanouNemůže číst naše soubory (sandbox platformy) ani používat náš klíč (klíč je vázán na naši identitu podpisu a na přítomnost uživatele). Kopie se ze schránky vymažou po 30 sekundách; v systému Android je kopie označena jako citlivá a vyloučena z historie schránky. Obrazovky úložiště mají v systému Android nastavenou hodnotu FLAG_SECURE (žádné snímky obrazovky, žádný záznam obrazovky, prázdné okno přepínače); systém iOS vyprázdní miniaturu přepínače. Automatické vyplňování v systému Android se poskytnou pouze aplikacím, které systém ověřil oproti uložené doméně (Digital Asset Links), takže podobné aplikaci není nabídnuto vaše heslo. |
| Phishingová stránka | Co majíStránka, která vypadá jako ta, kterou jste si uložili | Co dostanouNic se nevyplňuje. Porovnávání probíhá podle registrovatelné domény (seznam veřejných přípon, sdružený a aktualizovaný s aplikací): login.example.com a example.com se shodují, example.com.evil.net a examp1e.com nikoli. Prohlížeč v aplikaci porovnává stejným způsobem a vyplňuje pouze rámce, který se ptal, a znovu porovnává s vlastním původem daného rámce v okamžiku vyplnění; hostitel bez vlastní registrovatelné domény – IP adresa, holý název v lokální síti – se shoduje přesně a nic méně. Automatické vyplňování v systému iOS přidává kontrolu přidružených domén od společnosti Apple. Heslo, které musíte ručně vložit do podobného rámce, stále představuje riziko; aplikace ho nemůže odstranit, pouze se vyhýbá pomoci. |
| Naše vlastní servery | Co mají— | Co dostanouNeexistuje žádný server úložiště. AssuredAuth nemá žádné účty, žádné přihlášení ani žádnou kopii vašeho úložiště, takže na naší straně není nic, co by mohlo být ukradeno a prolomeno. Na straně serveru běží dvě věci, z nichž ani jedna se úložiště nedotýká: přenosová poštovní schránka pro rozšíření pro stolní počítače, která ukládá obálky šifrované end-to-end (jednorázové kódy, které se po přečtení smažou; přenos nikdy nemá klíč), a výstupní servery volitelného privátního připojení, které přenášejí provoz a neuchovávají žádné protokoly přístupu. |
| Předvolání nebo žádost vlády | Co majíPrávní proces adresovaný nám | Co dostanouNic k předání: nemáme žádný trezor, žádný klíč, žádné heslo ani žádnou zálohu. Můžeme být nuceni to říct; nemůžeme být nuceni předložit něco, co neexistuje. |
5. Schránka, snímky obrazovky a paměť
- Kopírování uloží hodnotu do schránky na 30 sekund a poté ji vymaže, pokud je stále naše. V systému Android je klip označen jako EXTRA_JE_CITLIVÝ, takže jej systém skryje z náhledu schránky a historie; v systému iOS je položka v pracovní ploše pouze lokální (nepředává se do jiných zařízení).
- Obrazovky trezoru (Hesla, Heslo, Karty, Karta, listy s hesly, export prostého textu) nastavují v systému Android hodnotu FLAG_SECURE. Systém iOS nemá ekvivalentní příznak; aplikace v přepínači aplikací vymaže svou miniaturu a hodnoty jsou ve výchozím nastavení zobrazeny za přepínačem ve tvaru oka.
- Dešifrované hodnoty se uchovávají v paměti pouze tehdy, když se zobrazují na obrazovce, a jsou odstraněny, když obrazovka zmizí nebo se aplikace zamkne. Datový klíč se pro požadavek rozbalí a neukládá se do mezipaměti zámku.
- Existuje export prostého textu (takže můžete vždy odejít), nachází se za potvrzovacím listem a novým biometrickým údajem a jeho obrazovka je také FLAG_SECURE.
6. Automatické vyplňování: co se vyplní a co ne
| Kde | Hesla | Karty |
|---|---|---|
| iOS: Safari a aplikace (rozšíření AutoFill) | HeslaAno, po novém Face ID / Touch ID / hesle v rozšíření (LAContext) a pouze pro registrovatelnou doménu, pro kterou byl záznam uložen, s kontrolou aplikací pomocí přidružených domén Apple. | KartyNe. Automatické vyplňování karet v Safari je pouze od Applu; na obrazovce karty se zobrazí „Vyplňuje se v prohlížeči AssuredAuth a kopíruje se“ a nic jiného se neslibuje. |
| Android: aplikace a Chrome (AutofillService) | HeslaAno, ověřování pro každou datovou sadu: systém před vyplněním zobrazí BiometricPrompt; balíček aplikace se shoduje pouze tehdy, když jej Digital Asset Links propojí s uloženou doménou. | KartyAno, nápovědy creditCardNumber, creditCardExpiration* a creditCardSecurityCode, stejná biometrická brána |
| Prohlížeč AssuredAuth (obě platformy) | HeslaAno, pomocí registrovatelné domény – hostitele, který nemá žádnou vlastní shodu – do rámce, který se ptal, biometricky před vyplněním | KartyAno, detekcí pole, biometricky před vyplněním |
| Tlačítka pro kopírování | HeslaZa zámkem aplikace, 30sekundová schránka | KartyČíslo, platnost platnosti, CVC (stejná pravidla) |
Nic se nenaplní u hostitele, který se zdá být podobný. Nic se nenaplní bez biometrických údajů.
7. Co se nikdy nestane
Žádný server úložiště. Žádné analytické nástroje, které by obsahovaly pole úložiště. Žádný export prostého textu bez potvrzovacího listu a nových biometrických údajů. Žádná SDK třetí strany načtená na obrazovce úložiště. Žádný snímek obrazovky úložiště. Žádná nápověda k heslu. Žádné protokolování hodnot v žádném sestavení.
8. Proti čemu se nemůžeme chránit
Heslo dostatečně slabé na uhádnutí. Telefon, jehož operační systém je napaden v rootovém režimu (zařízení s jailbreakem nebo rootem může aplikaci lhát o všem výše uvedeném). Osoba, která je sledována při psaní. Malware na ploše, do kterého vkládáte kód. Říkáme to proto, aby byl výše uvedený seznam interpretován tak, jaký je: věci, které design dokáže odstranit, odstraněny.
9. Stav kontroly
Tento návrh byl jednotkově testován s ohledem na publikované známé odpovědi na obou platformách a s ohledem na jeho vlastní multiplatformní vektory. Před inzercí trezoru v obchodě je na seznamu vlastníků externí kontrola; dokud se tak nestane, bude to v tomto dokumentu uvedeno.
10. Kam se věci hýbou
Nic z úložiště neopouští telefon, ale několik věcí kolem něj běží na počítačích jiných lidí. Toto je seznam a co každá z nich obsahuje; samotné datové toky jsou popsány v zásadách ochrany osobních údajů na adrese https://assuredauth.com/privacy.
- Google Cloud / Firebase — relay e-mailová schránka pro desktopové rozšíření (obálky šifrované end-to-end, smazané po přečtení), push tokeny, stav nákupu a zprávy odeslané prostřednictvím kontaktního formuláře.
- Vercel — ausedauth.com, jeho stránky a drobné funkce, které se za nimi skrývají.
- Vultr — výstupní servery privátního připojení. Prochází přes ně provoz; nic se neukládá.
- Apple a Google Play – nákupy a předplatné ve vlastních obchodech.
- PostHog — produktová analytika: počty použitého obsahu, bez identifikace.
- RevenueCat — stav předplatného: aktivní nebo vypršelé a v jakém tarifu se nachází.
Každý obsahuje pouze to, co je uvedeno na jeho řádku, a nic z úložiště. Seznam se mění s produktem a tato sekce se mění s ním.
Hlášení slabosti
Pokud se domníváte, že jste v něčem z zde popsaného našli slabinu, napište na adresu hello@assuredauth.com s předmětem „Zabezpečení“. Uveďte prosím platformu, verzi aplikace a postup; stačí důkaz, který využívá vaše vlastní data, a žádáme vás, abyste netestovali s daty jiných lidí. Nenabízíme klíč PGP; pokud by hlášení nemělo být doručeno v obyčejné e-mailové podobě, sdělte to v první zprávě a my zařídíme jiný způsob.
Co na oplátku slibujeme: do tří pracovních dnů potvrdíme vaši příspěvek, budeme vás informovat o průběhu práce, opravíme pravdivé informace před jejich zveřejněním a uvedeme vás zde, pokud si přejete být uvedeni jako autor. V souvislosti s výzkumem provedeným v dobré víře v níže uvedeném rozsahu nebudeme podnikat právní kroky.
V rozsahu: aplikace pro iOS a Android, aplikace pro hodinky, rozšíření pro stolní počítače, asuredauth.com a jeho API. Mimo rozsah: samotné App Store a Google Play, výše uvedení poskytovatelé, sociální inženýrství kohokoli a odmítnutí služby.
V tuto chvíli se nevyplácí žádná odměna. Na hlášení se reaguje opravou a poděkováním, ne penězi.