Android-də ayələrinizi etibarlı bir şəkildə saxlama haqqında daha çox məlumat əldə edin

Bu yazının müqəddiməsi olaraq qondarma oxucu üçün qısa bir cümlə sitat gətirmək istərdim. İrəli getdiyimiz üçün bu təklif vacib olacaq.

Mütləq təhlükəsizlik kimi bir şey yoxdur. Təhlükəsizlik, bir-birlərini quran və qaçılmazları yavaşlatmaq üçün birləşdirən tədbirlər məcmusudur.

Təxminən üç il əvvəl, simsiz ayaqlarımızı Android tətbiqimizi parçalayan bir hipotetik təcavüzkardan necə qorumaq barədə fikirlər olan bir yazı yazdım. Yaddaş xatirəsinə və İnternetin qaçılmaz ölümündən qurtulmaq üçün burada bir neçə hissəni yenidən hazırlayıram.

Ən çox istifadə hallarından biri, tətbiqetməmizlə məlumat mübadiləsi aparmaq üçün bir veb xidməti ilə əlaqə qurmağımız lazım olduqda baş verir. Bu məlumat mübadiləsi daha az məxfi birdən daha həssas bir növə dəyişə bilər və bir qeydiyyat tələbi, istifadəçi məlumatlarını dəyişdirmək istəyi və s. Arasında dəyişə bilər.

Tətbiq ediləcək mütləq ilk tədbir müştəri ilə server arasında bir SSL (Secure Sockets Layer) bağlantısından istifadə etməkdir. Orijinal təklifə qayıdın. Bu, tamamilə yaxşı bir iş olsa da, mütləq gizlilik və təhlükəsizliyə zəmanət vermir.

Bir SSL bağlantısından istifadə edirsinizsə (brauzerinizdə soyunma gördüyünüz kimi), bu sizinlə server arasındakı əlaqənin şifrələndiyini göstərir. Nəzəriyyə olaraq, bu sorğulardakı məlumatlara heç bir şey daxil ola bilməz (*)

(*) Mütləq təhlükəsizlik olmadığını qeyd etdimmi? SSL əlaqələri hələ də güzəşt edilə bilər. Bu məqalədə bütün mümkün hücumların hərtərəfli siyahısı verilmir, amma sizə bir neçə yol barədə danışmaq istəyirəm. Saxta SSL sertifikatları və adamdaxili hücumlardan istifadə edilə bilər.

Gəlin davam edək. Güman edirik ki, müştərimiz şifrəli SSL kanalı vasitəsi ilə arxamızla əlaqə qurur. Faydalı məlumatlar mübadiləsi aparır, iş görür və xoşbəxtdirlər. Bununla birlikdə əlavə bir təhlükəsizlik təbəqəsi təqdim etmək istərdik.

Bu gün istifadə olunan növbəti məntiqi addım, bir istifadə təsdiqləmə əlaməti və ya ünsiyyətdə istifadə üçün bir API açarı təmin etməkdir. Bu necə işləyir. Geribildirimimiz ərizə alır. Ərizənin təsdiqlənmiş müştərilərimizdən olduğunu və API-yə daxil olmağa çalışan təsadüfi bir adamın olmadığını necə bilirik? Geri bağlantı, müştərinin etibarlı bir API açarının olub olmadığını yoxlayır. Əvvəlki bəyanat doğrudursa, tələbə davam edirik. Əks təqdirdə biz bunu rədd edirik və işimizin xüsusiyyətindən asılı olaraq bəzi düzəldici tədbirlər görürük (bu vəziyyətdə bunun tez-tez baş verdiyini görmək üçün müştərinin IP ünvanını və şəxsiyyət sənədlərini saxlamaq istərdim. Tezlik bu həddən artıq olarsa, mənim üçün arzu olunur. yaxşı zövq, bir qadağa barədə düşünürəm və ya kobud internet oğlanın nəyə nail olmağa çalışdığını dəqiq seyr edirəm).

Qələmimizi yerdən quraq. Tətbiqimizdə, ehtimal ki, hər bir sorğuya avtomatik daxil ediləcək API_KEY adlı dəyişən əlavə edəcəyik (əgər Android istifadə edirsinizsə, ehtimal ki, geri qalan müştərinizdə).

şəxsi son statik simli API_KEY = "67a5af7f89ah3katf7m20fdj202"

Müştərilərimizi eyniləşdirmək istəyiriksə bu əladır və işləyir. Problem ondadır ki, özü də çox təsirli bir təbəqə yoxdur.

Tətbiqi apktool ilə parçalatsanız və sətir axtarsanız, nəticələnən .smali fayllarından birində aşağıdakıları tapacaqsınız:

const-string v1, "67a5af7f89ah3katf7m20fdj202"

Bəli əminəm. Doğrulama əlaməti deyilmir, buna görə də bu simə necə çatacağını və onun identifikasiya məqsədləri üçün istifadə olunacağını və ya edilmədiyini müəyyən etmək üçün diqqətlə araşdırmalıyıq. Ancaq hara getdiyimi bilirsiniz: bu, əsasən vaxt və vəsait məsələsidir.

Proguard bu simi təmin etməyə kömək edə bilər ki, narahat olmayaq? Həqiqətən deyil. Proguard FAQ-da simli şifrələmənin tam mümkün olmadığını bildirir.

Bu sətri Android tərəfindən təmin edilən digər mexanizmlərdən birində saxlamaq məsələn, məsələn B. paylaşılan üstünlüklər? Çətin ki, yaxşı bir fikirdir. SharedPreferences asanlıqla emulator və ya köklü cihaz vasitəsilə əldə edilə bilər. Bir neçə il əvvəl Srinivas adlı bir oğlan video oyunda nəticənin necə dəyişdirilə biləcəyini nümayiş etdirdi. Burada seçimlər tükəndi!

Yerli İnkişaf Dəsti (NDK)

Burada təklif etdiyim orijinal modeli və daha təhlükəsiz alternativ təmin etmək üçün necə keçə biləcəyimizi fırçalamaq niyyətindəyəm. Məlumatlarımızı şifrələmək və deşifrə etmək üçün istifadə edilə bilən iki funksiyanı təsəvvür edək:

Burada xüsusi bir şey yoxdur. Bu funksiyaların hər ikisi kodlaşdırmaq və ya deşifr etmək üçün əsas dəyər və bir sətir tələb edir. Şifrəli və ya şifrələnmiş işarəni qaytarırsınız. Aşağıdakı funksiyanı aşağıdakı kimi adlandırardıq:

İstiqamətini təxmin edirsiniz? Düzdür. Zəruri hallarda əlamətlərimizi şifrələyə və deşifrə edə bilərik. Bu əlavə bir təhlükəsizlik qatını təmin edir: kod qarışıq olduqda, simli axtarış aparmaq və sətrin yerləşdiyi mühiti yoxlamaq asan deyil. Ancaq hələ də həll edilməli olan bir problemi anlaya bilərsinizmi?

Edə bilərsən?

Hələ başa düşməmisinizsə, ona bir neçə saniyə verin.

Bəli, haqlısan. Şifrələmə açarımız var, bu da sim kimi saxlanılır. Bu, obfuskasiya yolu ilə təhlükəsizliyi artırır, lakin bu işarənin şifrələmə və ya işarənin özü üçün istifadə edilməməsindən asılı olmayaraq düz mətn üçün əlamətimiz var.

İndi NDK-dan istifadə edib təhlükəsizlik mexanizmimizi təkrarlayaq.

NDK ilə Android kodumuz vasitəsilə C ++ kod bazasına daxil ola bilərik. Nə edəcəyimizi düşünmək üçün bir dəqiqə vaxt ayıraq. Bir API açarı və ya saxlamağa çalışdığımız digər həssas məlumatları saxlayan yerli C ++ funksiyamız ola bilər. Bu funksiya koddan sonra çağırıla bilər və heç bir Java sənədində bir simli saxlanılmır. Bu, dekompilyasiya texnikalarından avtomatik qorunma təmin edəcəkdir.

C ++ funksiyamız belə görünərdi:

Bu sadəcə Java kodunuzda adlanır:

Və şifrələmə / deşifrləmə funksiyası növbəti parçada olduğu kimi adlanır:

Bir APK yaratdığımızı, onu gözdən keçirtdiyimizi, onu parçaladığımızı və getSecretKey () doğma funksiyasındakı cərgəyə daxil olmağa çalışdığımızı bilsək, tapa bilmirik! Qələbə?

Həqiqətən deyil. NDK kodu həqiqətən sökülərək yoxlanıla bilər. Bu daha çətinləşəcək və getdikcə inkişaf etmiş alətlər və texnikalara ehtiyacınız olacaq. Ssenari uşaqlarının 95% -ni sildiniz, lakin kifayət qədər qaynaq və motivasiya olan bir komanda hələ də mö'cüzə əldə edə bilər. Bu cümləni xatırlayırsan?

Mütləq təhlükəsizlik kimi bir şey yoxdur. Təhlükəsizlik, bir-birlərini quran və qaçılmazları yavaşlatmaq üçün birləşdirən tədbirlər məcmusudur.
Hələ də sökülmüş kod simli hərflərə daxil ola bilərsiniz!

Məsələn, Hex Rays yerli faylları çox yaxşı parçalaya bilər. Əminəm ki, hər hansı bir Android-də yaradılan doğma kodu dekonstruksiya edə biləcək bir çox vasitə var (Hex Rays ilə əlaqəli deyiləm və onlardan heç bir maddi təzminat almıram).

Beləliklə bir etiket və müştəri arasında etiketlənmədən əlaqə qurmaq üçün hansı həll yolundan istifadə edə bilərik?

Açarı cihazda real vaxt rejimində yaradın.

Cihazınız heç bir düyməni saxlamağa məcbur deyil və hərfi cərgənin qıcıqlandırıcı qorunması ilə məşğul olmaq məcburiyyətində deyil! Bu uzaqdan açar təsdiqləmə kimi xidmətlər tərəfindən istifadə olunan çox köhnə bir texnikadır.

  1. Müştəri bir düyməni qaytaran bir funksiyanı () bilir.
  2. Sifarişçi müştəridə tətbiq olunan funksiyanı bilir
  3. Müştəri () funksiyasını serverə ötürülən bir açar yaratmaq üçün istifadə edir.
  4. Server bunu yoxlayır və sorğu ilə davam edir.

Nöqtələri bağlayırsınız? Sizə bir simli (asanlıqla müəyyənləşdirən) bir yerli funksiya vermək əvəzinə, 1 ilə 100 arasındakı üç təsadüfi əsas ədədlərin cəmini qaytaran bir funksiya niyə lazım deyil? Yoxsa cari günü Unix vaxtında təyin edən və hər rəqəmə 1 əlavə edən bir funksiya? Cihazdan kontekstual məlumat almaq barədə, məsələn B. daha yüksək səviyyəli entropiyaya nail olmaq üçün istifadə olunan yaddaş miqdarı?

Sonuncu abzasda bir sıra fikirlər var, amma inşallah hipotetik oxucumuz işarəni vurdu.

Xülasə

  1. Mütləq təhlükəsizlik kimi bir şey yoxdur.
  2. Bir neçə qoruyucu tədbirin birləşməsi yüksək səviyyədə təhlükəsizliyin açarıdır.
  3. Kodunuzda simli hərfləri saxlamayın.
  4. Öz-özünə yaradılan bir açar yaratmaq üçün NDK istifadə edin.

Birinci cümləni xatırlayırsan?

Mütləq təhlükəsizlik kimi bir şey yoxdur. Təhlükəsizlik, bir-birlərini quran və qaçılmazları yavaşlatmaq üçün birləşdirən tədbirlər məcmusudur.

Bir daha demək istəyirəm ki, hədəfiniz 100% təhlükəsizliyin əldə edilə bilməyəcəyi perspektivini itirmədən kodunuzu mümkün qədər qorumaqdır. Ancaq bütün vacib məlumatların şifrəsini açmaq üçün çox sayda mənbənin tələb olunduğu üçün kodunuzu qoruya bilsəniz, yaxşı və sakit yata bilərsiniz.

Kiçik bir imtina

Bilirəm. Sən bu qədər gəlib bu oğlanın Dexguardı necə xatırlatmadığını və bütün çətinliklərdən keçdiyini düşündün. Sən haqlısan Dexguard həqiqətən ipləri maskalaya bilər və onlarda çox yaxşı bir iş görürlər. Bununla birlikdə, Dexguard qiymətləri qadağan edilə bilər. Əvvəlki şirkətlərdə kritik təhlükəsizlik sistemləri olan Dexguard istifadə etdim, amma bu hər kəs üçün bir seçim olmaya bilər. Proqram inkişafında və həyatda nə qədər çox seçim etsəniz, dünya daha da zəngin və zəngin olur.

Əyləncəli kodlaşdırma edin!

Proqram mühəndisliyi və ümumiyyətlə həyat haqqında düşüncələrimi öz Twitter hesabımda yazıram. Bu məqaləni bəyənmisinizsə və ya sizə kömək edibsə, bölüşməkdən çəkin, ♥ və / və ya şərh yazın. Bu həvəskar müəllifləri hərəkətə gətirən valyutadır.