Atunci când dezvoltăm o aplicație Android, securitatea acesteia este la fel de importantă ca și funcționalitatea sa. Prin urmare, cheile API trebuie să fie protejate împotriva accesului neautorizat și utilizării malefice, pentru a asigura securitatea API-urilor. Chiar dacă luăm măsuri de precauție în aplicațiile noastre, nu putem preveni în totalitate capturarea cheii API de către cei dornici să o obțină, însă putem dificulta munca lor prin implementarea unor măsuri de securitate sporite.

În acest articol, voi arăta cum să folosiți cheia API în mod securizat prin intermediul buildConfig și local.properties.

Ce este buildConfig?

buildConfig este o clasă creată în timpul compilării aplicațiilor Android. Această clasă conține variabilele și valorile definite în fișierul de configurare al proiectului numit “build.gradle”. Prin intermediul acestei clase, putem utiliza informații specifice configurării proiectului în interiorul aplicației.

Proprietatea buildConfig este folosită pentru a gestiona valori, chei și configurații care variază între diferite medii ale aplicației (dezvoltare, producție, etc.). Astfel, puteți schimba comportamentul aplicației dvs. sau puteți gestiona ușor anumite configurări atunci când rulați aplicația în medii diferite.

Clasa buildConfig se bazează pe variabilele definite cu expresia “buildConfigField”, adăugate în fișierul build.gradle al proiectului de aplicație.

android {
    
    // ...........

    defaultConfig {
    
        // ............

        buildConfigField "int", "MAX_RETRY_COUNT", "3"

    }
}


De exemplu, putem defini o astfel de variabilă mai sus și putem accesa această variabilă în interiorul MainActivity în modul următor.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val maxRetryCount = BuildConfig.MAX_RETRY_COUNT
        
        setContent {
            MyApplicationTheme {
            
             // ........
            }
        }
    }
}

Ce este local.properties?

local.properties este un fișier utilizat pentru a stoca informațiile de configurare locală ale proiectului Android. Acest fișier se află în interiorul proiectului și este folosit în general pentru a stoca date speciale utilizate în faza de configurare și compilare a proiectului. Acest fișier nu este inclus în sistemul de control al versiunilor, deoarece poate conține informații sensibile precum chei API.

Acest fișier este folosit de Android Studio și Gradle și este, în general, utilizat pentru următoarele două scopuri principale:

1) Calea către Android SDK: La compilarea proiectelor Android, sistemul Gradle trebuie să cunoască calea către Android SDK-ul utilizat. Acest fișier conține calea către Android SDK-ul de pe computer și este folosit de sistemul Gradle.

2) Stocarea Datelor Secrete: Parole sau chei API care trebuie să rămână confidențiale sunt stocate în acest fișier. Aceasta este o metodă utilizată pentru a preveni adăugarea acestor informații în codul sursă al proiectului.

Acum putem folosi cheile API păstrându-le local, fără a le încărca în sistemul de control al versiunilor și fără a le include în clasele principale. Mai întâi, să deschidem fișierul local.properties și să adăugăm următoarea intrare pe un rând nou, fără a atinge calea SDK-ului. De asemenea, asigurați-vă că nu scrieți cheia API între ghilimele.

API_KEY=scrieţi-apikey-aici


Apoi, să deschidem fișierul build.gradle la nivelul aplicației (APP level). În interiorul blocului defaultConfig din secțiunea android, să adăugăm următoarea intrare.

Properties localProperties = new Properties()
localProperties.load(project.rootProject.file("local.properties").newDataInputStream())
buildConfigField "String", "API_KEY", "\"${localProperties.getProperty("API_KEY")}\""


Apoi, puteți accesa cheia API folosind “BuildConfig.API_KEY” din orice loc doriți.

Această metodă nu vă protejează 100% împotriva atacatorilor, dar, așa cum am menționat, îi îngreunează munca. De asemenea, puteți păstra cheia API într-un server extern (de exemplu, pe Firebase) pentru a o stoca în siguranță.