Code Signing — τι είναι, υπογραφή κώδικα και πώς λειτουργεί

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-16 Χρόνος ανάγνωσης: 9 λεπ

Code Signing (υπογραφή κώδικα) — ένας μηχανισμός ψηφιακής υπογραφής εκτελέσιμων αρχείων που εγγυάται την αυθεντικότητα του προγραμματιστή και την ακεραιότητα της εφαρμογής. Στο Android, κάθε APK αρχείο υπογράφεται υποχρεωτικά με πιστοποιητικό πριν από την εγκατάσταση στη συσκευή ή τη δημοσίευση στο Google Play. Σύμφωνα με τα δεδομένα της Google, 2024, το Android υποστηρίζει τέσσερις γενιές σχημάτων υπογραφής: από το v1 που βασίζεται σε JAR έως το v4 για ροϊκή εγκατάσταση.

Βασικά σημεία

  • Code Signing — ψηφιακή υπογραφή κώδικα που πιστοποιεί την ταυτότητα και την ακεραιότητα της εφαρμογής.
  • Στο Android, η υπογραφή γίνεται μέσω keystore — ενός αποθετηρίου κλειδιών και πιστοποιητικών.
  • Το σχήμα v2 (APK Signature Scheme) — το βασικό πρότυπο από Android 7.0, που προστατεύει όλα τα byte του APK.
  • Η εναλλαγή κλειδιών (v3, Android 9.0+) επιτρέπει την αλλαγή του κλειδιού υπογραφής χωρίς διαγραφή της εφαρμογής.
  • Το Google Play χρησιμοποιεί το Play App Signing για κεντρική διαχείριση κλειδιών.

Τι είναι το Code Signing;

Code Signing — μια κρυπτογραφική διαδικασία κατά την οποία ο προγραμματιστής υπογράφει τον εκτελέσιμο κώδικα με το ψηφιακό του πιστοποιητικό. Η υπογραφή δημιουργείται με χρήση ασύμμετρης κρυπτογράφησης: το ιδιωτικό κλειδί του προγραμματιστή παράγει μια ψηφιακή υπογραφή, ενώ το δημόσιο κλειδί ενσωματώνεται στο πιστοποιητικό. Ο καθένας μπορεί να επαληθεύσει την υπογραφή χρησιμοποιώντας το δημόσιο κλειδί, αλλά είναι αδύνατο να αλλάξει ο κώδικας χωρίς να παραβιαστεί η υπογραφή.

Στην ανάπτυξη εφαρμογών, η υπογραφή κώδικα επιτελεί τρεις λειτουργίες. Πρώτη — πιστοποίηση ταυτότητας: ο χρήστης και η πλατφόρμα μπορούν να αναγνωρίσουν τον προγραμματιστή της εφαρμογής. Δεύτερη — ακεραιότητα: οποιαδήποτε αλλαγή στο APK μετά την υπογραφή καθιστά την υπογραφή άκυρη. Τρίτη — αξιόπιστη ενημέρωση: η πλατφόρμα επιτρέπει την ενημέρωση της εφαρμογής μόνο με APK που υπογράφονται από το ίδιο πιστοποιητικό με την εγκατεστημένη έκδοση.

Νομικό καθεστώς

Η ψηφιακή υπογραφή εφαρμογών Android έχει νομική σημασία. Σύμφωνα με τη ρωσική νομοθεσία (63-Ομοσπονδιακός Νόμος) και το ευρωπαϊκό eIDAS, η ειδική ηλεκτρονική υπογραφή εξισώνεται με την ιδιόχειρη. Ωστόσο, η υπογραφή APK με αυτο-υπογεγραμμένο πιστοποιητικό (συνήθης πρακτική στο Android) δεν είναι ειδική — επιβεβαιώνει την ακεραιότητα, αλλά όχι την ταυτότητα του προγραμματιστή από νομική άποψη.

Σχήματα υπογραφής Android: v1, v2, v3, v4

Το Android υποστηρίζει τέσσερα σχήματα υπογραφής APK, καθένα από τα οποία επιλύει προβλήματα της προηγούμενης έκδοσης και προσθέτει νέες δυνατότητες. Όλα τα σχήματα μπορούν να συνυπάρχουν στο ίδιο APK — αυτό είναι απαραίτητο για συμβατότητα με παλαιότερες εκδόσεις Android.

Το σχήμα v1 (JAR signing) εμφανίστηκε στο Android 1.0. Υπογράφει μεμονωμένα αρχεία μέσα στο APK αρχείο χρησιμοποιώντας εγγραφές στο META-INF/MANIFEST.MF. Μειονέκτημα: μπορεί κανείς να τροποποιήσει το APK (να προσθέσει ή να αφαιρέσει αρχεία) και να υπογράψει ξανά μόνο τα τροποποιημένα, χωρίς να αγγίξει την υπογραφή των υπολοίπων. Αυτό καθιστά το v1 ευάλωτο σε ορισμένες επιθέσεις. Το σχήμα v2 (APK Signature Scheme), που εισήχθη στο Android 7.0, υπογράφει ολόκληρο το APK αρχείο, συμπεριλαμβανομένων όλων των byte εκτός από την ίδια την υπογραφή, αποκλείοντας τη δυνατότητα επιλεκτικής τροποποίησης.

ΣχήμαAndroidΧαρακτηριστικόΕναλλαγή κλειδιού
v1 (JAR)1.0+Υπογραφή κάθε αρχείουΌχι
v27.0+Υπογραφή ολόκληρου APKΌχι
v39.0+Υπογραφή + εναλλαγήΝαι
v411.0+Ροϊκή + ADBΝαι

v3: εναλλαγή κλειδιών υπογραφής

Το σχήμα v3, που παρουσιάστηκε στο Android 9.0, επιλύει ένα μακροχρόνιο πρόβλημα: τι συμβαίνει εάν το κλειδί υπογραφής παραβιαστεί ή λήξει; Παλαιότερα, η αλλαγή του κλειδιού υπογραφής σήμαινε ότι η εφαρμογή θεωρείται νέα — δεν μπορεί να εγκατασταθεί πάνω από την υπάρχουσα. Το v3 προσθέτει έναν μηχανισμό εναλλαγής: στο APK μπορεί να συμπεριληφθεί μια απόδειξη αλλαγής κλειδιού (proof-of-rotation), υπογεγραμμένη από το παλιό κλειδί. Το σύστημα ελέγχει την αλυσίδα και επιτρέπει την ενημέρωση της εφαρμογής με το νέο κλειδί.

Keystore και πιστοποιητικά

Το Keystore — ένα ασφαλές δοχείο που περιέχει ιδιωτικά κλειδιά και πιστοποιητικά για την υπογραφή εφαρμογών. Στην ανάπτυξη Android χρησιμοποιείται η μορφή JKS (Java KeyStore) ή PKCS12. Το keystore δημιουργείται με το εργαλείο keytool, που αποτελεί μέρος του JDK. Κάθε κλειδί στο αποθετήριο αναγνωρίζεται με ένα ψευδώνυμο (alias) και προστατεύεται με κωδικό.

Το πιστοποιητικό στο keystore περιέχει το δημόσιο κλειδί και πληροφορίες για τον κάτοχο: όνομα οργανισμού, χώρα, περίοδο ισχύος. Για εφαρμογές Android, το πιστοποιητικό μπορεί να είναι αυτο-υπογεγραμμένο — η Google δεν απαιτεί προσφυγή σε αρχή πιστοποίησης (CA), κάτι που διαφοροποιεί το Android από το iOS. Ωστόσο, η περίοδος ισχύος του πιστοποιητικού πρέπει να είναι τουλάχιστον 25 έτη, καθώς η εφαρμογή θα ενημερώνεται με το ίδιο κλειδί.

bash
# Δημιουργία νέου keystore για υπογραφή
keytool -genkey -v -keystore my-release.keystore \
        -alias my-app-alias \
        -keyalg RSA \
        -keysize 2048 \
        -validity 10000

# Προβολή περιεχομένου keystore
keytool -list -v -keystore my-release.keystore

Μορφές κλειδιών

Το Android υποστηρίζει δύο αλγόριθμους για κλειδιά υπογραφής: RSA και ECDSA. RSA με μέγεθος κλειδιού 2048 bit — το de facto πρότυπο, υποστηριζόμενο από όλες τις εκδόσεις Android. ECDSA (Elliptic Curve Digital Signature Algorithm) με καμπύλη P-256 παρέχει την ίδια κρυπτογραφική αντοχή με μικρότερο μέγεθος κλειδιού. Από το Android 9.0 συνιστάται η χρήση ECDSA, καθώς είναι ταχύτερο στην επαλήθευση σε κινητές συσκευές.

Ρύθμιση υπογραφής στη δημιουργία

Στο Android Gradle Plugin, η υπογραφή ρυθμίζεται μέσω του μπλοκ signingConfigs στο build.gradle του επιπέδου ενότητας. Για debug εκδόσεις, το Android Studio δημιουργεί αυτόματα ένα debug keystore με γνωστούς κωδικούς. Για release εκδόσεις, ο προγραμματιστής καθορίζει τη διαδρομή προς το keystore του, το ψευδώνυμο κλειδιού και τους κωδικούς. Συνιστάται η αποθήκευση κωδικών σε ξεχωριστά αρχεία ρυθμίσεων, εξαιρούμενα από το σύστημα ελέγχου εκδόσεων.

Η σύγχρονη πρακτική είναι η κεντρική διαχείριση υπογραφής μέσω CI/CD. Οι Jenkins, GitLab CI ή GitHub Actions μπορούν να αποθηκεύουν το keystore ως προστατευμένο τεχνούργημα και τους κωδικούς ως μυστικά περιβάλλοντος. Αυτό αποτρέπει διαρροή κλειδιών μέσω του αποθετηρίου και απλοποιεί την αλλαγή κλειδιού όταν χρειαστεί.

groovy
// build.gradle (app-level) — διαμόρφωση υπογραφής
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
        }
    }
}

Υπογραφή πολλαπλών σχημάτων

Για μέγιστη συμβατότητα, το APK πρέπει να υπογράφεται και με τα τρία σχήματα (v1 + v2 + v3). Το Android Gradle Plugin από προεπιλογή περιλαμβάνει όλα τα σχήματα. APK που έχει υπογραφεί μόνο με v2 δεν θα εγκατασταθεί σε Android 6.0 και κάτω. APK μόνο με v1 δεν θα έχει το πλεονέκτημα ακεραιότητας του v2 σε Android 7.0+. Η συμπερίληψη όλων των σχημάτων δεν αυξάνει το μέγεθος του APK περισσότερο από 1–2% και εξασφαλίζει συμβατότητα με οποιαδήποτε συσκευή.

Play App Signing και διαχείριση κλειδιών

Το Play App Signing — μια υπηρεσία του Google Play που διαχειρίζεται κεντρικά τα κλειδιά υπογραφής εφαρμογών. Ο προγραμματιστής ανεβάζει στο Google Play Console το APK υπογεγραμμένο με το κλειδί φόρτωσης (upload key), και το Google Play το υπογράφει ξανά με το κλειδί διανομής (distribution key) πριν την παράδοση στους χρήστες. Αυτό προστατεύει το κλειδί διανομής από απώλεια ή παραβίαση.

Πλεονεκτήματα του Play App Signing: ασφάλεια — το κλειδί διανομής αποθηκεύεται σε ασφαλές αποθετήριο της Google; εναλλαγή — μπορείτε να ζητήσετε αλλαγή κλειδιού μέσω της κονσόλας; ανάκτηση — σε περίπτωση απώλειας του κλειδιού φόρτωσης, μπορείτε να δημιουργήσετε ένα νέο. Μειονέκτημα: για εφαρμογές που υπήρχαν πριν από την εισαγωγή του Play App Signing, η μετάβαση απαιτεί δημιουργία νέας εφαρμογής, καθώς το παλιό κλειδί διανομής χρησιμοποιείται ήδη.

bash
# Λήψη αποτυπώματος πιστοποιητικού (SHA-256)
keytool -list -v -keystore my-release.keystore \
        -alias my-app-alias | grep "SHA256"

# Επαλήθευση υπογραφής APK μέσω apksigner
apksigner verify --verbose app-release.apk

Ανάκτηση κλειδιού

Εάν το κλειδί υπογραφής χαθεί και το Play App Signing δεν χρησιμοποιείται, η ανάκτηση της δυνατότητας ενημέρωσης της εφαρμογής είναι αδύνατη — θα πρέπει να δημιουργηθεί νέα εφαρμογή με νέο όνομα πακέτου. Αυτός είναι ένας από τους κύριους λόγους χρήσης του Play App Signing. Η Google συνιστά την αποθήκευση αντιγράφου ασφαλείας του keystore σε ασφαλές offline αποθετήριο (κρυπτογραφημένο USB μέσο, τραπεζική θυρίδα).

Επαλήθευση υπογραφής στη συσκευή

Κατά την εγκατάσταση ενός APK, το Android εκτελεί επαλήθευση υπογραφής σε διάφορα στάδια. Πρώτο — έλεγχος πιστοποιητικού: αν η περίοδος ισχύος έχει λήξει, αν η μορφή είναι σωστή. Δεύτερο — έλεγχος υπογραφής: αν η κρυπτογραφική υπογραφή ταιριάζει με το περιεχόμενο του APK. Τρίτο — σύγκριση πιστοποιητικού με την εγκατεστημένη έκδοση: αν η εφαρμογή υπάρχει ήδη στη συσκευή, το πιστοποιητικό πρέπει να ταιριάζει, διαφορετικά η εγκατάσταση αποκλείεται.

Το σύστημα επαλήθευσης είναι ενσωματωμένο στο PackageManagerService. Κατά την επεξεργασία ενός αιτήματος εγκατάστασης, το PMS εξάγει την υπογραφή από το APK, την ελέγχει με την κλάση android.util.PackageParser και τη συγκρίνει με την αποθηκευμένη υπογραφή της εγκατεστημένης εφαρμογής (εάν υπάρχει). Σε περίπτωση αναντιστοιχίας, ο χρήστης λαμβάνει σφάλμα "INSTALL_FAILED_UPDATE_INCOMPATIBLE". Αυτός ο μηχανισμός αποτρέπει επιθέσεις υποκατάστασης (κακόβουλο λογισμικό δεν μπορεί να ενημερώσει μια νόμιμη εφαρμογή με τη δική του έκδοση).

Έλεγχος από προγραμματιστή

Ο προγραμματιστής μπορεί να ελέγξει ανεξάρτητα την υπογραφή APK με το εργαλείο apksigner από το Android SDK Build Tools. Η εντολή apksigner verify --verbose app.apk δείχνει με ποια σχήματα υπογράφεται το APK, αν τα πιστοποιητικά είναι έγκυρα και αν οι υπογραφές ταιριάζουν με το περιεχόμενο. Για προγραμματιστικό έλεγχο υπογραφής εγκατεστημένης εφαρμογής χρησιμοποιείται το PackageManager.getPackageInfo() με τη σημαία GET_SIGNATURES.

kotlin
// Προγραμματιστική επαλήθευση υπογραφής εγκατεστημένης εφαρμογής
fun getAppSignature(context: Context, packageName: String): String? {
    val pm = context.packageManager
    val info = pm.getPackageInfo(
        packageName,
        PackageManager.GET_SIGNATURES
    )
    return info.signatures?.firstOrNull()?.toCharsString()
}

Βέλτιστες πρακτικές ασφάλειας υπογραφής

Η ασφάλεια του κλειδιού υπογραφής είναι μια κρίσιμη πτυχή της ανάπτυξης Android. Η παραβίαση του κλειδιού επιτρέπει σε έναν εισβολέα να υπογράφει ενημερώσεις της εφαρμογής σας με τον δικό του κώδικα. Βασικοί κανόνες: ποτέ μην αποθηκεύετε το κλειδί στο αποθετήριο, μην χρησιμοποιείτε το ίδιο κλειδί για διαφορετικές εφαρμογές, μην μεταδίδετε το κλειδί μέσω μη ασφαλών καναλιών (email, άμεσα μηνύματα).

Η συνιστώμενη πρακτική είναι ο διαχωρισμός κλειδιών. Χρησιμοποιήστε ξεχωριστό κλειδί για κάθε εφαρμογή και ξεχωριστό κλειδί για φόρτωση στο Google Play (upload key). Για debug εκδόσεις, το Android Studio δημιουργεί ένα κοινό debug.keystore — δεν πρέπει να χρησιμοποιείται για release εκδόσεις. Η περίοδος ισχύος του πιστοποιητικού πρέπει να είναι 25–30 έτη (ισχύον πρότυπο, επιβεβαιωμένο από την Google).

ΠρακτικήΣύσταση
Αποθήκευση κλειδιούΚρυπτογραφημένο μέσο, CI/CD secrets
Ισχύς πιστοποιητικούΤουλάχιστον 25 έτη
ΑλγόριθμοςRSA 2048+ ή ECDSA P-256
ΔιαχωρισμόςΞεχωριστό κλειδί ανά εφαρμογή
Αντίγραφο ασφαλείαςOffline αντίγραφο keystore

Έλεγχος υπογραφών

Ελέγχετε τακτικά την ακεραιότητα της αλυσίδας υπογραφής. Κατά την αλλαγή προσωπικού που έχει πρόσβαση στα κλειδιά, ενημερώστε το upload key μέσω του Google Play Console. Χρησιμοποιήστε εργαλεία όπως το Google Play Integrity API για να ελέγξετε ότι η εφαρμογή σας δεν έχει παραποιηθεί στις συσκευές των χρηστών. Το API επιστρέφει δεδομένα υπογραφής, ακεραιότητας και τα αποστέλλει στον διακομιστή για επαλήθευση.

Συχνές Ερωτήσεις

Τι είναι το Code Signing στο Android;

Code Signing — είναι η ψηφιακή υπογραφή του APK αρχείου που επιβεβαιώνει ότι η εφαρμογή δημιουργήθηκε από συγκεκριμένο προγραμματιστή και δεν έχει τροποποιηθεί μετά την υπογραφή. Χωρίς υπογραφή, το APK δεν θα εγκατασταθεί στη συσκευή.

Πώς να δημιουργήσω ένα κλειδί υπογραφής εφαρμογής Android;

Χρησιμοποιήστε το εργαλείο keytool από το JDK: keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. Το keystore που θα προκύψει το καθορίζετε στο build.gradle στο μπλοκ signingConfigs.

Τι θα συμβεί αν χάσω το κλειδί υπογραφής;

Εάν το κλειδί χαθεί και δεν χρησιμοποιείτε το Play App Signing, η ενημέρωση της εφαρμογής θα καταστεί αδύνατη. Θα πρέπει να δημιουργήσετε μια νέα εφαρμογή στο Google Play με νέο package name. Χρησιμοποιήστε το Play App Signing για προστασία από απώλεια κλειδιού.

Ποια είναι η διαφορά μεταξύ των σχημάτων υπογραφής v1 και v2;

Το v1 υπογράφει κάθε αρχείο μέσα στο APK ξεχωριστά — ένας εισβολέας μπορεί να τροποποιήσει ένα αρχείο και να το υπογράψει ξανά μόνο αυτό. Το v2 υπογράφει ολόκληρο το APK — οποιαδήποτε αλλαγή καθιστά την υπογραφή άκυρη, παρέχοντας υψηλότερο επίπεδο ασφάλειας.

Τι είναι το Play App Signing;

Play App Signing — μια υπηρεσία του Google Play που αποθηκεύει κεντρικά το κλειδί διανομής εφαρμογών. Ο προγραμματιστής ανεβάζει APK υπογεγραμμένο με upload key, και η Google το υπογράφει ξανά πριν από την παράδοση στους χρήστες, προστατεύοντας το κλειδί από απώλεια ή κλοπή.

Συμπεράσματα

  • Code Signing — υποχρεωτική ψηφιακή υπογραφή APK που εγγυάται την αυθεντικότητα και ακεραιότητα της εφαρμογής.
  • Το Android υποστηρίζει τέσσερα σχήματα υπογραφής: v1 (JAR), v2 (APK Signature), v3 (εναλλαγή κλειδιών) και v4 (ροϊκή).
  • Keystore — ασφαλές δοχείο με κλειδιά, που δημιουργείται μέσω keytool με αλγόριθμο RSA 2048+.
  • Η εναλλαγή κλειδιών (v3, Android 9.0+) επιτρέπει την αλλαγή κλειδιού υπογραφής χωρίς διαγραφή της εφαρμογής.
  • Το Play App Signing διαχειρίζεται κεντρικά τα κλειδιά διανομής μέσω του Google Play Console.
  • Η επαλήθευση υπογραφής κατά την εγκατάσταση αποκλείει επιθέσεις υποκατάστασης: αναντιστοιχία πιστοποιητικού = σφάλμα INSTALL_FAILED.
  • Ασφάλεια κλειδιού: ξεχωριστό κλειδί ανά εφαρμογή, ισχύς 25+ έτη, offline αντίγραφο, καθόλου κλειδιά στο αποθετήριο.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης