30-50% off hundreds of digital assets! WordPress themes, video, music and more 30-50% Off Go to Sale
Advertisement
  1. Code
  2. Security
Code

Ligtas na Pagtatago ng Data sa Android

by
Difficulty:AdvancedLength:LongLanguages:

Tagalog (Wikang Tagalog) translation by Anna Nelson (you can also view the original English article)

Ang kredibilidad ng isang app sa ngayon ay mataas ang pagdepende sa kung paano pinangagasiwaan ng gumagamit ang kanilang pribadong data. Ang salansan ng Android ay mayroong maraming malakas na mga API na nakapaligid sa katibayan at susing taguan, kasama ang espesipikong mga katangian na magagamit lamang sa ilang mga bersyon.  Itong maiksing serye na ito ay magsisimula sa isang simpleng paraan upang tumayo at tumakbo sa pamamagitan ng pagtingin sa sistema ng taguan at kung paano mag-encrypt at magtago ng sensitibong data sa pamamagitan ng ibinigay ng gumagamit na passcode. Sa pangalawang pagtuturo, titingnan natin ang mas masalimuot na mga paraan ng pagprotekta sa mga susi at mga katibayan.

Mga Pangunahing Kaalaman 

Ang unang tanong na kailangang isipin ay tungkol sa kung gaano kadaming data ang inyong talagang kailangang makuha. Ang isang magandang paraan ay ang pag-iwas na magtago ng pribadong data kung hindi naman talaga ninyo kailangan.

Para sa data na kailangan ninyong itago, ang arkitektura ng Android ay handang tumulong. Simula pa noong 6.0 Marshmellow, ang buong-disk na pag-encrypt ay gumagana sa default, para sa mga aparato na mayroong kakayahan. Ang mga File at SharedPreference na isinave ng app ay awtomatikong nakaset sa MODE_PRIVATE palagi. Ang ibig sabihin nito ang data ay maaari lamang ma-access sa inyong sariling app.

Isang magandang ideya na manatili sa default na ito. Maaari ninyo itong i-set ng tahasan kapag nagse-save ng shared preferences. 

O kapag nagse-save ng file.

Iwasan ang magtago ng data sa panlabas na taguan, dahil ang data ay makikita ng iba pang mga app at mga gumagamit. Sa katunayan, upang mapigilang gawin itong mas mahirap para sa mga tao na kumopya ng inyong app binary at data, maaari ninyong huwag payagan ang mga gumagamit na makapag-install ng app sa panlabas na taguan. Pagdadagdag ng android:installLocation kasama ang halaga ng internalOnlyto ang manipestong file ang gagawa noon.

Maaari niyo ding pigilan ang app at ang data nito na mai-back up. Pinipigilan din nito na ma-download ang mga nilalaman ng isang directory ng pribadong data ng app gamit ang adb_backup. Upang magawa ito, i-set ang android:allowBackup na katangian upang false sa manipestong file. Sa pamamagitan ng default, ang katangian na ito ay naka-set sa true.

Ang mga ito ang pinakamahuhusay na mga kasanayan, ngunit hindi gumagana ang mga ito para sa isang nakakompormiso o inuugat na aparato, at ang pag-encrypt ng disk ay kapaki-pakinabang lamang kapag ang aparato ay ligtas sa pamamagitan ng isang lock screen. Dito kung saan ang pagkakaroon ng isang app-side na password na nangangalaga sa data nito na may pag-encrypt ay kapaki-pakinabang.

Pagsigurado sa Data ng Gumagamit sa Pamamagitan ng Password

Ang Conceal ay isang mainam na pagpipilian para sa isang aklatan ng pag-encrypt dahil mapapatayo kayo nito at mapapatakbo ng napakabilis nang hindi kayo nag-aalala tungkol sa mga nakapailang detalye. Gayunpaman, ang isang pagsasamantala sa tumatarget para sa isang tanyag na balangkas ay sabay-sabay na makaka-apekto sa lahat ng mga app na umaasa dito.

Mahalaga din na magkaroon ng sapat na kaalaman tungkol sa kung paano gumagana ang mga sistema ng pag-encrypt upang masabi kung kayo ay gumagamit ng isang partikyular na balangkas nang sigurado. Kaya naman, para sa paskil na ito ating dudumihan ang ating mga kamay sa pamamagitan ng pagtingin ng direkta sa tagapagtustos ng cryptography.

AES at Password-Based na Susi na Pinagmulan

Gagamitin natin ang inirekomenda sa AES na pamantayan, kung saan ang mga encrypt na data ay binibigyan ng susi. Katulad ng susi na ginagamit upang ma-encrypt ang data ay ginagamit din upang ma-decrypt ang data, na tinatawag na simetrikong pag-encrypt. Mayroong iba’t-ibang mga sukat ng susi,at AES256 (256 bits) ay ang mas gustong haba para gamitin sa sensitibong data.

Habang ang karanasan ng gumagamit ng inyong app ay dapat pwersahin upang gumamit ng isang malakas na passcode, mayroong pagkakataon na ang katulad na passcode ay mapili din ng iba pang gumagamit. Ang paglalagay ng seguridad ng ating encrypted na data sa mga kamay ng gumagamit ay hindi ligtas. Ang ating data ay kailangang sigurado sa pamamagitan ng susi na hindi pinili at sapat ang laki (ie. Yung mayroong sapat na entropy) upang maisaalang-alang na matatag. Ito ang dahilan kung bakit hindi inirerekomenda na gumamit ng isang password na direkta sa pag-encrypt ng data—dito kung saan ang tungkulin na tinatawag Password-Based na Susi na Pinagmulan Function (PBKDF2) ay pumapasok sa laro.

PDKDF2 ay hinahango ang susi mula sa password sa pamamagitan ng pagbudbod dito ng maraming beses ng salt. Ito ay tinawag na pagpapahaba ng susi. Ang salt ay isa lamang hindi piniling pagkakasunod ng data at ginagawang  natatangi ang hinangong susi kahit na katulad na password pa ang gamitin ng ibang tao. Simulan natin sa pamamagitan ng paglikha ng salt na iyon.

Ang SecureRandom na klase ay nagagarantiya na ang nilikhang output ay magiging mahirap hulaan—ito ay isang "cryptograpikal na malakas na tagalikha ng bilang". Ngayon ay maaari na nating ilagay ang salt at password sa isang nakabatay sa password na pag-encrypt na bagay: PBEKeySpec.  Ang object’s constructor ay gumagawa din ng ilang ulit upang magawang mas malakas ang susi. Ito ay dahil ang pagdaragdag ng bilang ng mga pag-ulit ay nagpapalawak ng oras na kakailanganin upang gumana sa isang hanay ng mga susi sa panahon ng pag-atake ng malupit na pwersa. Ang PBEKeySpec ay ipapasa naman sa SecretKeyFactory, kung saan sa wakas ay malilikha na ang susi bilang isang byte[] array. Ating babalutin iyong bagong byte[] array sa isang SecretKeySpec na bagay.

Tandaan na ang password ay pumasa bilang isang char[] array at ang PBEKeySpec na klase ay itinatago ito bilang isang char[] array pati na rin. char[] na mga array ay karaniwang ginagamit para sa mga tungkulin ng pag-encrypt dahil habang ang klase ng String ay hindi nababago,ang isang char[] array na naglalaman ng sensitibong impormasyon ay maaaring mapatungan—kaya nagtatatanggal ng sensitibong data sa buong phyc RAM ng aparato.

Inisyalisasyon ng mga Bektor

Ngayon ay handa na tayo upang mag-encrypt ng data, ngunit mayroon pa tayong isang bagay na kailangang gawin. Mayroong iba’t ibang mga mode ang pag-encrypt sa AES,ngunit gagamitin natin ang isang inirekomenda: cipher block chaining (CBC). Ito ang nagpapagana ng ating data isang bloke sa bawat isang pagkakataon. Ang mahalagang bagay tungkol sa mode na ito ay na ang bawat sunod na encrypted na bloke ng data ay XOR’d sa mga naunang encrypted na bloke upang magawang mas malakas ang pag-encrypt.Gayunpaman, ang ibig sabihin nito na ang unang bloke ay hindi kailanman natatangi na katulad din ng sa iba.

Kung ang isang mensahe na i-eencrypt ay sisimulan sa katulad ng iba pang mensahe na i-eencrypt, ang simula ng output na encrypted ay magiging magkakatulad,at binibigyan nito ang umaatake ng  palatandaan upang malaman kung ano ang maaaring mensahe.Ang solusyon ay ang paggamit ng inisyalisasyon na bektor (IV).

Ang IV ay isa lamang bloke ng hindi piniling mga byte na magiging XOR’d sa unang bloke ng data ng gumagamit. Dahil ang bawat bloke ay nakadepende sa lahat ng mga bloke na pinroseso hanggang sa punto na iyon, ang buong mensahe ay magiging natatanging encrypted—ang magkakahawig na mga encrypted na mensahe na may katulad na susi ay hindi magdudulot ng magkakahawig na mga resulta.Ngayon ay gumawa tayo ng isang IV.

Isang paalala tungkol sa SecureRandom. Sa mga bersyon na 4.3 at mas mababa, ang Java Cryptography Architecture ay mayroong isang kahinaan dahil sa hindi maayos na pag-iinisyal sa saligan ng pseudorandom number generator(PRNG). Kung inyong target ang mga bersyon ng 4.3 at mas mababa, mayroon pagsasaayos.

Pag-encrypt ng Data

Gamit ang isang IvParameterSpec, maaari na nating gawin ang aktwal na pag-encrypt.

Dito ay lalampasan natin ang hanay na "AES/CBC/PKCS7Padding". Ito ay tumutukoy sa AES na pag-encrypt kasama ang cypher block chaining. Ang huling bahagi ng hanay na ito ay tumutukoy sa PKCS7,kung saan ay isang matatag na pamantayan sa pagpapalaman ng data na hindi perpektong umaangkop sa sukat ng bloke. (Ang mga bloke ay 128 na bit, at ang pagpapalaman ay ginagawa bago ang pag-encrypt.)

Upang mabup ang ating halimbawa, ilalagay natin ang code na ito sa isang encrypt na paraan na magpapakete ng resulta sa HashMap na naglalaman ng encrypted na data,nakahanay sa salt at inisyalisasyon ng bektor na kinakailangan para sa decryption.

Ang Paraang ng Pag-Decrypt

Kailangan lamang ninyong itago ang IV at salt kasama ang inyong data. Habang ang mga salt at mga IV ay isinasaalang-alang na publiko, siguraduhing ang mga ito ay hindi sunod-sunod na dinagdagan at inulit. Upang mag-decrypt ang data,ang kailangan lamang nating gawin ay palitan ang mode sa Cipher constructor mula sa ENCRYPT_MODE papunta sa DECRYPT_MODE.  Ang paraan na decrypt ay gagamit ng HashMap na naglalaman ng katulad na kailangang impormasyon (encrypted na data, salt at IV) at ibabalik ang isang decrypted na byte[] array, ipagpalagay na tama ang password. Ang paraan na decrypt ay maglilikha ng susi ng pag-encrypt mula sa password.Ang susi ay hindi dapat itago!

Pagsusuri ng Pag-encrypt at Pag-decrypt

Upang mapanatiling simple ang mga halimbawa,ating tatanggalin ang pagsusuri ng mali na sisiguradong ang HashMap ay naglalaman ng kinakailangang susi,mahalagang mga pares. Ngayon ay maaari na nating suriin ang ating mga paraan upang siguruhin na ang data ay nai-decrypt ng tama pagkatapos ng pag-encrypt.

Ang mga paraan ay gumagamit ng byte[] array ng sa gayon ay maaari ninyong i-encrypt ang arbitrary data sa halip na mga String na bagay lamang.

Pag-save sa Data na Nai-encrypt na

Ngayon na mayroon na tayong nai-encrypt na byte[] array,maaari na natin itong i-save sa taguan.

Kung ayaw ninyong i-save ang IV at salt na magkahiwalay, ang HashMap ay nagagawan ng serye sa pamamagitan ng ObjectInputStream at ObjectOutputStream classes.

Pag-save ng Ligtas na Data sa SharedPreferences

Maaari din ninyong i-save ang ligtas na data sa SharedPreferences ng inyong app

Dahil ang SharedPreferences ay isang XML na sistema na tumatanggap lamang ng espesipikong mga primitibo at mga bagay bilang mga halaga,kailangan nating isalin ang ating data sa isang format na tutugma tulad ng isang String na bagay. Ang Base64 ay pinapayagan tayo na isalin ang bagong data sa String representasyon na naglalaman ng mga karakter lamang na pinapayagan ng XML na format. I-encrypt ang parehong susi  at ang halaga upang ang umaatake ay hindi malaman kung maaaring para saan ang halaga.Sa halimbawa sa itaas, encryptedKey at encryptedValue ay parehong encrypted byte[] mga array na ibinalik mula sa encryptBytes() na paraan. Ang IV at salt ay maaaring i-save sa mga kagustuhang file o bilang nakahiwalay na file. Upang makuhang muli ang mga byte na encrypted mula sa SharedPreferences, maaari nating gamitin ang isang Base64 na nakadecode sa nakatagong String.

Pagbura sa Hindi Ligtas na Data Mula sa Lumang mga Bersyon

Ngayong ang mga nakatagong data ay ligtas na,maaaring magkaroon ng kaso na mayroon kayong nakaraang bersyon ng app na naitago nang hindi ligtas. Sa upgrade, ang data ay maaaring mabura at ma-encrypt ulit. Ang sumusunod na code ay nagbubura sa isang file gamit ang hindi piniling data.

Sa teorya,maaari ninyong basta burahin ang inyong nakabahaging mga kagustuhan sa pamamagitan ng pagtanggal sa /data/data/com.your.package.name/shared_prefs/your_prefs_name.xml at your_prefs_name.bak mga file,at paglinis sa in-memory na mga kagustuhan gamit ang mga sumusunod na code:

Subalit, sa halip na subukang tanggalin lahat ng lumang datos at umasa na gagana ito, mas mabuting i-encrypt ito sa simula pa lamang! Ito ay totoo sa pangkalahatan lalo na para sa matatag na estato ng mga drive na madalas nagkakalat ng pagsusulat ng datos sa iba't ibang rehiyon upang mapigilan ang pagpurol.  Ito ay totoo sa pangkalahatan lalo na para sa matatag na estato ng mga drive na madalas nagkakalat ng pagsusulat ng datos sa iba't ibang rehiyon upang mapigilan ang pagpurol. 

Konklusyon

Ito ay bumabalangkas sa aming pagtuturo sa pagtatago ng data na na-encrypt na. Sa paskil na ito,natutunan ninyo kung paano ligtas na mag-encrypt at mag-decrypt ng sensitibong data sa isang ibinigay ng gumagamit na password. Ito ay madaling gawin kapag alam ninyo kung paano, ngunit mahalaga na sundin ang lahat ng pinakamahusay na mga pagsasanay upang masiguro na ang data ng mga gumagamit ay totoong ligtas.

Sa susunod na paskil,ating titingnan kung paano ang pagpapakilos sa KeyStore at ang iba pang may kaugnayan sa katibayan na mga API upang ligtas na maitago ang mga bagay.Pansamantala, suriin ang iba pa naming mahuhusay na mga artikulo sa pagpapa-unlad ng Android app.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.