Hoe LifeVeil je bestanden beschermt
Deze pagina legt in gewone woorden uit wat LifeVeil doet, en ook wat het niet kan. We willen liever dat je de grenzen kent dan dat je vertrouwt op een belofte die te groot is.
In het kort
- Alle versleuteling gebeurt op je telefoon. Er is geen LifeVeil-server en geen account.
- De bestanden van elke kluis worden versleuteld met een willekeurige sleutel. Alleen het patroon van die kluis (met de pincode op het hoogste niveau), de herstelzin als je er een hebt toegevoegd, of je vingerafdruk als je die hebt aangezet, kan die sleutel ontgrendelen.
- Elk patroon opent een kluis. Een patroon dat bij geen enkele bewaarde kluis hoort, opent een lege kluis, en er wordt niets opgeslagen tot je er een bestand aan toevoegt.
- Wij, de ontwikkelaars, hebben nooit je patroon, je pincode, je zin of je sleutels. We kunnen je bestanden niet openen en we kunnen je patroon niet resetten.
- We gebruiken de versleuteling die in Android zit en de bekende libsodium-bibliotheek. We hebben geen eigen versleuteling geschreven.
- LifeVeil heeft nog geen onafhankelijke beveiligingsaudit gehad.
Van je patroon naar een sleutel
Je tekent een patroon op een raster van 5×5, zonder een punt twee keer te gebruiken. Een nieuw patroon dat je instelt, heeft minstens 6 punten nodig. LifeVeil maakt van het patroon een sleutel met Argon2id, uit libsodium (versie 1.0.20 op Android).
- Instellingen: 64 MiB geheugen, 3 doorgangen, 1 lane, sleutel van 256 bits.
- Argon2id is met opzet traag en heeft voor elke gok veel geheugen nodig. Daardoor wordt raden met grafische kaarten veel duurder.
- Op onze testtelefoons duurt één keer ontgrendelen ongeveer 0,6 tot 0,9 seconden.
- Het patroon wordt gemengd met een willekeurige apparaatsalt van 16 bytes. De salt wordt in de app bewaard, versleuteld met een sleutel in de Android Keystore, die niet van de telefoon gekopieerd kan worden.
- Er wordt geen kopie van het patroon bewaard, behalve de kopie die bij een herstelzin hoort (zie hieronder). De app controleert een patroon door te proberen de sleutel te ontgrendelen.
- Wat je typt in het pincodevak boven de punten, gaat in dezelfde sleutelafleiding als het patroon. Een leeg vak betekent alleen het patroon.
Beveiligingsniveaus
Elke kluis heeft één niveau. Je kiest het als je begint, en je kunt het later wijzigen via Instellingen > Kluis > Beveiligingsniveau, nadat je het patroon opnieuw hebt getekend.
- Hoogste beveiliging (Ultra): patroon en een pincode van 6 tot 8 cijfers, allebei alleen in je hoofd. Veilig, zelfs tegen raden met AI. Vergeet je een van beide, dan kan de kluis niet worden hersteld.
- Niveau 1 (aanbevolen): alleen patroon. Veilig als je veelgebruikte vormen vermijdt. Vergeet je het, dan kan de kluis niet worden hersteld.
- Niveau 2: patroon en een herstelzin op papier. Je komt weer binnen als je het patroon vergeet, maar wie het papier vindt, kan de kluis ook openen.
- Niveau 3: patroon en vingerafdruk. Het handigst, maar iemand kan je vinger tegen de sensor dwingen. Vingerafdruk werkt voor maar één kluis.
Hoe bestanden worden versleuteld
- Elke kluis heeft een willekeurige hoofdsleutel van 256 bits. Je patroonsleutel en herstelsleutel "verpakken" (versleutelen) alleen deze hoofdsleutel.
- Bestanden, miniaturen en de lijst van je items (oorspronkelijke bestandsnamen, datums, groottes) worden versleuteld met AES-256-GCM, via de versleuteling die in Android zit. GCM merkt ook op als een bestand is gewijzigd of verwisseld.
- Bestanden in de app hebben willekeurige namen. Grote bestanden worden versleuteld in stukken van 1 MiB, zodat video's afspelen zonder dat er ooit een onversleutelde kopie in de opslag komt.
- Bij JPEG-foto's worden de verborgen gegevens (EXIF, zoals camera en datum) apart bewaard, ook versleuteld.
- Als de app vergrendelt, overschrijft hij de sleutels in het geheugen met nullen.
Herstelzin
- Een herstelzin is optioneel. Een kluis krijgt er alleen een als je Niveau 2 kiest, en hij wordt bewaard nadat je een korte quiz hebt doorstaan.
- De veilige generator voor willekeurige getallen van de telefoon kiest 9 Engelse woorden. Ze komen uit twee lijsten van 1024 gewone woorden, in een van 4 vaste volgordes. Dat is 92 bits aan willekeur. De woorden zijn Engels in elke taal van de app.
- De zin gaat door dezelfde Argon2id-instellingen en ontgrendelt de hoofdsleutel op zichzelf. Hij heeft de apparaatsalt niet nodig, dus hij werkt ook als het patroon niet meer werkt.
- Een kopie van de zin en een kopie van het patroon (en de pincode) van de kluis worden op de telefoon bewaard, elk twee keer versleuteld: één keer met de hoofdsleutel en één keer met een sleutel uit de Android Keystore. Als de zin de kluis opent, toont de app het patroon één keer. Het wordt vergeten zodra de app vergrendelt.
- De zin blijft hetzelfde als je het patroon wijzigt. Een kluis zonder zin heeft geen weg terug als het patroon vergeten is.
Vingerafdruk
Ontgrendelen met vingerafdruk is optioneel en werkt voor één kluis. Android controleert de vingerafdruk, niet LifeVeil; de app krijgt je vingerafdruk nooit. Een sleutel in de Android Keystore die alleen direct na een sterke biometrische controle werkt, ontgrendelt de hoofdsleutel. Als iemand een nieuwe vingerafdruk aan de telefoon toevoegt, werkt deze sleutel niet meer en moet je je patroon weer gebruiken.
Back-upbestand
- Een back-up is één
.lvb-bestand. Het bevat je items precies zoals ze al versleuteld zijn, plus verpakte kopieën van de hoofdsleutel: één voor het patroon dat je tekende toen je de back-up maakte, en één voor de herstelzin, als de kluis er een had. - De patroonkopie gebruikt voor elke back-up een nieuwe willekeurige salt, niet de apparaatsalt. Daardoor kun je de back-up op een nieuwe telefoon openen.
- De header van het bestand is beschermd, zodat wijzigingen of verwisselde delen worden opgemerkt.
- Je kiest zelf waar je het opslaat, via het opslagscherm van Android. Het gaat nooit via ons.
- Om terug te zetten open je het bestand met het bijbehorende patroon of de bijbehorende zin. Daarna teken je een nieuw patroon. De teruggezette kluis begint zonder herstelzin.
Andere bescherming in de app
- Screenshots, schermopnamen en het voorbeeld in de lijst met recente apps zijn op elk scherm geblokkeerd.
- Standaard vergrendelt de app zodra je hem verlaat. Je kunt in plaats daarvan 30 seconden of 1 minuut kiezen.
- De eigen cloudback-up van Android en de overdracht van telefoon naar telefoon nemen de gegevens van LifeVeil niet mee. Gebruik in plaats daarvan het back-upbestand.
- De app vraagt niet om toegang tot je locatie, je contacten of "alle bestanden".
- Een lege kluis voor elk nieuw patroon. Een kluis zonder bestanden ziet er hetzelfde uit, of hij nu bewaard is of niet. Iemand die je dwingt de app te openen, kan zo niet zien wat er verder is. Je kunt dit uitzetten via Instellingen > Beveiliging; een patroon dat niets opent, toont dan een foutmelding.
Raden afremmen
Omdat elk patroon een kluis opent, ziet raden eruit als het openen van veel lege kluizen. LifeVeil remt dit af zonder dat op het scherm te melden, en de wachttijd is voor elk patroon gelijk, ook voor het juiste.
- Binnen 24 uur voegen 10 keer openen van kluizen zonder bestanden 10 seconden toe aan elke ontgrendeling, 20 keer 60 seconden en 30 keer 5 minuten, het maximum.
- Tekenen van automatisering gaan direct naar het maximum: drie keer achter elkaar patronen die minder dan 2 seconden na elkaar worden afgerond, of aanrakingen die van toegankelijkheidsdiensten of geïnjecteerde invoer komen in plaats van van een vinger.
- Elke 24 uur zonder dat een lege kluis wordt geopend, gaat de rem één stap omlaag. De klok van de telefoon terugzetten maakt de wachttijd niet korter.
- Dit werkt alleen in de app. Het remt raden op een computer met een gekopieerd bestand niet af (zie de grenzen hieronder).
AI en het raden van patronen
- AI kan de berekening niet overslaan. Elke gok moet nog steeds Argon2id uitvoeren met 64 MiB geheugen. AI kraakt Argon2id of AES niet, dus geen enkele gok wordt goedkoper.
- Wat AI verandert, is de volgorde van de gokken. AI kan leren welke vormen mensen graag gebruiken (letters, vierkanten, favoriete beginhoeken) en die eerst proberen. AI kan ook helpen een patroon af te lezen van een video die over je schouder is gemaakt, of van vegen op het scherm.
- De verdediging zit dus in het patroon, niet in de berekening. De app waarschuwt voor veelgebruikte vormen. Het hoogste beveiligingsniveau voegt een pincode van 6 tot 8 cijfers toe, zodat een patroon dat op video is gezien niet genoeg is. Patroonlijn verbergen laat geen lijn achter om te filmen. De apparaatsalt in de Android Keystore voorkomt raden buiten de telefoon.
Grenzen die je moet kennen
Geen enkele app kan tegen alles beschermen. Dit zijn de eerlijke grenzen van LifeVeil.
Eenvoudige patronen zijn te raden
Korte of veelgebruikte vormen (een L, een Z, een rechte lijn) zijn te raden door je te bekijken, door vegen op het scherm, of in een paar pogingen. Echte patronen zijn veel makkelijker te raden dan het aantal mogelijke patronen doet denken. Gebruik meer punten en meer bochten. De app waarschuwt je voor heel eenvoudige patronen, en voordat hij een kluis bewaart waarvan het patroon minder dan 6 punten heeft.
Hoe lang raden kan duren
In de app duurt elke poging ongeveer een seconde, en herhaald raden maakt elke ontgrendeling trager, tot 5 minuten. Maar iemand die je back-upbestand heeft, of die de apparaatsalt van een geroote telefoon heeft gehaald, kan in plaats daarvan op een computer raden, zonder wachttijden. Argon2id remt dit af, maar een patroon heeft veel minder mogelijkheden dan een lang wachtwoord. Ruwe schattingen voor één krachtige grafische kaart (klasse RTX 4090) met ongeveer 1000 gokken per seconde:
| Wat wordt geraden | Mogelijkheden | Tijd, één grafische kaart |
|---|---|---|
| De 10.000 meest gebruikte patronen | 104 | ongeveer 10 seconden |
| Alle patronen met 6 punten | 1,28 × 108 | ongeveer 1,5 dag |
| Alle patronen met 7 punten | 2,42 × 109 | ongeveer 28 dagen |
| Alle patronen met 8 punten | 4,36 × 1010 | ongeveer 1,4 jaar |
| Herstelzin (92 bits) | 4,95 × 1027 | ongeveer 1,6 × 1017 jaar |
Dit zijn schattingen, geen metingen. De aantallen patronen zijn bovengrenzen; echte patronen zijn er veel minder. Meer of snellere hardware maakt raden naar verhouding sneller. Een pincode op het hoogste niveau vermenigvuldigt deze getallen met maximaal 108.
Houd je back-upbestand privé
Het back-upbestand bevat de apparaatsalt niet, dus iedereen die het in handen krijgt, kan offline patronen proberen, zoals hierboven. Bewaar het alleen op een plek waar alleen jij bij kunt, zoals je eigen cloudaccount, en gebruik een langer patroon.
De herstelzin toont ook het patroon
Wie de herstelzin van een kluis heeft, kan die kluis openen, en de app toont dan het patroon en de pincode ervan. Gebruik je hetzelfde patroon ook ergens anders, zoals voor de schermvergrendeling van je telefoon, dan weet diegene dat ook. Bewaar het papier net zo veilig als de bestanden zelf.
Geroote of geïnfecteerde telefoons
Als iemand code kan uitvoeren met de rechten van de app (bijvoorbeeld op een geroote telefoon, of met malware die volledige controle heeft), kan die persoon de apparaatsalt ontgrendelen en offline raden. Terwijl de kluis open is, staan de sleutels in het geheugen en kunnen ze worden gelezen met roottoegang of een debugger. Sommige kopieën die in Android en Flutter worden gemaakt, en foto's die op het scherm staan, kunnen niet meteen uit het geheugen worden gewist.
Sommige informatie is zichtbaar
Het aantal versleutelde bestanden in de opslag van de app, hun globale grootte, en wanneer ze zijn gemaakt of gewijzigd, zijn niet verborgen. Ook het feit dat LifeVeil is geïnstalleerd niet.
De lege kluis misleidt alleen het scherm
Wie de bestanden van de app kan lezen (bijvoorbeeld op een geroote telefoon), kan de kluismappen tellen en zien dat deze instelling aan staat. De rem telt bewaarde en niet-bewaarde lege kluizen op dezelfde manier, dus de wachttijd zelf verraadt het verschil niet.
De vermomming verandert alleen het startscherm
- Alleen het pictogram en de naam in de launcher veranderen. De lijst in Instellingen > Apps van de telefoon, de app-info en de opslagschermen tonen nog steeds LifeVeil.
- Schermlezers kunnen nog steeds "LifeVeil" zeggen. De launcher van Samsung One UI geeft TalkBack bijvoorbeeld de echte app-naam, en de app kan dat niet veranderen.
- Het deelmenu van Android toont altijd de echte app-naam, dus LifeVeil verdwijnt daaruit als je het pictogram wijzigt. Je kunt het weer aanzetten.
- Toestemmingsverzoeken van Android tonen de echte naam, dus de app vraagt om toestemmingen voordat je het pictogram wijzigt.
- Zolang het pictogram gewijzigd is, stuurt de app geen meldingen.
- De vermommingscode (4 tot 8 cijfers) toont alleen het vergrendelscherm. Hij opent je bestanden niet. Hij wordt bewaard als hash met salt, maar met zo weinig mogelijkheden is hij makkelijk te vinden als iemand het bestand in handen krijgt.
Vingerafdruk is een zwakkere route
Ontgrendelen met vingerafdruk slaat Argon2id over. De sterkte hangt af van de vingerafdruksensor van je telefoon en de Android Keystore. Je kunt het op elk moment uitzetten in Instellingen.
Fotogegevens
- Bij HEIC-, PNG- en WebP-foto's blijven de verborgen gegevens (EXIF) in het bestand. Het hele bestand is nog steeds versleuteld.
- Op Android 10 en hoger haalt Android de gps-locatie weg uit foto's die LifeVeil leest, omdat de app niet om toegang tot je locatie vraagt. Als het origineel uit de galerij wordt verwijderd, is die locatie weg.
- Foto's die je toevoegt via de fotokiezer van Android krijgen nieuwe namen op basis van de datum, omdat de kiezer de oorspronkelijke naam niet doorgeeft.
Vergrendelen wacht tijdens systeemschermen
Zolang er een systeemscherm open is (toestemmingsverzoek, bevestiging van verwijderen, foto- of bestandskiezer, vingerafdrukvraag) en zolang er een import of export loopt, wacht de app met vergrendelen. Als je de app hebt verlaten, vergrendelt hij 2 seconden nadat dat klaar is.
Kluizen delen één apparaatsalt
Alle kluizen op een telefoon gebruiken dezelfde apparaatsalt. Als iemand die salt heeft, test één gok alle kluizen tegelijk. De moeite om één kluis aan te vallen blijft hetzelfde.
Wat geen enkele app kan tegenhouden
Iemand die meekijkt terwijl je je patroon tekent, of een camera die je scherm filmt.
Zonder zin kan niemand helpen
Als je het patroon vergeet van een kluis zonder herstelzin, of als je zowel het patroon als de zin kwijtraakt, kan niemand de bestanden ervan terughalen. Ook wij niet.