Безбедност
Како је трезор изграђен и шта би пробушење пронашло.
Последње ажурирање 21. септембра 2026. · AssuredAuth, од стране CircleRoll LLC
Ово је јавни опис како AssuredAuth штити двофакторске тајне, лозинке и картице које чувате у њему. Написан је тако да читалац који води рачуна о безбедности може да провери сваку тврдњу у односу на апликацију и у односу на објављене векторе тестирања (доступне сваком рецензенту на захтев на hello@assuredauth.com). Говори оно што је истина и ништа више: ништа овде не тврди да је ван напада, и ништа није обећано у процентима.
Кратка верзија: трезор постоји на једном месту, вашем телефону. Свака вредност у њему је шифрована кључем који поседује безбедносни хардвер телефона и не може да га извезе. Ми не користимо сервер трезора, не чувамо копију и не чувамо кључ. Резервна копија датотеке напушта телефон тек након што је шифрована лозинком која се никада нигде не чува.
Пријави проблем: hello@assuredauth.com. Видите „Пријављивање слабости“ на крају.
1. Шта је шифровано, чиме
| Подаци | На телефону | Кључ |
|---|---|---|
| Двофакторске тајне (TOTP/HOTP/Steam семена) | На телефонуПривезак за кључеве (iOS) / Андроид продавница коју подржава складиште кључева | КључХардверски везан кључ платформе; ред базе података садржи само референцу (secretRef), никада почетну вредност (seed). |
| Лозинке (вредност лозинке, напомене) | На телефонуЗапечаћени ред: AES-256-GCM, случајни 96-битни nonce по вредности | КључСлучајни 256-битни кључ података, сам по себи упакован у хардверски кључ у §2 |
| Картице (број, рок трајања, име на картици, CVC) | На телефонуИсти печат као и лозинке; CVC је опционалан и чува се само ако га унесете | КључИсти кључ података |
| Метаподаци (називи сервиса, корисничка имена, иконе, редослед сортирања) | На телефонуБаза података апликације (SwiftData / Room) | КључЗаштићено шифровањем датотека оперативног система; третира се као нетајно |
| Датотека резервне копије (.authbackup) | На телефонуГде год да га ставите: Датотеке, iCloud Drive, апликација Google Drive, фасцикла са подацима, табела за дељење | КључКључ изведен из ваше лозинке (§3). Apple и Google добијају запечаћену датотеку и ништа друго |
| Апликација за Watch / Wear | На телефонуПривезак за кључеве сата / Шифроване дељене поставке | КључКључеви платформе за сат; пренети преко канала упареног уређаја платформе |
| Саобраћај додатака за рачунар (једнократни кодови на захтев) | На телефонуНе чува се; преноси се као коверте шифроване од краја до краја | КључПар кључева X25519 по упаривању, приватни кључ у привеску кључева / складишту кључева; релеј види само шифровани текст |
Дијагностика нема метод који прихвата тајну. Ниједан аналитички догађај не носи поље трезора. Ниједна вредност из трезора се никада не уписује у дневник, ни у једној верзији.
2. Где се кључеви налазе, на свакој платформи
iOS. Кључ података је обавијен кључем генерисаним унутар Безбедне енклаве (kSecAttrTokenIDSecureEnclave) са контролом приступа .privateKeyUsage + .userPresence, приступачност …ThisDeviceOnly, у дељеној групи за приступ кључевима апликације, тако да екстензија AutoFill може да користи исти кључ. Приватни кључ не може да се прочита из енклаве од стране апликације, резервне копије или програма за отклањање грешака; енклава пристаје да га користи тек након што је корисник присутан (Face ID, Touch ID или лозинка уређаја). ThisDeviceOnly значи да iCloud или iTunes резервна копија телефона не садржи кључ; враћени телефон почиње са празним трезором и тражи вашу датотеку резервне копије и лозинку. Телефон без лозинке не може да блокира .userPresence кључ (Енклав одбија да га креира), а симулатор иде истим путем по замисли (његов упит о присуству је упозорење на које ниједан тест не може да одговори): тамо је кључ података обична ставка привеска за кључеве само за уређај — и даље ван сваке резервне копије, и даље нечитљива док је телефон закључан, али без другог упита — и екран Безбедност каже управо то и предлаже подешавање лозинке.
Android. Кључ података је упакован у AndroidKeyStore AES-256 кључ, генерисан у StrongBox-у када уређај има један (иначе TEE), са setUserAuthenticationRequired(true) и валидношћу аутентификације од 30 секунди након биометријске или акредитиве уређаја, setUnlockedDeviceRequired(true) и setInvalidatedByBiometricEnrollment(true) остављеним укљученим. Та последња заставица је више искрена него носива: Андроид је примењује само на кључеве који захтевају биометрију при свакој употреби, тако да на овом кључу од 30 секунди са дозвољеним акредитивима уређаја не мења ништа — оно што држи прст странца напољу јесте да је за регистрацију потребан ПИН и да уклањање закључавања екрана трајно поништава кључ. Кључеви складишта кључева се не могу извозити и искључени су из Андроидове резервне копије у облаку. Домен који апликација именује на сопственим приказима (webDomain) се верује само из познатог прегледача; из било ког другог пакета такође мора бити онај који је систем верификовао за тај пакет (Digital Asset Links), пошто свака апликација може да затражи било који домен.
Шта ово значи за украдену датотеку базе података. SQLite датотека и запечаћени редови су шифровани текст. Кључ који их отвара налази се у безбедносном хардверу на телефону са ког је датотека дошла и не може се копирати са датотеком. Нема шта да се погађа офлајн: кључ података је случајан, није изведен ни из чега што је особа изабрала.
3. Датотека резервне копије
Резервне копије су једина ствар која напушта телефон, тако да су оне једино место где је офлајн напад у принципу могућ. Дизајн чини тај напад скупим и даје му што је могуће мање могућности за рад:
- Лозинка је дугачка најмање 12 знакова (лист одбија мање знакова и приказује траку јачине).
- Ниједан наговештај за лозинку се не чува нигде, ни у датотеци ни у апликацији.
- Нова насумична „solt“ вредност од 16 бајта и „nonce“ вредност од 12 бајта за сваку записану датотеку.
- Читаво тело је AES-256-GCM, тако да се погрешна лозинка или оштећена датотека одбијају, никада се не дешифрују у смеће.
- Заглавље (формат, верзија, KDF параметри, сол) је повезано са GCM ознаком као додатни аутентификовани подаци, тако да се датотека чији је радни фактор смањен не отвара.
Датотека је JSON формата и читљива је у било ком уређивачу текста; само је шифровани текст непрозиран. Неко ко пронађе датотеку за пет година, када је апликација уклоњена, може тачно да види како је запечаћена и да је отвори помоћу OpenSSL-а или било које Argon2 библиотеке.
Формат v1 (испоручује се у верзији 1.0, остаје читљив)
{
"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>"
}
| Корак | Бајтови |
|---|---|
key | PBKDF2-HMAC-SHA256(passphrase as UTF-8, salt, 600000 rounds, 32 bytes) |
aad | UTF-8("authbackup:1:600000:") ‖ salt (необрађени бајтови соли, не base64) |
ciphertext, tag | AES-256-GCM(key, nonce, plaintext, aad); ознака 16 бајтова, складиштена одвојено |
plaintext | UTF-8 JSON, кључеви сортирани: {"accounts":[…],"exportedAt":"…Z","passwords":[…],"version":1} |
Напомена о компатибилности: Андроид 1.0 је написао варијанту v1 — kdf малим словима, без ознаке кључа (ознака од 16 бајтова додаје се шифрованом тексту), без додатних података. Обе платформе настављају да читају те датотеке (када ознака недостаје: поделити последњих 16 бајтова, отворити са празним AAD-ом; упоредити kdf без обзира на велика и мала слова) и обе сада записују само горњи распоред.
Формат v2 (тренутни; подразумевани за нове резервне копије)
{
"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>"
}
| Корак | Бајтови |
|---|---|
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); ознака 16 бајтова, складиштена одвојено |
plaintext | UTF-8 JSON, кључеви сортирани: {"accounts":[…],"cards":[…],"exportedAt":"…Z","passwords":[…],"version":2} |
Argon2id је референтна C имплементација (phc-winner-argon2, CC0), доступна на обе платформе. 64 MiB и 3 пролаза трају око секунду на тренутном телефону и свако погађање кошта толико меморије и времена на било ком хардверу — својство које PBKDF2 нема у односу на GPU ригове, и разлог зашто v2 постоји. Читач игнорише кључеве које не познаје, тако да v1 читач са v2 телом једноставно никада не види картице.
Доказ
Три датотеке вектора тестова (резервна копија v1, резервна копија v2 и Argon2id) генерише трећа имплементација, независно од обе апликације (Node-ов OpenSSL за PBKDF2 и AES-GCM, WebAssembly Argon2id проверен у време генерисања у односу на објављене одговоре референтне имплементације). Свака садржи лозинку, со, једнократни број, обичан текст, изведени кључ, AAD, очекивани шифровани текст и ознаку, и комплетну датотеку. Јединични тестови на iOS-у и Android-у читају исте датотеке и потврђују исте бајтове — тако да се резервна копија запечаћена на једној платформи доказује, а не претпоставља, да се отвара на другој, а слагање сва три није две копије исте грешке. Пратећи алат отвара датотеку коју је телефон заправо написао са истом том трећом имплементацијом и проверава заглавље у односу на горе наведена правила (тачно кључеви формата, тако да не може бити назнака или име; 16-бајтна „salt“, 12-бајтни „nonce“, 16-бајтна ознака сачувана одвојено; верзија 2 на тачно 64 MiB / 3 / 1; погрешна лозинка је одбијена); аутоматизовано iOS покретање записује једну на симулатору и отвара је на тај начин, и претражује контејнер апликације симулатора, контејнер групе апликација и базу података привеска кључева за сваку почетну лозинку и број картице као UTF-8 и UTF-16 (0 погодака).
4. Модел претње
| Ситуација | Шта они имају | Шта добијају |
|---|---|---|
| Изгубљен или украден телефон, закључан | Шта они имајуУређај, датотека базе података, запечаћени редови | Шта добијајуШифровани текст. Кључ за паковање се налази у сигурносној енклави / сефбоксу и отпушта се тек након закључавања уређаја плус нова биометријска шифра или лозинка. Даљинско брисање телефона (Пронађи мој / Пронађи мој уређај) уништава материјал кључа заједно са њим. |
| Украдена резервна датотека | Шта они имајуДатотека .authbackup са клауд налога, имејла, лаптопа | Шта добијајуТело AES-256-GCM под кључем изведеним из лозинке од најмање 12 карактера, са соли по датотеци и Argon2id-ом на 64 MiB × 3 пролаза (v2) или PBKDF2 на 600.000 рунди (v1). Без назнаке, без корисничког имена, без листе налога на јасном месту. Свако погађање кошта пуног извођења; нема пречице. Јака лозинка је овде цела одбрана, и апликација то каже на листу. |
| Украден уређај са откључаним екраном | Шта они имајуТелефон у вашој руци, откључан | Шта добијајуЛиста кодова. Трезор (лозинке, картице) је иза закључавања апликације и поново се закључава након истека тајмера за аутоматско закључавање (одмах / 1 мин / 5 мин); дешифрована вредност постоји у меморији само док је приказује на екрану. Аутоматско попуњавање и извоз обичног текста захтевају нову биометрију чак и када је апликација отворена. Укључите закључавање апликације са опцијом „Одмах“ ако вас то брине. |
| Злонамерна апликација на истом телефону | Шта они имајуПесковито окружење друге апликације, међуспремник, приступачност или трикови преклапања | Шта добијајуНе може да чита наше датотеке (платформски sandbox) нити да користи наш кључ (кључ је везан за наш идентитет потписивања и присуство корисника). Копије се бришу из међуспремника након 30 секунди; на Андроиду је копија означена као осетљива и искључена из историје међуспремника. Екрани трезора подешавају FLAG_SECURE на Андроиду (нема снимака екрана, нема снимања екрана, празно у прекидачу); iOS празни сличицу прекидача. Аутоматско попуњавање на Андроиду се служи само апликацијама које је систем верификовао у односу на сачувани домен (Digital Asset Links), тако да се апликацији која изгледа слично не нуди ваша лозинка. |
| Фишинг страница | Шта они имајуСајт који изгледа као онај који сте сачували | Шта добијајуНишта се не попуњава. Подударање се врши по регистрованом домену (јавна листа суфикса, у пакету и ажурирана са апликацијом): login.example.com и example.com се подударају, example.com.evil.net и examp1e.com се не подударају. Прегледач у апликацији се подудара на исти начин и попуњава само оквир који је тражио, поново проверавајући у односу на сопствено порекло тог оквира у тренутку попуњавања; хост без сопственог регистрованог домена - ИП адреса, голо име на локалној мрежи - подудара се тачно и ништа мање. iOS AutoFill додаје Apple-ову проверу повезаних домена. Лозинка коју морате ручно налепити у сличан домен је и даље ризик; апликација не може то да уклони, већ само да избегне помоћ. |
| Наши сопствени сервери | Шта они имају— | Шта добијајуНе постоји сервер трезора. AssuredAuth нема налоге, нема пријаву и нема копију вашег трезора, тако да на нашој страни нема ничега вашег што би могло бити украдено и крековано. Две ствари се покрећу на страни сервера, од којих ниједна не дотиче трезор: релејно поштанско сандуче за десктоп екстензију, које чува коверте шифроване од почетка до краја (једнократни кодови, бришу се када се прочитају; релеј никада нема кључ), и излазни сервери опционе приватне везе, који преносе саобраћај и не воде евиденцију приступа. |
| Судски позив или владин захтев | Шта они имајуПравни поступак упућен нама | Шта добијајуНишта за предати: немамо трезор, немамо кључ, немамо лозинку нити резервну копију. Можемо бити приморани да то кажемо; не можемо бити приморани да произведемо оно што не постоји. |
5. Међуспремник, снимци екрана и меморија
- Копирање ставља вредност у међуспремник на 30 секунди, а затим је брише ако је још увек наша. На Андроиду је клип означен као EXTRA_IS_SENSITIVE, тако да га систем скрива из прегледа и историје међуспремника; на iOS-у је ставка картона само локална (не преноси се на друге уређаје).
- Екрани трезора (Лозинке, Лозинка, Картице, Картица, листови лозинки, извоз обичног текста) постављају FLAG_SECURE на Андроиду. iOS нема еквивалентну заставицу; апликација празни своју сличицу у пребацивач апликација, а вредности су подразумевано иза прекидача у облику ока.
- Дешифроване вредности се чувају у меморији само док се приказују на екрану и бришу се када екран нестане или се апликација закључа. Кључ података се распакује за захтев и не кешира се преко закључавања.
- Извоз обичног текста постоји (тако да увек можете да одете) и налази се иза потврдног листа и нових биометријских података, а његов екран је такође FLAG_SECURE.
6. Аутоматско попуњавање: шта се попуњава, а шта не
| Где | Лозинке | Картице |
|---|---|---|
| iOS: Safari и апликације (проширење за аутоматско попуњавање) | ЛозинкеДа, након новог Face ID-а / Touch ID-а / лозинке у екстензији (LAContext), и само за регистровани домен за који је унос сачуван, уз проверу апликација од стране Apple-ових associated-domains. | КартицеНе. Аутоматско попуњавање картица у Сафарију је само Еплово; на екрану картице пише „Попуњава се у прегледачу AssuredAuth и копирањем“ и не обећава ништа друго. |
| Андроид: апликације и Chrome (AutofillService) | ЛозинкеДа, аутентификација по скупу података: систем приказује BiometricPrompt пре попуњавања; пакет апликације се подудара само када га Digital Asset Links повеже са сачуваним доменом | КартицеДа, назнаке creditCardNumber, creditCardExpiration* и creditCardSecurityCode, иста биометријска капија |
| Претраживач AssuredAuth (обе платформе) | ЛозинкеДа, путем регистрованог домена — хоста који нема ниједно сопствено подударање — у оквир који је питао, биометријски пре попуњавања | КартицеДа, детекцијом поља, биометријски пре попуњавања |
| Дугмад за копирање | ЛозинкеИза закључавања апликације, међуспремник од 30 секунди | КартицеБрој, рок трајања, CVC (иста правила) |
Ништа се не попуњава на сличном домаћину. Ништа се не попуњава без биометријских података.
7. Шта се никада не дешава
Нема сервера трезора. Нема аналитике која садржи поље трезора. Нема извоза обичног текста без потврдног листа и нових биометријских података. Нема SDK-а треће стране учитаног на екран трезора. Нема снимка екрана трезора. Нема назнаке лозинке. Нема евидентирања вредности, ни у једној верзији.
8. Од чега се не можемо заштитити
Лозинка довољно слаба да се погоди. Телефон чији је оперативни систем угрожен у корену (уређај са џејлбрејком или рутованим приступом може да лаже апликацији о свему горе наведеном). Особа која се посматра док куца. Злонамерни софтвер на радној површини у коју лепите садржај. Ово кажемо да би се горња листа прочитала онаква каква јесте: ствари које дизајн може да уклони, уклоњене.
9. Статус прегледа
Овај дизајн је тестиран јединично у односу на објављене познате одговоре на обе платформе и у односу на сопствене крос-платформске векторе. Спољни преглед је на листи власника пре него што се трезор огласи на листи продавнице; док се то не деси, овај документ ће то овде навести.
10. Где ствари теку
Ништа из трезора не напушта телефон, али неколико ствари око њега ради на машинама других људи. Ово је листа и шта свака од њих садржи; сами токови података су описани у политици приватности на https://assuredauth.com/privacy.
- Google Cloud / Firebase — релејно поштанско сандуче за десктоп екстензију (коверте шифроване од краја до краја, бришу се приликом читања), push токени, стање куповине и поруке послате путем контакт форме.
- Версел — asuredauth.com, његове странице и мале функције које стоје иза њих.
- Vultr — излазни сервери приватне везе. Саобраћај пролази кроз њих; ништа се не чува.
- Apple и Google Play — куповине и претплате, у њиховим сопственим продавницама.
- PostHog — аналитика производа: број онога што се користи, без икаквог идентитета.
- RevenueCat — стање претплате: активна или истекла и на ком је плану.
Свака садржи оно што пише у њеној линији и ништа из трезора. Листа се мења када се производ мења, а и овај одељак се мења са њим.
Пријављивање слабости
Ако сматрате да сте пронашли слабост у било чему што је овде описано, пишите на hello@assuredauth.com са темом „Безбедност“. Молимо вас да наведете платформу, верзију апликације и кораке; довољан је доказ који користи ваше сопствене податке и молимо вас да их не тестирате у односу на туђе податке. Не нудимо PGP кључ; ако извештај не треба да путује обичном е-поштом, наведите то у првој поруци и ми ћемо се договорити на други начин.
Шта обећавамо заузврат: потврђујемо у року од три радна дана, обавештавамо вас док радимо на томе, исправљамо оно што је истинито пре него што било шта у вези са тим буде објављено и наводимо вас овде ако желите да будете наведени као аутор. Нећемо предузети правне мере због истраживања урађеног у доброј вери у оквиру наведеног испод.
У оквиру: iOS и Android апликације, апликације за сатове, екстензија за десктоп, asuredauth.com и његов API. Ван оквира: сами App Store и Google Play, горе наведени провајдери, друштвени инжењеринг било кога и ускраћивање услуге.
Тренутно нема награде. На пријаву се одговара поправком и захвалношћу, а не новцем.