Code Signing — ce este, semnarea codului și cum funcționează

Autor: IT Sectr Publicat: 2026-04-16 Timp de citire: 9 min

Code Signing (semnarea codului) — mecanism de semnare digitală a fișierelor executabile, care garantează autenticitatea dezvoltatorului și integritatea aplicației. În Android, fiecare fișier APK trebuie semnat cu un certificat înainte de instalare pe dispozitiv sau publicare în Google Play. Potrivit Google, 2024, Android acceptă patru generații de scheme de semnare: de la v1 bazat pe JAR până la v4 pentru instalare streaming.

Principalele

  • Code Signing — semnarea digitală a codului, care confirmă autorul și integritatea aplicației.
  • În Android, semnarea se realizează prin keystore — depozitul de chei și certificate.
  • Schema v2 (APK Signature Scheme) — standardul principal de la Android 7.0, care protejează toți octeții APK.
  • Rotirea cheilor (v3, Android 9.0+) permite schimbarea cheii de semnare fără ștergerea aplicației.
  • Google Play utilizează Play App Signing pentru gestionarea centralizată a cheilor.

Ce este Code Signing?

Code Signing — proces criptografic în care dezvoltatorul semnează codul executabil cu certificatul său digital. Semnătura este creată folosind criptare asimetrică: cu cheia privată a dezvoltatorului se generează o semnătură digitală, iar cheia publică este încorporată în certificat. Oricine poate verifica semnătura folosind cheia publică, dar modificarea codului fără a afecta semnătura este imposibilă.

în dezvoltarea mobilă semnarea codului îndeplinește trei funcții. Prima — autentificare: utilizatorul și platforma pot identifica dezvoltatorul aplicației. A doua — integritate: orice modificare a APK după semnare invalidează semnătura. A treia — actualizare de încredere: platforma permite actualizarea aplicației numai cu acele APK-uri care sunt semnate cu același certificat ca și versiunea instalată.

Statut juridic

Semnătura digitală a aplicațiilor Android are semnificație juridică. în conformitate cu legislația Federației Ruse (63-FZ) și eIDAS european, semnătura electronică calificată este echivalentă cu semnătura olografă. Cu toate acestea, semnarea APK cu un certificat auto-semnat (practică obișnuită în Android) nu este calificată — confirmă integritatea, dar nu identitatea dezvoltatorului din punct de vedere juridic.

Schemele de semnare Android: v1, v2, v3, v4

Android suportă patru scheme de semnare APK, fiecare rezolvând problemele versiunii anterioare și adăugând noi capacități. Toate schemele pot coexista într-un singur APK — acest lucru este necesar pentru compatibilitatea inversă cu versiunile mai vechi de Android.

Schema v1 (JAR signing) a apărut în Android 1.0. Semnează fișiere individuale în interiorul arhivei APK prin intrări în META-INF/MANIFEST.MF. Dezavantaj: se poate modifica APK (adăuga sau șterge fișiere) și se pot re-semna doar fișierele modificate, fără a atinge semnătura celorlalte. Aceasta face v1 vulnerabilă la anumite atacuri. Schema v2 (APK Signature Scheme), introdusă în Android 7.0, semnează întregul fișier APK complet, inclusiv toți octeții, cu excepția semnăturii în sine, ceea ce elimină posibilitatea modificării selective.

SchemaAndroidCaracteristicăRotire cheie
v1 (JAR)1.0+Semnarea fiecărui fișierNu
v27.0+Semnarea întregului APKNu
v39.0+Semnare + rotireDa
v411.0+Streaming + ADBDa

v3: rotirea cheilor de semnare

Schema v3, prezentată în Android 9.0, rezolvă o problemă veche: ce se întâmplă dacă cheia de semnare este compromisă sau expirată? Anterior, schimbarea cheii de semnare însemna că aplicația este percepută ca nouă — nu poate fi instalată peste cea existentă. v3 adaugă un mecanism de rotire: în APK poate fi inclusă o dovadă a schimbării cheii (proof-of-rotation), semnată cu cheia veche. Sistemul verifică lanțul și permite actualizarea aplicației semnate cu noua cheie.

Keystore și certificate

Keystore — container protejat care conține chei private și certificate pentru semnarea aplicațiilor. în dezvoltarea Android se utilizează formatul JKS (Java KeyStore) sau PKCS12. Keystore-ul este creat cu utilitarul keytool, care face parte din JDK. Fiecare cheie din depozit este identificată printr-un alias și protejată printr-o parolă.

Certificatul din keystore conține cheia publică și informații despre proprietar: numele organizației, țara, perioada de valabilitate. Pentru aplicațiile Android, certificatul poate fi auto-semnat — Google nu necesită apelarea la o autoritate de certificare (CA), ceea ce diferențiază Android de iOS. Cu toate acestea, perioada de valabilitate a certificatului trebuie să fie de cel puțin 25 de ani, deoarece aplicația va fi actualizată cu aceeași cheie.

bash
# Crearea unui nou keystore pentru semnare
keytool -genkey -v -keystore my-release.keystore \
        -alias my-app-alias \
        -keyalg RSA \
        -keysize 2048 \
        -validity 10000

# Vizualizarea conținutului keystore
keytool -list -v -keystore my-release.keystore

Formatele cheilor

Android suportă doi algoritmi pentru cheile de semnare: RSA și ECDSA. RSA cu dimensiunea cheii de 2048 de biți — standardul de facto, suportat de toate versiunile Android. ECDSA (Elliptic Curve Digital Signature Algorithm) cu curba P-256 oferă aceeași putere criptografică la o dimensiune mai mică a cheii. începând cu Android 9.0 se recomandă utilizarea ECDSA, deoarece este mai rapid în verificare pe dispozitive mobile.

Configurarea semnării în compilare

în Android Gradle Plugin, semnarea se configurează prin blocul signingConfigs în build.gradle la nivel de modul. Pentru compilările debug, Android Studio creează automat un keystore de depanare cu parole cunoscute. Pentru compilările release, dezvoltatorul specifică calea către propriul keystore, aliasul cheii și parolele. Se recomandă stocarea parolelor în fișiere de configurare separate, excluse din sistemul de control al versiunilor.

Practica modernă este gestionarea centralizată a semnării prin CI/CD. Jenkins, GitLab CI sau GitHub Actions pot stoca keystore-ul ca artefact protejat, iar parolele — în secretele mediului. Aceasta previne scurgerea cheilor prin depozit și simplifică schimbarea cheii atunci când este necesar.

groovy
// build.gradle (nivel modul) — configurarea semnării
android {
    signingConfigs {
        release {
            storeFile file("my-release.keystore")
            storePassword System.getenv("KEYSTORE_PASSWORD")
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword System.getenv("KEY_PASSWORD")
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

Semnarea mai multor scheme

Pentru compatibilitate maximă, APK trebuie să fie semnat cu toate cele trei scheme (v1 + v2 + v3). Android Gradle Plugin include implicit toate schemele. APK semnat numai cu v2 nu se va instala pe Android 6.0 și versiuni inferioare. APK numai cu v1 nu va beneficia de avantajele de integritate ale v2 pe Android 7.0+. Includerea tuturor schemelor nu crește dimensiunea APK cu mai mult de 1–2% și asigură compatibilitatea cu orice dispozitiv.

Play App Signing și gestionarea cheilor

Play App Signing — serviciu Google Play care gestionează centralizat cheile de semnare ale aplicațiilor. Dezvoltatorul încarcă în Google Play Console APK-ul semnat cu cheia de încărcare (upload key), iar Google Play îl re-semnează cu cheia de distribuție (distribution key) înainte de livrarea către utilizatori. Aceasta protejează cheia de distribuție împotriva pierderii sau compromiterii.

Avantajele Play App Signing: securitate — cheia de distribuție este stocată în depozitul protejat Google; rotire — se poate solicita schimbarea cheii prin consolă; recuperare — în cazul pierderii cheii de încărcare, se poate genera una nouă. Dezavantaj: pentru aplicațiile care existau înainte de implementarea Play App Signing, tranziția necesită crearea unei noi aplicații, deoarece cheia de distribuție veche este deja utilizată.

bash
# Obținerea amprentei certificatului (SHA-256)
keytool -list -v -keystore my-release.keystore \
        -alias my-app-alias | grep "SHA256"

# Verificarea semnături APK prin apksigner
apksigner verify --verbose app-release.apk

Recuperarea cheii

Dacă cheia de semnare este pierdută și Play App Signing nu este utilizat, recuperarea posibilității de actualizare a aplicației este imposibilă — va trebui să creați o nouă aplicație cu un nume de pachet nou. Acesta este unul dintre principalele motive pentru a utiliza Play App Signing. Google recomandă păstrarea unei copii de rezervă a keystore-ului într-un depozit offline protejat (suport USB criptat, seif bancar).

Verificarea semnării pe dispozitiv

La instalarea APK, Android efectuează verificarea semnăturii în mai multe etape. Prima — verificarea certificatului: nu a expirat, formatul este corect. A doua — verificarea semnăturii: semnătura criptografică se potrivește cu conținutul APK. A treia — compararea certificatului cu versiunea instalată: dacă aplicația există deja pe dispozitiv, certificatul trebuie să se potrivească, altfel instalarea este blocată.

Sistemul de verificare este integrat în PackageManagerService. La procesarea cererii de instalare, PMS extrage semnătura din APK, o verifică cu clasa android.util.PackageParser și o compară cu semnătura stocată a aplicației instalate (dacă există). în caz de nepotrivire, utilizatorul primește eroarea „INSTALL_FAILED_UPDATE_INCOMPATIBLE”. Acest mecanism previne atacurile de înlocuire (malware nu poate actualiza o aplicație legitimă cu propria versiune).

Verificarea de către dezvoltator

Dezvoltatorul poate verifica independent semnătura APK cu utilitarul apksigner din Android SDK Build Tools. Comanda apksigner verify --verbose app.apk arată cu ce scheme este semnat APK-ul, dacă certificatele sunt valide și dacă semnăturile se potrivesc cu conținutul. Pentru verificarea programatică a semnăturii aplicației instalate se utilizează PackageManager.getPackageInfo() cu flag-ul GET_SIGNATURES.

kotlin
// Verificarea programatică a semnături aplicației instalate
fun getAppSignature(context: Context, packageName: String): String? {
    val pm = context.packageManager
    val info = pm.getPackageInfo(
        packageName,
        PackageManager.GET_SIGNATURES
    )
    return info.signatures?.firstOrNull()?.toCharsString()
}

Cele mai bune practici de securitate a semnării

Securitatea cheii de semnare — aspect critic al dezvoltării Android. Compromiterea cheii permite atacatorului să semneze actualizările aplicației dvs. cu propriul cod. Reguli de bază: nu stocați niciodată cheia în depozit, nu utilizați aceeași cheie pentru diferite aplicații, nu transmiteți cheia prin canale nesecurizate (email, mesagerie).

Practica recomandată este separarea cheilor. Utilizați o cheie separată pentru fiecare aplicație și o cheie separată pentru încărcarea în Google Play (upload key). Pentru compilările debug, Android Studio creează un debug.keystore comun — acesta nu poate fi utilizat pentru compilările release. Perioada de valabilitate a certificatului trebuie să fie de 25–30 de ani (standardul curent, confirmat de Google).

PracticăRecomandare
Stocarea cheiiSuport criptat, secrete CI/CD
Durata certificatuluiCel puțin 25 de ani
AlgoritmulRSA 2048+ sau ECDSA P-256
SeparareaCheie separată pe aplicație
RezervareaCopie offline a keystore-ului

Auditul semnăturilor

Verificați periodic integritatea lanțului de semnare. La schimbarea angajaților care au acces la chei, actualizați upload key prin Google Play Console. Utilizați instrumente precum Google Play Integrity API pentru a verifica dacă aplicația dvs. nu a fost falsificată pe dispozitivele utilizatorilor. API-ul returnează date despre semnătură, integritate și le trimite pe server pentru verificare.

întrebări frecvente

Ce este Code Signing în Android?

Code Signing — este semnătura digitală a fișierului APK care confirmă că aplicația a fost creată de un anumit dezvoltator și nu a fost modificată după semnare. Fără semnătură, APK nu se va instala pe dispozitiv.

Cum să creați o cheie pentru semnarea aplicației Android?

Utilizați utilitarul keytool din JDK: keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. Specificați keystore-ul obținut în build.gradle în blocul signingConfigs.

Ce se întâmplă dacă pierdeți cheia de semnare?

Dacă cheia este pierdută și nu utilizați Play App Signing, actualizarea aplicației va deveni imposibilă. Va trebui să creați o nouă aplicație în Google Play cu un nume de pachet nou. Utilizați Play App Signing pentru a vă proteja împotriva pierderii cheii.

Cu ce diferă schemele de semnare v1 și v2?

v1 semnează fiecare fișier din interiorul APK separat — atacatorul poate modifica un fișier și îl poate re-semna doar pe acesta. v2 semnează întregul APK complet — orice modificare invalidează semnătura, ceea ce asigură un nivel mai ridicat de securitate.

Ce este Play App Signing?

Play App Signing — serviciu Google Play care stochează centralizat cheia de distribuție a aplicațiilor. Dezvoltatorul încarcă APK-ul semnat cu upload key, iar Google îl re-semnează înainte de livrarea către utilizatori, protejând cheia împotriva pierderii sau furtului.

Rezumat

  • Code Signing — semnătura digitală obligatorie a APK, care garantează autenticitatea și integritatea aplicației.
  • Android suportĄ patru scheme de semnare: v1 (JAR), v2 (APK Signature), v3 (rotire chei) și v4 (streaming).
  • Keystore — container protejat cu chei, creat prin keytool cu algoritmul RSA 2048+.
  • Rotirea cheilor (v3, Android 9.0+) permite schimbarea cheii de semnare fără ștergerea aplicației.
  • Play App Signing gestionează centralizat cheile de distribuție prin Google Play Console.
  • Verificarea semnăturii la instalare blochează atacurile de înlocuire: nepotrivirea certificatului = eroare INSTALL_FAILED.
  • Securitatea cheii: cheie separată pe aplicație, durata 25+ ani, copie offline, fără chei în depozit.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și