Υπογραφή εφαρμογής Android: Πώς λειτουργεί και γιατί έχει σημασία

A brass key on a smartphone showing a verified checkmark, illustrating Android app signing

Κάθε φορά που εγκαθιστάτε μια εφαρμογή στο τηλέφωνό σας Android, πραγματοποιείται ένας αθόρυβος αλλά κρίσιμος έλεγχος ασφαλείας στο παρασκήνιο. Το τηλέφωνό σας επαληθεύει το ψηφιακή υπογραφή του πακέτου APK. Αυτή η κρυπτογραφική χειραψία είναι που εμποδίζει τους κακόβουλους χάκερ να «δηλητηριάσουν» τις εφαρμογές σας με κακόβουλο λογισμικό, διασφαλίζοντας παράλληλα ότι οι προγραμματιστές μπορούν να προωθήσουν ενημερώσεις χωρίς να χάσουν την ταυτότητά τους.

Αν γράφετε εφαρμογές, η υπογραφή είναι κάτι που απλά πρέπει να κάνετε σωστά. Αν θέλετε απλώς να πειράζετε το Android, είναι ένα από τα πιο ικανοποιητικά μέρη του συστήματος για να το κατανοήσετε. Είτε έτσι είτε αλλιώς, το πώς λειτουργεί η υπογραφή εφαρμογής αξίζει τον χρόνο σας. Παρακάτω περιγράφουμε την τεχνολογία, πώς εξελίχθηκαν τα συστήματα υπογραφής και πώς μπορείτε να χειροκίνητη επαλήθευση πιστοποιητικών στο διαδίκτυο.

Τι θα μάθετε σε αυτό το άρθρο
  • Γιατί κάθε εφαρμογή Android πρέπει να είναι υπογεγραμμένη και ποια κρυπτογραφία περιλαμβάνει (RSA / EC).
  • Η διαφορά μεταξύ των σχημάτων υπογραφής v1 (JAR), v2, v3 και v4 και ποια πρέπει να χρησιμοποιεί η εφαρμογή σας σήμερα.
  • Πώς αποφασίζει το Android εάν θα επιτρέψει μια ενημέρωση με βάση τη συνέχεια της υπογραφής.
  • Πώς η εναλλαγή κλειδιού επιτρέπει σε έναν προγραμματιστή να αλλάξει το κλειδί υπογραφής χωρίς να διακόψει τις υπάρχουσες εγκαταστάσεις.
  • Πώς να επαληθεύσετε την υπογραφή οποιουδήποτε APK μόνοι σας, στη γραμμή εντολών ή με το επαληθευτής που βασίζεται σε πρόγραμμα περιήγησης.

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

Στον πυρήνα της, η υπογραφή εφαρμογής είναι μια διαδικασία όπου ένας προγραμματιστής χρησιμοποιεί ένα Ιδιωτικό κλειδί για να δημιουργήσει ένα μπλοκ υπογραφής για τα αρχεία της εφαρμογής του. Στη συνέχεια, το αντίστοιχο Δημόσιο κλειδί ενσωματώνεται στο APK μέσα στο φάκελο META-INF. Όταν το τηλέφωνό σας προσπαθεί να εγκαταστήσει την εφαρμογή, χρησιμοποιεί το δημόσιο κλειδί για να ελέγξει εάν η υπογραφή ταιριάζει με το περιεχόμενο του αρχείου.

Αυτό παρέχει δύο κύριες ιδιότητες:

  1. Αμετάβλητο: Εάν αλλάξει ένα μόνο byte του κώδικα της εφαρμογής (π.χ. από έναν Trojan), η υπογραφή δεν θα ταιριάζει πλέον με το αρχείο και το Android θα αρνηθεί να το εγκαταστήσει.
  2. Απόδειξη Ταυτότητας: Εάν μια εφαρμογή προσπαθήσει να ενημερώσει μια υπάρχουσα, οι υπογραφές της πρέπει να ταιριάζουν. Αυτός είναι ο λόγος που δεν μπορείτε να εγκαταστήσετε μια παραποιημένη εφαρμογή Facebook πάνω από την επίσημη.

Εξέλιξη Σχεδίων Υπογραφής

Η Google αναβαθμίζει συνεχώς τον μηχανισμό υπογραφής για να βελτιώσει τόσο την ταχύτητα όσο και την ασφάλεια:

Γιατί τα πιστοποιητικά έχουν σημασία για πλευρική φόρτωση

Όταν κάνετε λήψη ενός APK από μια ανεπίσημη πηγή, το Κατακερματισμός πιστοποιητικού είναι ο καλύτερος φίλος σας. Ένα δακτυλικό αποτύπωμα πιστοποιητικού (όπως ένας κατακερματισμός SHA-256) προσδιορίζει μοναδικά το κλειδί υπογραφής του προγραμματιστή. Κάθε εφαρμογή διατηρεί το ίδιο κλειδί υπογραφής σε όλες τις ενημερώσεις της, ώστε να μπορείτε να συγκρίνετε το δακτυλικό αποτύπωμα ενός APK με τη δημοσιευμένη τιμή του προγραμματιστή για να επιβεβαιώσετε ότι είναι γνήσιο.

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

Πώς το Android επαληθεύει μια υπογραφή κατά την ώρα εγκατάστασης

Το βήμα "επαλήθευση του πιστοποιητικού" είναι τόσο συχνά λανθασμένο που αξίζει να δούμε τι κάνει στην πραγματικότητα το λειτουργικό σύστημα όταν πατάτε ένα APK και το Android αποφασίζει εάν θα το εγκαταστήσει:

  1. Ανοίξτε το APK ως ZIP και εντοπίστε το μπλοκ υπογραφής. Για υπογραφές v2/v3 που είναι ένα δομημένο μπλοκ αμέσως πριν από τον κεντρικό κατάλογο. για το σχήμα v1 παλαιού τύπου είναι τα περιεχόμενα των META-INF/*.RSA, *.DSA ή *.EC.
  2. Υπολογίστε τις αναλύσεις SHA-256 για κάθε άλλο byte του APK. Το μπλοκ υπογραφής εξαιρείται από τη δική του σύνοψη. όλα τα άλλα κατακερματίζονται σε καθορισμένα κομμάτια.
  3. Επαληθεύστε τη σύνοψη κάθε κομματιού σε σχέση με τις αναλύσεις που καταγράφονται στο μπλοκ υπογραφής. Εάν έχει τροποποιηθεί έστω και ένα byte από τότε που ο προγραμματιστής υπέγραψε το αρχείο, οι ανακεφαλαιώσεις δεν θα ταιριάζουν και η εγκατάσταση απορρίπτεται με ένα γενικό σφάλμα "Η εφαρμογή δεν έχει εγκατασταθεί".
  4. Βεβαιωθείτε ότι το ίδιο το μπλοκ υπογραφής δημιουργήθηκε με το ιδιωτικό κλειδί του πιστοποιητικού. Το δημόσιο κλειδί του πιστοποιητικού χρησιμοποιείται για τον έλεγχο της κρυπτογραφικής υπογραφής στο μπλοκ. Ένας επιτυχημένος έλεγχος σημαίνει ότι όποιος υπέγραψε το αρχείο διέθετε το ιδιωτικό κλειδί που έχει συζευχθεί με αυτό το πιστοποιητικό.
  5. Συγκρίνετε το δακτυλικό αποτύπωμα πιστοποιητικού με οποιαδήποτε υπάρχουσα εγκατάσταση με το ίδιο όνομα πακέτου. Εάν το πακέτο είναι ήδη εγκατεστημένο και το νέο APK έχει υπογραφεί με διαφορετικό πιστοποιητικό, η εγκατάσταση απορρίπτεται με το INSTALL_FAILED_UPDATE_INCOMPATIBLE. Αυτή είναι η κύρια άμυνα του λειτουργικού συστήματος κατά της πλαστοπροσωπίας: ένας κακόβουλος παράγοντας δεν μπορεί να αντικαταστήσει την εφαρμογή της τράπεζάς σας με το δικό του αντίγραφο, εκτός εάν κλέψει επίσης το κλειδί υπογραφής της τράπεζας.

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

Τι σημαίνει πραγματικά "Αντιστοιχία υπογραφών".

Η πιο συνηθισμένη έκπληξη που πλήττουν οι άνθρωποι κατά την πλευρική φόρτωση είναι το σφάλμα "αναντιστοιχία υπογραφής" κατά την ενημέρωση. Εδώ είναι τι συμβαίνει στην πραγματικότητα:

Αυτό συμβαίνει στην πράξη με δύο τρόπους:

  1. Το APK τρίτου μέρους είναι το πραγματικά από διαφορετικό εκδότη, για παράδειγμα ένα "τροποποιημένο" ή "patched" αντίγραφο. Η άρνηση της εγκατάστασης είναι η σωστή συμπεριφορά. Η εγκατάστασή του θα σήμαινε ότι εμπιστεύεστε έναν ξένο με τα ίδια δεδομένα που έχει ήδη αγγίξει η εφαρμογή της τράπεζάς σας.
  2. Το APK τρίτου μέρους είναι το μια εκ νέου μεταφόρτωση του επίσημου APK, αλλά το σύστημα Play App Signing της Google υπογράφει τη λήψη κάθε χρήστη με το περιτύλιγμα κλειδί μεταφόρτωσης του χρήστη. Δύο συσκευές μπορούν μερικές φορές να δουν ελαφρώς διαφορετικά δεδομένα υπογραφής για την ίδια εννοιολογική έκδοση εφαρμογής. Σε αυτήν την περίπτωση, το δακτυλικό αποτύπωμα πιστοποιητικού στη ρίζα εξακολουθεί να ταιριάζει. μπορείτε να επαληθεύσετε με το Επαληθευτής APK μας.

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

Δημιουργία του δικού σας κλειδιού υπογραφής (για προγραμματιστές)

Εάν δημιουργείτε εφαρμογές Android, θα χρειαστεί τελικά να υπογράψετε τις δικές σας εκδόσεις. Η τυπική εντολή μιας γραμμής που χρησιμοποιεί το keytool από ένα Java SDK είναι:

keytool -genkeypair -v \
        -keystore my-release.keystore \
        -alias my-app -keyalg RSA -keysize 2048 \
        -validity 10000

Δύο πράγματα που πρέπει να γνωρίζετε:

Για δοκιμαστικές εκδόσεις με πλευρική φόρτωση, μια ανυπόγραφη αποθήκευση κλειδιών εντοπισμού σφαλμάτων είναι μια χαρά. για παραγωγή, χρησιμοποιήστε έναν χώρο αποθήκευσης κλειδιών μακράς ισχύος που προστατεύεται με κωδικό πρόσβασης και είναι αποθηκευμένος σε αντίγραφο ασφαλείας εκτός σύνδεσης.

Επαληθεύστε την ταυτότητα της εφαρμογής σαν επαγγελματίας

Μην εμπιστεύεστε τα γενικά ονόματα αρχείων. Ελέγξτε την κρυπτογραφική καρδιά των APK σας σε δευτερόλεπτα.

Επαληθεύστε τα πιστοποιητικά τώρα

Κοινές παγίδες υπογραφής

  1. Αυτουπογεγραμμένα Πιστοποιητικά: Οι περισσότερες εφαρμογές Android είναι αυτο-υπογεγραμμένες. Σε αντίθεση με το SSL για ιστότοπους, δεν υπάρχει κεντρική αρχή για την υπογραφή εφαρμογών Android. Πρέπει να εμπιστευτείτε άμεσα τον προγραμματιστή.
  2. Οι εφαρμογές Πιστοποιητικά εντοπισμού σφαλμάτων: που έχουν δημιουργηθεί για δοκιμή χρησιμοποιούν ένα γενικό κλειδί "debug". Αυτές οι εφαρμογές δεν πρέπει ποτέ να κυκλοφορούν στο κοινό και αποκλείονται από πολλά φίλτρα ασφαλείας.
  3. Απώλεια κλειδιού: Εάν ένας προγραμματιστής χάσει το χώρο αποθήκευσης ιδιωτικών κλειδιών, μπορεί να ενημερώσει ξανά την εφαρμογή του ποτέ. Θα έπρεπε να κυκλοφορήσουν μια "Νέα" εφαρμογή με διαφορετικό όνομα πακέτου.

Επιλογή του σωστού σχήματος υπογραφής για το SDK-στόχο σας

Η αθόρυβη υπογραφή εφαρμογών υποστηρίζει μεγάλο μέρος της ασφάλειας του Android. Μόλις κάνει κλικ η σχέση ιδιωτικού/δημόσιου κλειδιού, μπορείτε να κρίνετε μια πλευρική εφαρμογή βάσει των πλεονεκτημάτων της και να επιβεβαιώσετε ότι αυτό που εγκαθιστάτε δεν έχει αλλάξει από τότε που την υπέγραψε ο προγραμματιστής. Για περισσότερα σχετικά με τα εσωτερικά Android, ανατρέξτε στο οδηγός για τη μορφή XAPK.

Κατασκευάστηκε και τεκμηριώθηκε από τον Mst Shaefale Κύριος προγραμματιστής και αρχιτέκτονας πακέτων Android • Επαληθεύτηκε σε Android 12–15

Το Mst Shaefale διατηρεί τη συγχώνευση XAPK/APKS από την πλευρά του πελάτη, τον αναλυτή δυαδικού μανιφέστου και τα εργαλεία υπογραφής APK v1+v2 στο xapktoapk.com. Εντοπίζετε μια παρωχημένη εντολή ή αλλαγή λειτουργικού συστήματος; Στείλτε ένα συντακτικό σημείωμα.