Hou Data Veilig op Android
Die geloofwaardigheid van 'n program hang tans baie van hoe die gebruiker se persoonlike data bestuur word. Die Android Stack het baie kragtige API's rondom geloofsbriewe en sleutel berging, met spesiale eienskappe wat slegs in sekere weergawes beskikbaar is. Hierdie kort reeks sal begin met 'n eenvoudige benadering om op te staan ​​deur te kyk na die bergingstelsel en hoe om sensitiewe data te enkripteer en op te slaan via 'n paswoord wat deur gebruikers verskaf word. In die tweede handleiding gaan ons kyk na meer komplekse maniere om sleutels en geloofsbriewe te beskerm.
Die eerste vraag om na te dink, is hoeveel data jou werklik nodig het. 'N Goeie benadering is om persoonlike data te voorkom as jou dit nie regtig moet doen nie.
Vir data wat jou moet stoor, is die Android-argitektuur gereed om te help. Sedert 6.0 Marshmellow, is die volle skyf enkripsie standaard aangeskakel vir toestelle met die vermoë. Lêers en SharedPreferences wat deur die program gestoor word, word outomaties ingestel met die MODE_PRIVATE konstante. Dit beteken dat die data slegs deur jou eie program verkry kan word.
Dit is 'n goeie idee om by hierdie standaard te hou. Jou kan dit eksplisiet stel wanneer jou 'n gedeelde voorkeur stoor.
Of Wanneer die Lêer Gestoor Word.
Vermy die stoor van data in eksterne berging, aangesien data dan deur ander programme en gebruikers besigtig kan word. Om te verhoed dat dit moeiliker maak vir mense om jou binêre en programdata te kopieer, kan jou gebruikers verbied om programme op eksterne berging te installeer. Adding android: installLocation met waarde internalOnly na die manifeste lêer sal dit doen.
Jou kan ook voorkom dat programme en data gerugsteun word. Dit voorkom ook dat inhoud afgelaai word van die persoonlike data gids wat die program gebruik adb backup. Om dit te doen, stel die android: allowBackup attribuut vals in die manifestlêer. Standaard word hierdie kenmerk as waar gestel.
Dit is 'n beste praktyk, maar werk nie vir gekompromitteerde of gewortelde toestelle nie, en skyf enkripsie is net nuttig wanneer die toestel met 'n sluitskerm beveilig word. Dit is waar jou 'n wagwoord vir die toepassing het wat sy data beskerm met nuttige enkripsie.
Sekuriteit van Gebruikersdata Met Wagwoord
Conceal is 'n goeie keuse vir 'n enkripsie-biblioteek omdat dit jou vinnig opduik sonder om bekommerd te wees oor die onderliggende besonderhede. Egter, 'n uitbuiting wat gerig is op 'n gewilde raamwerk, sal gelyktydig al die programme wat daarop staatmaak, beïnvloed.
Dit is ook belangrik om kennis te hê van hoe die enkripsiestelsel werk, sodat jy kan sien of jou 'n spesifieke raamwerk veilig gebruik. Dus, vir hierdie pos sal ons ons hande vuil kry deur direk na kriptografiese verskaffers te kyk.
AES en Wagwoord Gebaseerde Sleutel Afleiding
Ons sal die aanbevole AES standaard gebruik, wat data versamel wat 'n sleutel verskaf. Dieselfde sleutel wat gebruik word om die data te enkripteer, word gebruik om die data te dekripteer, wat simmetriese enkripsie genoem word. Daar is verskillende sleutel groottes, en AES256 (256 bisse) is die voorkeurlengte vir gebruik met sensitiewe data.
Selfs as jou program se gebruikerservaring gebruikers moet dwing om 'n sterk wagwoord te gebruik, is dit moontlik dat dieselfde kode ook deur ander gebruikers gekies word. Die beveiliging van ons geïnkripteer data in die hande van die gebruiker is nie veilig nie. Ons data moet eerder beveilig word met 'n sleutel wat willekeurig en groot genoeg is (dit wil sê genoeg entropie) om sterk beskou te word. Daarom word dit nooit aanbeveel om 'n wagwoord direk te gebruik om data te enkripteer nie. Dit is waar 'n funksie genoem Wagwoordgebaseerde Sleutel Afleidingfunksie (PBKDF2) in die spel kom.
PDKDF2 neem die sleutel van die wagwoord deur hashing baie keer met sout. Dit word 'n sleutelstrek genoem. Die sout is net 'n ewekansige reeks data en maak die afgeleide sleutel uniek, selfs al is dieselfde wagwoord deur iemand anders gebruik. Kom ons begin deur daardie sout te genereer.
Die SecureRandom klas waarborg dat die gegenereerde uitset moeilik sal wees om te voorspel. Dit is 'n "kriptografies sterk willekeurige getalgenerator". Ons kan nou die sout en wagwoord in 'n wagwoordgebaseerde enkripsie-voorwerp plaas: PBEKeySpec. Die voorwerp se konstruktor neem ook 'n iterasie telvorm wat die sleutel sterker maak. Dit is omdat die verhoging van die aantal iterasies die tyd wat dit sal neem om op 'n stel sleutels te werk tydens 'n brute kragaanval, vermeerder. Die PBEKeySpec word dan geslaag in die SecretKeyFactory, wat uiteindelik die sleutel genereer as 'n byte  skikking. Ons sal daardie rou byte  skikking in 'n geheimeKeySpec-voorwerp wikkel.
Let daarop dat die wagwoord geslaag is as 'n char skikking en die PBEKeySpec klas stoor dit ook as 'n char skikking. char skikkings word gewoonlik gebruik vir enkripsiefunksies, want terwyl die String klas onveranderlik is, kan 'n char skikking wat sensitiewe inligting bevat, oorskry word, waardeur die sensitiewe data heeltemal verwyder word uit die phyc RAM van die toestel.
Ons is nou gereed om die data te enkripteer, maar ons het nog een ding om te doen. Daar is verskillende modusse van enkripsie met AES, maar ons sal die aanbevole een gebruik: cipher block chaining (CBC). Dit werk een blok op 'n slag op ons data. Die groot ding oor hierdie modus is dat elke volgende ongecodeerde databasis XOR'd is met die vorige geïnkripteer blok om die enkripsie sterker te maak. Dit beteken egter, dat die eerste blok nooit so uniek is soos al die ander nie!
As 'n boodskap wat geïnkripteer moet word, sou dieselfde wees as 'n ander boodskap wat geïnkripteer sou wees, sou die begin-geïnkripteerde uitset dieselfde wees, en dit sou 'n aanvaller 'n idee gee om uit te vind wat die boodskap mag wees. Die oplossing is om 'n aanvangsvektor (IV) te gebruik.
'N IV is slegs 'n blok willekeurige grepe wat XOR'd sal wees met die eerste blok gebruikersdata. Aangesien elke blok afhang van alle blokke wat verwerk word tot op daardie punt, sal die hele boodskap versleutelde unieke identiese boodskappe geïnkripteer word met dieselfde sleutel, nie dieselfde resultate lewer nie. Kom ons skep nou 'n IV.
'N Nota oor SecureRandom. Op weergawes 4.3 en onder het die Java Cryptography Architecture 'n kwesbaarheid weens onbehoorlike initialisering van die onderliggende pseudorandom-nommergenerator (PRNG). As jou gerig is op weergawes 4.3 en onder, a fix is available.
Gewapen met 'n IvParameterSpec, kan ons nou die werklike enkripsie doen.
Hier slaag ons in 'n tou "AES/CBC/PKCS7Padding". Dit spesifiseer AES enkripsie met leë blokmonsters. Die laaste gedeelte van hierdie string verwys na PKCS7, wat 'n gevestigde standaard is vir die opvulling van data wat nie perfek in die blokgrootte pas nie. (Blokke is 128 bisse, en die vulling is voor kodering gedoen.)
Om ons voorbeeld te voltooi, sal ons hierdie kode in 'n enkripsie-metode plaas wat die resultaat sal verpak in 'n HashMap wat die versleutelde data bevat, tesame met die sout- en inisiatiewe-vektor wat nodig is vir dekripsie.
Die Dekripsie Metode
Jou hoef net die IV en sout met jou data te stoor. Terwyl soute en IV's as publiek beskou word, maak seker dat hulle nie opeenvolgend verhoog of hergebruik word nie. Om die data te dekripteer, is alles wat ons moet doen, die modus in die Cipher konstruktor van ENCRYPT_MODE na DECRYPT_MODE verander. Die dekripsie metode sal 'n HashMap neem wat dieselfde vereiste inligting bevat (geënkripteerde data, sout en IV) en gee 'n gekodeerde byte skikking, met die korrekte wagwoord. Die dekripsie metode sal die enkripsiesleutel van die wagwoord herstel. Die sleutel moet nooit gestoor word nie!
Toets Enkripsie en Dekripsie
Om die voorbeeld eenvoudig te hou, laat ons foutkontrole weg wat seker maak dat die HashMap die vereiste sleutel, waardepare bevat. Ons kan nou ons metodes toets om te verseker dat die data korrek gedekripteer word na enkripsie.
Die metodes gebruik 'n byte skikking, sodat jou arbitrêre data kan enkripteer in plaas van slegs String voorwerpe.
Stoor Geïnkripteer Data
Noudat ons 'n versleutelde byte skikking het, kan ons dit stoor.
As jou nie die IV en sout apart wil stoor nie, is HashMap serialiseerbaar met die ObjectInputStream en ObjectOutputStream klasse.
Stoor veilige data op SharedPreferences
Jou kan ook veilige data stoor in jou program se SharedPreferences.
Aangesien die SharedPreferences 'n XML stelsel is wat slegs spesifieke primitiewe en voorwerpe as waardes aanvaar, moet ons ons data omskep in 'n verenigbare formaat soos 'n String voorwerp. Base64 stel ons in staat om die rou data te omskep in 'n String voorstelling wat slegs die karakters wat deur die XML formaat toegelaat word, bevat. Enkripteer beide die sleutel en die waarde, sodat 'n aanvaller nie kan uitvind waaroor 'n waarde mag wees nie. In die voorbeeld hierbo is encryptedKey en encryptedValue beide geïnkripteer byte raamwerke wat van ons encryptBytes() metode teruggekeer word. Die IV en sout kan gered word in die voorkeure lêer of as 'n aparte lêer. Om die geïnkripteer grepe uit die SharedPreferences terug te kry, kan ons 'n Base64 dekodeer op die gestoor String toepas.
Nie Veilige Data vVrwyder Uit ou Weergawe
Nou is die gestoor data veilig, jou kan dalk 'n vorige weergawe van die program hê wat die data onveilig stoor. By opgradering kan data uitgevee en herkodeer word. Die volgende kode skrap lêers deur gebruik te maak van ewekansige data.
In teorie kan jou gedeelde voorkeure uitvee deur te skrap /data/data/com.your.package.name/shared_prefs/your_prefs_name.xmland your_prefs_name.bak lêer, en your_prefs_name.bak lêer, en skoongemaakte voorkeur in geheue met die volgende kode:
In plaas daarvan om te probeer om ou data uit te vee en hoop dat dit werk, word dit in die eerste plek beter geïnkripteer! Dit geld veral vir vaste hardeskywe wat dikwels data-skryf na verskillende streke versprei om slytasie te voorkom. Dit beteken dat selfs indien jou lêers in die lêerstelsel oorskryf, fisiese vaste-staat geheue jou data op die oorspronklike plek op die skyf kan stoor.
Dit verswak ons ​​tutoriaal oor die stoor van geënkripteerde data. In hierdie pos het jou geleer hoe om sensitiewe data veilig te enkripteer en te dekodeer met 'n wagwoord wat deur gebruikers verskaf word. Dit is maklik om te doen wanneer jou weet hoe, maar dit is belangrik om al die beste praktyke te volg om te verseker dat jou gebruikers se data werklik veilig is.
In die volgende pos sal ons kyk hoe om die KeyStore en ander geloofsgebaseerde API's te gebruik om items veilig te stoor. In die tussentyd, gaan na 'n paar van ons ander wonderlike artikels oor Android appontwikkeling.