Code Signing — vad är det, signering av kod och hur fungerar det

Författare: IT Sectr Publicerad: 2026-04-16 Lästid: 9 min

Code Signing (signering av kod) — mekanism för digital signering av körbara filer som garanterar utvecklarens äkthet och applikationens integritet. I Android måste varje APK-fil signeras med ett certifikat innan installation på en enhet eller publicering i Google Play. Enligt Google, 2024 stödjer Android fyra generationer av signeringsscheman: från v1 baserat på JAR till v4 för streaminginstallation.

Huvudsakligt

  • Code Signing — digital signatur av kod som bekräftar upphovsrätt och integritet för applikationen.
  • I Android utförs signering via keystore — ett lager för nycklar och certifikat.
  • Schema v2 (APK Signature Scheme) — huvudstandarden från Android 7.0 som skyddar alla byte i APK.
  • Nyckelrotation (v3, Android 9.0+) gör det möjligt att ändra signeringsnyckeln utan att ta bort appen.
  • Google Play använder Play App Signing för centraliserad nyckelhantering.

Vad är Code Signing?

Code Signing — en kryptografisk process där utvecklaren signerar körbar kod med sitt digitala certifikat. Signaturen skapas med asymmetrisk kryptering: med utvecklarens privata nyckel genereras en digital signatur och den offentliga nyckeln bäddas in i certifikatet. Vem som helst kan verifiera signaturen med den offentliga nyckeln, men att ändra koden utan att bryta signaturen är omöjligt.

I mobil utveckling har signering av kod tre funktioner. Första — autentisering: användaren och plattformen kan identifiera appens utvecklare. Andra — integritet: varje ändring av APK efter signering gör signaturen ogiltig. Tredje — pålitlig uppdatering: plattformen tillåter uppdatering av appen endast med APK:er som är signerade med samma certifikat som den installerade versionen.

Juridisk status

Digital signatur av Android-appar har juridisk betydelse. I enlighet med Ryska federationens lagstiftning (63-FZ) och europeiska eIDAS, är en kvalificerad elektronisk signatur likställd med en handskriven. Signering av APK med ett självsignerat certifikat (vanlig praxis i Android) är dock inte kvalificerad — den bekräftar integritet men inte utvecklarens identitet ur juridisk synvinkel.

Androids signeringsscheman: v1, v2, v3, v4

Android stödjer fyra APK-signeringsscheman, som var och en löser problemen från föregående version och lägger till nya möjligheter. Alla scheman kan samexistera i en APK — detta är nödvändigt för bakåtkompatibilitet med äldre Android-versioner.

Schema v1 (JAR-signering) dök upp i Android 1.0. Det signerar enskilda filer inuti APK-arkivet via poster i META-INF/MANIFEST.MF. Nackdel: man kan ändra APK (lägga till eller ta bort filer) och signera om endast de ändrade filerna utan att påverka de övrigas signatur. Detta gör v1 sårbart för vissa attacker. Schema v2 (APK Signature Scheme), introducerat i Android 7.0, signerar hela APK-filen fullständigt, inklusive alla byte förutom själva signaturen, vilket eliminerar möjligheten till selektiv ändring.

SchemaAndroidFunktionNyckelrotation
v1 (JAR)1.0+Signering av varje filNej
v27.0+Signering av hela APKNej
v39.0+Signering + rotationJa
v411.0+Streaming + ADBJa

v3: rotation av signeringsnycklar

Schema v3, introducerat i Android 9.0, löser ett gammalt problem: vad gör man om signeringsnyckeln är komprometterad eller har gått ut? Tidigare innebar en ändring av signeringsnyckeln att appen betraktades som ny — den kunde inte installeras över den befintliga. v3 lägger till en rotationsmekanism: i APK kan ett bevis på nyckelbyte (proof-of-rotation) inkluderas, signerat med den gamla nyckeln. Systemet kontrollerar kedjan och tillåter uppdatering av appen som signerats med den nya nyckeln.

Keystore och certifikat

Keystore — en skyddad behållare som innehåller privata nycklar och certifikat för signering av appar. I Android-utveckling används formatet JKS (Java KeyStore) eller PKCS12. Keystore skapas med verktyget keytool som ingår i JDK. Varje nyckel i lagret identifieras av ett alias och skyddas av ett lösenord.

Certifikatet i keystore innehåller offentlig nyckel och information om ägaren: organisationsnamn, land, giltighetstid. För Android-appar kan certifikatet vara självsignerat — Google kräver inte någon certifieringsmyndighet (CA), vilket skiljer Android från iOS. Certifikatets giltighetstid måste dock vara minst 25 år eftersom appen kommer att uppdateras med samma nyckel.

bash
# Skapa ny keystore för signering
keytool -genkey -v -keystore my-release.keystore \
        -alias my-app-alias \
        -keyalg RSA \
        -keysize 2048 \
        -validity 10000

# Visa innehåll i keystore
keytool -list -v -keystore my-release.keystore

Nyckelformat

Android stödjer två algoritmer för signeringsnycklar: RSA och ECDSA. RSA med nyckelstorlek 2048 bitar — de facto standard som stöds av alla Android-versioner. ECDSA (Elliptic Curve Digital Signature Algorithm) med kurvan P-256 ger samma kryptografiska styrka vid mindre nyckelstorlek. Från och med Android 9.0 rekommenderas ECDSA eftersom det är snabbare vid verifiering på mobila enheter.

Konfiguration av signering i bygget

I Android Gradle Plugin konfigureras signering genom blocket signingConfigs i build.gradle på modulnivå. För debug-byggen skapar Android Studio automatiskt en debug-keystore med kända lösenord. För release-byggen anger utvecklaren sökvägen till sin keystore, nyckelns alias och lösenord. Det rekommenderas att förvara lösenord i separata konfigurationsfiler som är undantagna från versionskontrollsystemet.

Modern praxis är centraliserad signeringshantering via CI/CD. Jenkins, GitLab CI eller GitHub Actions kan lagra keystore som en skyddad artefakt och lösenord som miljöhemligheter. Detta förhindrar läckage av nycklar via repot och förenklar byte av nyckel vid behov.

groovy
// build.gradle (modulnivå) — konfiguration av signering
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
        }
    }
}

Signering med flera scheman

För maximal kompatibilitet bör APK signeras med alla tre scheman (v1 + v2 + v3). Android Gradle Plugin inkluderar som standard alla scheman. En APK som endast signerats med v2 installeras inte på Android 6.0 och äldre. APK endast med v1 får inte integritetsfördelarna med v2 på Android 7.0+. Att inkludera alla scheman ökar inte APK-storleken med mer än 1–2% och säkerställer kompatibilitet med vilken enhet som helst.

Play App Signing och nyckelhantering

Play App Signing — en Google Play-tjänst som centralt hanterar signeringsnycklar för appar. Utvecklaren laddar upp APK signerad med uppladdningsnyckeln (upload key) till Google Play Console, och Google Play signerar om den med distributionsnyckeln (distribution key) innan leverans till användarna. Detta skyddar distributionsnyckeln från förlust eller kompromettering.

Fördelar med Play App Signing: säkerhet — distributionsnyckeln lagras i Googles skyddade lager; rotation — nyckelbyte kan begäras via konsolen; återställning — vid förlust av uppladdningsnyckeln kan en ny genereras. Nackdel: för appar som fanns innan Play App Signing infördes kräver övergången att en ny app skapas eftersom den gamla distributionsnyckeln redan används.

bash
# Få certifikatets fingeravtryck (SHA-256)
keytool -list -v -keystore my-release.keystore \
        -alias my-app-alias | grep "SHA256"

# Kontrollera APK-signatur via apksigner
apksigner verify --verbose app-release.apk

Återställning av nyckel

Om signeringsnyckeln förloras och Play App Signing inte används, är återställning av uppdateringsmöjligheten omöjlig — du måste skapa en ny app i Google Play med ett nytt paketnamn. Detta är en av de främsta anledningarna till att använda Play App Signing. Google rekommenderar att förvara en säkerhetskopia av keystore i skyddad offlinelagring (krypterad USB-enhet, bankfack).

Verifiering av signatur på enheten

Vid installation av APK utför Android verifiering av signaturen i flera steg. Första — kontroll av certifikat: har inte gått ut, formatet är korrekt. Andra — kontroll av signatur: stämmer den kryptografiska signaturen överens med APK-innehållet. Tredje — jämförelse av certifikat med installerad version: om appen redan finns på enheten måste certifikatet matcha, annars blockeras installationen.

Verifieringssystemet är inbyggt i PackageManagerService. Vid bearbetning av en installationsbegäran extraherar PMS signaturen från APK, kontrollerar den med klassen android.util.PackageParser och jämför den med den lagrade signaturen för den installerade appen (om den finns). Vid obalans får användaren felet „INSTALL_FAILED_UPDATE_INCOMPATIBLE”. Denna mekanism förhindrar ersättningsattacker (skadlig programvara kan inte uppdatera en legitim app med sin egen version).

Kontroll av utvecklare

Utvecklaren kan själv kontrollera APK-signaturen med verktyget apksigner från Android SDK Build Tools. Kommandot apksigner verify --verbose app.apk visar med vilka scheman APK är signerad, om certifikaten är giltiga och om signaturerna stämmer med innehållet. För programmatisk verifiering av signaturen för en installerad app används PackageManager.getPackageInfo() med flaggan GET_SIGNATURES.

kotlin
// Programmatisk verifiering av signatur för installerad app
fun getAppSignature(context: Context, packageName: String): String? {
    val pm = context.packageManager
    val info = pm.getPackageInfo(
        packageName,
        PackageManager.GET_SIGNATURES
    )
    return info.signatures?.firstOrNull()?.toCharsString()
}

Bästa praxis för signeringssäkerhet

Säkerhet för signeringsnyckeln — en kritisk aspekt av Android-utveckling. Kompromettering av nyckeln gör det möjligt för en angripare att signera uppdateringar av din app med sin egen kod. Grundläggande regler: förvara aldrig nyckeln i repot, använd inte samma nyckel för olika appar, skicka inte nyckeln via osäkra kanaler (e-post, meddelandetjänster).

Rekommenderad praxis är separering av nycklar. Använd en separat nyckel för varje app och en separat nyckel för uppladdning till Google Play (upload key). För debug-byggen skapar Android Studio en delad debug.keystore — den kan inte användas för release-byggen. Certifikatets giltighetstid bör vara 25–30 år (nuvarande standard, bekräftad av Google).

PraxisRekommendation
Förvaring av nyckelKrypterad enhet, CI/CD-hemligheter
Certifikatets längdMinst 25 år
AlgoritmRSA 2048+ eller ECDSA P-256
SepareringSeparat nyckel per app
SäkerhetskopieringOffline-kopia av keystore

Revisionsgranskning av signaturer

Kontrollera regelbundet integriteten hos signeringskedjan. När anställda som har tillgång till nycklar byts ut, uppdatera upload key via Google Play Console. Använd verktyg som Google Play Integrity API för att kontrollera att din app inte har förfalskats på användarnas enheter. API:et returnerar data om signatur och integritet och skickar dem till servern för verifiering.

Vanliga frågor

Vad är Code Signing i Android?

Code Signing — är den digitala signaturen av en APK-fil som bekräftar att appen har skapats av en specifik utvecklare och inte har ändrats efter signering. Utan signatur installeras inte APK på enheten.

Hur skapar jag en nyckel för att signera en Android-app?

Använd verktyget keytool från JDK: keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. Ange den resulterande keystore i build.gradle i blocket signingConfigs.

Vad händer om jag förlorar signeringsnyckeln?

Om nyckeln förloras och du inte använder Play App Signing, blir det omöjligt att uppdatera appen. Du måste skapa en ny app i Google Play med ett nytt paketnamn. Använd Play App Signing för att skydda dig mot nyckelförlust.

Vad är skillnaden mellan signeringsscheman v1 och v2?

v1 signerar varje fil inuti APK separat — en angripare kan ändra en fil och endast signera om den. v2 signerar hela APK fullständigt — varje ändring gör signaturen ogiltig, vilket ger en högre säkerhetsnivå.

Vad är Play App Signing?

Play App Signing — en Google Play-tjänst som centralt lagrar distributionsnyckeln för appar. Utvecklaren laddar upp APK signerad med upload key och Google signerar om den innan leverans till användarna, vilket skyddar nyckeln från förlust eller stöld.

Sammanfattning

  • Code Signing — obligatorisk digital signatur av APK som garanterar äkthet och integritet för appen.
  • Android stödjer fyra signeringsscheman: v1 (JAR), v2 (APK Signature), v3 (nyckelrotation) och v4 (streaming).
  • Keystore — skyddad behållare med nycklar, skapad via keytool med RSA 2048+-algoritm.
  • Nyckelrotation (v3, Android 9.0+) gör det möjligt att ändra signeringsnyckeln utan att ta bort appen.
  • Play App Signing hanterar centralt distributionsnycklar via Google Play Console.
  • Verifiering av signatur vid installation blockerar ersättningsattacker: certifikatmatchning misslyckas = fel INSTALL_FAILED.
  • Nyckelsäkerhet: separat nyckel per app, 25+ års giltighet, offline-kopia, inga nycklar i repot.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också