Android-де белгілерді қауіпсіз сақтау туралы көбірек біліңіз

Осы мақаланың алғы сөзі ретінде мен қиялшыл оқырманға қысқаша сөйлем келтіргім келеді. Біз алға жылжу кезінде бұл баға маңызды болады.

Абсолютті қауіпсіздік деген ұғым жоқ. Қауіпсіздік дегеніміз - бір-біріне негізделетін және сөзсіз болуды баяулататын шаралар жиынтығы.

Үш жылға жуық уақыт бұрын мен андроидтық қосымшаны Android қосымшасын бұзып жатқан гипотетикалық шабуылдан қалай қорғау туралы идеялар жазылған пост жаздым. Есте сақтау және Интернеттің еріксіз өлімін болдырмау үшін мен осы жерде бірнеше бөлімді шығарамын.

Ең жиі кездесетін жағдайлардың бірі, біздің қосымшамыз деректер алмасу үшін веб-қызметпен байланысу қажет болған кезде пайда болады. Деректермен алмасу құпия еместен сезімтал түрге өзгеруі мүмкін және тіркеу сұранысы, пайдаланушы деректерін өзгерту туралы сұраныс және т.б. арасында өзгеруі мүмкін.

Пайдаланылатын абсолютті бірінші шара - клиент пен сервер арасында SSL (Secure Sockets Layer) байланысын қолдану. Бастапқы ұсынысқа оралыңыз. Бұл абсолютті құпиялылық пен қауіпсіздікке кепілдік бермейді, дегенмен бұл ең жақсы жұмыс.

Егер сіз SSL қосылымын қолдансаңыз (браузерде құлыпты көргенде), бұл сіз бен сервер арасындағы байланыс шифрланғанын білдіреді. Теорияда бұл сұраулардағы ақпаратқа ешкім қол жеткізе алмайды (*)

(*) Мен абсолютті қауіпсіздік жоқ екенін айттым ба? SSL қосылымдары әлі де бұзылуы мүмкін. Бұл мақалада ықтимал шабуылдардың толық тізімі берілмейді, бірақ мен сізге бірнеше жолдар туралы айтып бергім келеді. Жасанды SSL сертификаттары мен ортадағы шабуылдарды қолдануға болады.

Алға қарай жүрейік. Біздің тұтынушы сервермен шифрланған SSL арнасы арқылы байланысады деп болжаймыз. Олар пайдалы деректермен алмасады, бизнес жасайды және бақытты. Алайда біз қосымша қауіпсіздік қабатын ұсынғымыз келеді.

Бүгін қолданылатын келесі логикалық қадам - ​​бұл байланыста пайдалану үшін аутентификация таңбалауышы немесе API кілтін ұсыну. Бұл қалай жұмыс істейді. Біздің қорғаушы өтініш алады. Өтініш біздің API-ге кіруге тырысатын кездейсоқ жігіттен емес, тексерілген клиенттердің бірінен келетіндігін қайдан білеміз? Сервер клиенттің жарамды API кілтін беретіндігін тексереді. Егер алдыңғы мәлімдеме рас болса, біз сұранысты жалғастырамыз. Әйтпесе біз мұны қабылдамаймыз және бизнесіміздің сипатына байланысты кейбір түзету шараларын қолданамыз (бұл жағдайда клиенттің IP мекенжайын және жеке куәліктерін сақтауды қалаймын, бұл қаншалықты жиі орын алатынын білгім келеді. Егер жиілік осыдан асып кетсе, бұл мен үшін қажет. жақсы талғам, мен тыйым салу туралы ойлаймын немесе дөрекі интернет жігіттің қол жеткізуге тырысатын әрекетін көремін)

Біздің қамалды жер бетінен тұрғызайық. Біздің бағдарламада біз барлық сұрауларға автоматты түрде қосылатын API_KEY деп аталатын айнымалы модельді қосамыз (егер сіз Android-ді қолданатын болсаңыз, онда сіздің жеке клиентіңіз болуы мүмкін).

жеке түпкілікті статикалық жол API_KEY = «67a5af7f89ah3katf7m20fdj202»

Бұл өте жақсы және біз клиенттеріміздің түпнұсқалығын растағымыз келсе жұмыс істейді. Мәселе мынада, өте тиімді қабаттың өзі жоқ.

Егер сіз қосымшаны apktool көмегімен ажыратып, жолдарды іздесеңіз, алынған .smali файлдарының бірінде мыналарды табасыз:

const-string v1, «67a5af7f89ah3katf7m20fdj202»

Ия сенімдімін. Бұл тексеру таңбалауышы деп айтылмайды, сондықтан біз бұл жолға қалай жетуге болатындығын және оны аутентификация мақсаттары үшін қолдануға болатын-болмайтынын анықтау үшін мұқият қарап шығуымыз керек. Бірақ сіз менің қайда бара жатқанымды білесіз: бұл көбіне уақыт пен ресурстарға қатысты мәселе.

Proguard бұл жолды қорғауға көмектесе ала ма, сондықтан біз алаңдамаймыз ба? Шынында емес. Proguard өзінің жиі қойылатын сұрақтарында жолды шифрлау мүмкін емес дейді.

Бұл жолды Android ұсынған басқа тетіктердің бірінде сақтау туралы не айтуға болады, мысалы? B. ортақ артықшылықтар? Бұл жақсы идея әрең. SharedPreferences-ке эмулятор немесе тамырлы құрылғы арқылы оңай қол жеткізуге болады. Бірнеше жыл бұрын Сринивас есімді жігіт видео ойыннан нәтижені қалай өзгертуге болатындығын көрсетті. Міне, біз нұсқалар таусылды!

Native Development Kit (NDK)

Мен мұнда ұсынған түпнұсқа модель туралы және қауіпсіз балама ұсыну үшін оны қалай өткізуге болатындығын білгім келеді. Деректерімізді шифрлау мен шифрын шешуге болатын екі функцияны елестетейік:

Мұнда ерекше ештеңе жоқ. Бұл функциялардың екеуі де кодтау немесе кодтан шығару үшін кілт мәні мен жолды қажет етеді. Шифрланған немесе шифрланған таңбалауышты қайтарасыз. Біз келесі функцияны келесідей атаймыз:

Сіз бағытты болжайсыз ба? Бұл дұрыс. Егер қажет болса, таңбалауышымызды шифрлай және шеше аламыз. Бұл қауіпсіздіктің қосымша қабатын қамтамасыз етеді: код бұзылған кезде, жол іздеуді орындау және жол орналасқан ортаны тексеру сияқты оңай болмайды. Бірақ сіз әлі де шешілуі керек мәселені анықтай аласыз ба?

Сіз жасай аласыз ба?

Егер сіз оны әлі білмеген болсаңыз, оған бірнеше секунд беріңіз.

Ия, сіз дұрыс айтасыз. Бізде шифрлау кілті бар, ол да жол ретінде сақталады. Бұл обфусация арқылы қауіпсіздікті арттырады, бірақ шифрлау үшін немесе таңбалауыштың өзі пайдаланылғанына қарамастан, бізде қарапайым мәтінге арналған таңбалауыш бар.

Енді ҰҚК қолданып, қауіпсіздік механизмімізді қайталайық.

NDK көмегімен C ++ кодтық базасына біздің Android коды арқылы қол жеткізуге болады. Не істеу керектігі туралы бір минут ойланайық. Бізде API кілтін немесе біз сақтауға тырысатын басқа құпия деректерді сақтайтын C ++ функциясы болуы мүмкін. Бұл функцияны кодтан кейін шақыруға болады, ал жол ешқандай Java файлында сақталмайды. Бұл декомпиляция әдістерінен автоматты түрде қорғанысты қамтамасыз етеді.

Біздің C ++ функциясы келесідей болады:

Бұл жай сіздің Java кодымен шақырылады:

Ал шифрлау / шифрлау функциясы келесі үзіндідегідей аталады:

Егер біз APK жасайтынымызды білмесек, оны жасырамыз, бөлшектейміз және getSecretKey () функциясы құрамындағы жолға қол жеткізуге тырысамыз, оны таба алмаймыз! Жеңіс пе?

Шынында емес. NDK кодын іс жүзінде бөлшектеуге және тексеруге болады. Бұл қиындай түседі және сізге жетілдірілген құралдар мен әдістер қажет болады. Сіз балалардың 95% сценарийін жойдыңыз, бірақ жеткілікті ресурстар мен уәжі бар команда әлі де токенге қол жеткізе алады. Бұл сөйлем есіңізде ме?

Абсолютті қауіпсіздік деген ұғым жоқ. Қауіпсіздік дегеніміз - бір-біріне негізделетін және сөзсіз болуды баяулататын шаралар жиынтығы.
Сіз әлі де бөлшектелген код жолдарының әріптеріне қол жеткізе аласыз!

Мысалы, Hex Rays жергілікті файлдарды өте жақсы ыдырата алады. Android-те жасалған кез-келген түпнұсқалық кодты қайта құруға мүмкіндік беретін бірқатар құралдар бар екеніне сенімдімін (мен Hex Rays-пен байланысқан емеспін және олардан ешқандай қаржылық өтемақы алмаймын).

Сонымен, сервер мен клиент арасында тегтерсіз байланыс орнату үшін қандай шешімді қолдана аламыз?

Кілтті құрылғыда нақты уақытта жасаңыз.

Сіздің құрылғыңызда ешқандай кілттерді сақтаудың қажеті жоқ және тура жолды тітіркендіретін қорғаумен айналысудың қажеті жоқ! Бұл кілттерді қашықтан тексеру сияқты қызметтер қолданатын өте ескі әдіс.

  1. Клиент кілтті қайтаратын функцияны () біледі.
  2. Сервер клиентте орындалатын функцияны біледі ()
  3. Клиент серверге жіберілетін кілтті құру үшін () функциясын қолданады.
  4. Сервер оны тексеріп, сұранысты жалғастырады.

Сіз нүктелерді қосасыз ба? Сізге жолды қайтаратын (анықтау оңай) туған функцияның орнына, неге сізге 1-ден 100-ге дейінгі үш кездейсоқ жай сандардың қосындысын қайтаратын функция болмасқа? Немесе Unix уақытында күнді белгілейтін және әр санға 1 санын қосатын функция? Құрылғыдан контекстік ақпаратты алу туралы, мысалы B. энтропияның жоғарырақ деңгейіне жету үшін қолданылатын жад мөлшері?

Соңғы абзацта бірқатар идеялар бар, бірақ біздің гипотетикалық оқырман осы белгіге жетті деп үміттенеміз.

Қысқаша мазмұны

  1. Абсолютті қауіпсіздік деген ұғым жоқ.
  2. Бірнеше қорғаныс шараларының үйлесімі қауіпсіздіктің жоғары деңгейінің кепілі болып табылады.
  3. Кодта жол әріптерін сақтамаңыз.
  4. Өздігінен жасалынатын кілтті жасау үшін NDK қолданыңыз.

Бірінші сөйлем есіңізде ме?

Абсолютті қауіпсіздік деген ұғым жоқ. Қауіпсіздік дегеніміз - бір-біріне негізделетін және сөзсіз болуды баяулататын шаралар жиынтығы.

Сіздің мақсатыңыз - 100% қауіпсіздікті қамтамасыз ету мүмкін еместігін жоғалтпай, сіздің кодты мүмкіндігінше қорғау болып табылады. Алайда, егер сіз өзіңіздің кодыңызды қорғап, барлық маңызды ақпаратты шифрлау үшін көптеген ресурстар қажет болса, сіз жақсы және тыныш ұйықтай аласыз.

Шағын жауапкершіліктен бас тарту

Мен білемін. Сіз осы уақытқа дейін келдіңіз және бұл жігіттің Dexguard туралы айтпағаны және барлық қиыншылықтар туралы жазған мақаласын қарастырдыңыз. Дұрыс айтасыз Dexguard іс жүзінде жолдарды жасырады және олар өте жақсы жұмыс істейді. Алайда, Dexguard-дің бағасы тыйым салуы мүмкін. Мен Dexguard-ты алдыңғы қатарлы қауіпсіздік жүйелері бар компанияларда қолдандым, бірақ бұл барлық адамдар үшін мүмкін болмауы мүмкін. Бағдарламалық жасақтаманы жасау мен өмірде қаншалықты көп мүмкіндіктер болса, соғұрлым әлем соғұрлым бай және бай болады.

Көңілді кодтаңыз!

Мен твиттердегі аккаунтта бағдарламалық жасақтама және өмір туралы ойларымды жазамын. Егер сізге осы мақала ұнады немесе ол сізге көмектесе алса, бөлісіңіз, ♥ және / немесе түсініктеме қалдырыңыз. Бұл әуесқой авторларды қозғайтын валюта.