Υπογραφή εφαρμογής Android: Πώς λειτουργεί και γιατί έχει σημασία
Κάθε φορά που εγκαθιστάτε μια εφαρμογή στο τηλέφωνό σας Android, πραγματοποιείται ένας αθόρυβος αλλά κρίσιμος έλεγχος ασφαλείας στο παρασκήνιο. Το τηλέφωνό σας επαληθεύει το ψηφιακή υπογραφή του πακέτου APK. Αυτή η κρυπτογραφική χειραψία είναι που εμποδίζει τους κακόβουλους χάκερ να «δηλητηριάσουν» τις εφαρμογές σας με κακόβουλο λογισμικό, διασφαλίζοντας παράλληλα ότι οι προγραμματιστές μπορούν να προωθήσουν ενημερώσεις χωρίς να χάσουν την ταυτότητά τους.
Αν γράφετε εφαρμογές, η υπογραφή είναι κάτι που απλά πρέπει να κάνετε σωστά. Αν θέλετε απλώς να πειράζετε το Android, είναι ένα από τα πιο ικανοποιητικά μέρη του συστήματος για να το κατανοήσετε. Είτε έτσι είτε αλλιώς, το πώς λειτουργεί η υπογραφή εφαρμογής αξίζει τον χρόνο σας. Παρακάτω περιγράφουμε την τεχνολογία, πώς εξελίχθηκαν τα συστήματα υπογραφής και πώς μπορείτε να χειροκίνητη επαλήθευση πιστοποιητικών στο διαδίκτυο.
- Γιατί κάθε εφαρμογή Android πρέπει να είναι υπογεγραμμένη και ποια κρυπτογραφία περιλαμβάνει (RSA / EC).
- Η διαφορά μεταξύ των σχημάτων υπογραφής v1 (JAR), v2, v3 και v4 και ποια πρέπει να χρησιμοποιεί η εφαρμογή σας σήμερα.
- Πώς αποφασίζει το Android εάν θα επιτρέψει μια ενημέρωση με βάση τη συνέχεια της υπογραφής.
- Πώς η εναλλαγή κλειδιού επιτρέπει σε έναν προγραμματιστή να αλλάξει το κλειδί υπογραφής χωρίς να διακόψει τις υπάρχουσες εγκαταστάσεις.
- Πώς να επαληθεύσετε την υπογραφή οποιουδήποτε APK μόνοι σας, στη γραμμή εντολών ή με το επαληθευτής που βασίζεται σε πρόγραμμα περιήγησης.
Τι είναι το App Signing;
Στον πυρήνα της, η υπογραφή εφαρμογής είναι μια διαδικασία όπου ένας προγραμματιστής χρησιμοποιεί ένα Ιδιωτικό κλειδί για να δημιουργήσει ένα μπλοκ υπογραφής για τα αρχεία της εφαρμογής του. Στη συνέχεια, το αντίστοιχο Δημόσιο κλειδί ενσωματώνεται στο APK μέσα στο φάκελο META-INF. Όταν το τηλέφωνό σας προσπαθεί να εγκαταστήσει την εφαρμογή, χρησιμοποιεί το δημόσιο κλειδί για να ελέγξει εάν η υπογραφή ταιριάζει με το περιεχόμενο του αρχείου.
Αυτό παρέχει δύο κύριες ιδιότητες:
- Αμετάβλητο: Εάν αλλάξει ένα μόνο byte του κώδικα της εφαρμογής (π.χ. από έναν Trojan), η υπογραφή δεν θα ταιριάζει πλέον με το αρχείο και το Android θα αρνηθεί να το εγκαταστήσει.
- Απόδειξη Ταυτότητας: Εάν μια εφαρμογή προσπαθήσει να ενημερώσει μια υπάρχουσα, οι υπογραφές της πρέπει να ταιριάζουν. Αυτός είναι ο λόγος που δεν μπορείτε να εγκαταστήσετε μια παραποιημένη εφαρμογή Facebook πάνω από την επίσημη.
Εξέλιξη Σχεδίων Υπογραφής
Η Google αναβαθμίζει συνεχώς τον μηχανισμό υπογραφής για να βελτιώσει τόσο την ταχύτητα όσο και την ασφάλεια:
- V1 (Υπογραφή βάζου): Υπογράφει μεμονωμένα αρχεία εντός του APK (ZIP). Αυτό είναι αργό επειδή το λειτουργικό σύστημα πρέπει να αποσυμπιέσει και να ελέγξει κάθε αρχείο. Είναι επίσης ευάλωτο σε συγκεκριμένους χειρισμούς ZIP.
- V2 (Σχήμα υπογραφών APK): Υπογράφει ολόκληρο το δυαδικό μπλοκ του APK. Δεν απαιτεί αποσυμπίεση για επαλήθευση, καθιστώντας το απίστευτα γρήγορο. Παρουσιάστηκε στο Android 7.0 (Nougat).
- Το V3 (Περιστροφή κλειδιού): Επεκτείνει το V2 προσθέτοντας μια "γραμμή" πλήκτρων. Επιτρέπει σε έναν προγραμματιστή να αποδείξει ότι ένα νέο κλειδί είναι ο εξουσιοδοτημένος διάδοχος ενός παλαιότερου. Παρουσιάστηκε στο Android 9.0 (Pie).
- V4 (Υπογραφή ροής): Σχεδιασμένο ειδικά για σταδιακές εγκαταστάσεις, επιτρέποντας την επαλήθευση των εφαρμογών ενώ συνεχίζεται η λήψη τους μέσω USB ή Wi-Fi.
Γιατί τα πιστοποιητικά έχουν σημασία για πλευρική φόρτωση
Όταν κάνετε λήψη ενός APK από μια ανεπίσημη πηγή, το Κατακερματισμός πιστοποιητικού είναι ο καλύτερος φίλος σας. Ένα δακτυλικό αποτύπωμα πιστοποιητικού (όπως ένας κατακερματισμός SHA-256) προσδιορίζει μοναδικά το κλειδί υπογραφής του προγραμματιστή. Κάθε εφαρμογή διατηρεί το ίδιο κλειδί υπογραφής σε όλες τις ενημερώσεις της, ώστε να μπορείτε να συγκρίνετε το δακτυλικό αποτύπωμα ενός APK με τη δημοσιευμένη τιμή του προγραμματιστή για να επιβεβαιώσετε ότι είναι γνήσιο.
Εάν υποπτεύεστε ότι ένα APK είναι ψεύτικο, θα πρέπει να το εκτελέσετε μέσω του Διαδικτυακός Επαληθευτής APK. Το εργαλείο μας θα σας δείξει:
- Το Κοινή ονομασία (CN) του υπογράφοντος (π.χ. "Android").
- Το Περίοδος Ισχύος του πιστοποιητικού.
- Το Δακτυλικά αποτυπώματα SHA-1/SHA-256.
Πώς το Android επαληθεύει μια υπογραφή κατά την ώρα εγκατάστασης
Το βήμα "επαλήθευση του πιστοποιητικού" είναι τόσο συχνά λανθασμένο που αξίζει να δούμε τι κάνει στην πραγματικότητα το λειτουργικό σύστημα όταν πατάτε ένα APK και το Android αποφασίζει εάν θα το εγκαταστήσει:
- Ανοίξτε το APK ως ZIP και εντοπίστε το μπλοκ υπογραφής. Για υπογραφές v2/v3 που είναι ένα δομημένο μπλοκ αμέσως πριν από τον κεντρικό κατάλογο. για το σχήμα v1 παλαιού τύπου είναι τα περιεχόμενα των META-INF/*.RSA, *.DSA ή *.EC.
- Υπολογίστε τις αναλύσεις SHA-256 για κάθε άλλο byte του APK. Το μπλοκ υπογραφής εξαιρείται από τη δική του σύνοψη. όλα τα άλλα κατακερματίζονται σε καθορισμένα κομμάτια.
- Επαληθεύστε τη σύνοψη κάθε κομματιού σε σχέση με τις αναλύσεις που καταγράφονται στο μπλοκ υπογραφής. Εάν έχει τροποποιηθεί έστω και ένα byte από τότε που ο προγραμματιστής υπέγραψε το αρχείο, οι ανακεφαλαιώσεις δεν θα ταιριάζουν και η εγκατάσταση απορρίπτεται με ένα γενικό σφάλμα "Η εφαρμογή δεν έχει εγκατασταθεί".
- Βεβαιωθείτε ότι το ίδιο το μπλοκ υπογραφής δημιουργήθηκε με το ιδιωτικό κλειδί του πιστοποιητικού. Το δημόσιο κλειδί του πιστοποιητικού χρησιμοποιείται για τον έλεγχο της κρυπτογραφικής υπογραφής στο μπλοκ. Ένας επιτυχημένος έλεγχος σημαίνει ότι όποιος υπέγραψε το αρχείο διέθετε το ιδιωτικό κλειδί που έχει συζευχθεί με αυτό το πιστοποιητικό.
- Συγκρίνετε το δακτυλικό αποτύπωμα πιστοποιητικού με οποιαδήποτε υπάρχουσα εγκατάσταση με το ίδιο όνομα πακέτου. Εάν το πακέτο είναι ήδη εγκατεστημένο και το νέο APK έχει υπογραφεί με διαφορετικό πιστοποιητικό, η εγκατάσταση απορρίπτεται με το INSTALL_FAILED_UPDATE_INCOMPATIBLE. Αυτή είναι η κύρια άμυνα του λειτουργικού συστήματος κατά της πλαστοπροσωπίας: ένας κακόβουλος παράγοντας δεν μπορεί να αντικαταστήσει την εφαρμογή της τράπεζάς σας με το δικό του αντίγραφο, εκτός εάν κλέψει επίσης το κλειδί υπογραφής της τράπεζας.
Τίποτα από αυτά δεν αποδεικνύει ότι ο προγραμματιστής είναι αξιόπιστος, μόνο ότι το αρχείο που πρόκειται να εγκαταστήσετε είναι πανομοιότυπο με αυτό που υπέγραψε και ότι κανένα άλλο μέρος δεν το έχει παραβιάσει. Η εμπιστοσύνη στον προγραμματιστή είναι μια ξεχωριστή απόφαση και αποφασίζετε από ποιες πηγές θα εγκαταστήσετε.
Τι σημαίνει πραγματικά "Αντιστοιχία υπογραφών".
Η πιο συνηθισμένη έκπληξη που πλήττουν οι άνθρωποι κατά την πλευρική φόρτωση είναι το σφάλμα "αναντιστοιχία υπογραφής" κατά την ενημέρωση. Εδώ είναι τι συμβαίνει στην πραγματικότητα:
- Έχετε εγκαταστήσει το App X έκδοση 1.0 από το Play Store.
- Κάνετε λήψη του Εφαρμογή Χ έκδοση 1.1 από μια πηγή που δεν είναι Play.
- Το λειτουργικό σύστημα βλέπει το ίδιο όνομα πακέτου (com.example.app), αλλά το APK είναι υπογεγραμμένο με διαφορετικό πιστοποιητικό (το κλειδί υπογραφής της πλευρικής πηγής, όχι του αρχικού εκδότη). Αρνείται την εγκατάσταση.
Αυτό συμβαίνει στην πράξη με δύο τρόπους:
- Το APK τρίτου μέρους είναι το πραγματικά από διαφορετικό εκδότη, για παράδειγμα ένα "τροποποιημένο" ή "patched" αντίγραφο. Η άρνηση της εγκατάστασης είναι η σωστή συμπεριφορά. Η εγκατάστασή του θα σήμαινε ότι εμπιστεύεστε έναν ξένο με τα ίδια δεδομένα που έχει ήδη αγγίξει η εφαρμογή της τράπεζάς σας.
- Το 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
Δύο πράγματα που πρέπει να γνωρίζετε:
- Το κύρος έχει σημασία: 10000 ημέρες (περίπου 27 χρόνια) είναι η συμβατική τιμή επειδή το λειτουργικό σύστημα αντιμετωπίζει τις ενημερώσεις που έχουν υπογραφεί με ένα κλειδί που έχει σχεδόν λήξει ή έχει λήξει ως παραβιασμένες. Δημιουργήστε ένα κλειδί μεγάλης διάρκειας μία φορά και προστατέψτε το.
- Μόλις δημοσιευτεί, δεν μπορείτε εύκολα να αλλάξετε κλειδιά. Το σχήμα υπογραφής v3 προσθέτει το κλειδί περιστροφή ως σαφές χαρακτηριστικό: ένα παλιό πιστοποιητικό "ευλογεί" ένα νέο μέσω μιας αποθηκευμένης απόδειξης, επιτρέποντας στο λειτουργικό σύστημα να δέχεται ενημερώσεις από το νέο κλειδί διατηρώντας παράλληλα τη συνέχεια της ταυτότητας. Χωρίς v3, η απώλεια του αρχικού κλειδιού σημαίνει ορφανή όλων των υπαρχουσών εγκαταστάσεων.
Για δοκιμαστικές εκδόσεις με πλευρική φόρτωση, μια ανυπόγραφη αποθήκευση κλειδιών εντοπισμού σφαλμάτων είναι μια χαρά. για παραγωγή, χρησιμοποιήστε έναν χώρο αποθήκευσης κλειδιών μακράς ισχύος που προστατεύεται με κωδικό πρόσβασης και είναι αποθηκευμένος σε αντίγραφο ασφαλείας εκτός σύνδεσης.
Επαληθεύστε την ταυτότητα της εφαρμογής σαν επαγγελματίας
Μην εμπιστεύεστε τα γενικά ονόματα αρχείων. Ελέγξτε την κρυπτογραφική καρδιά των APK σας σε δευτερόλεπτα.
Επαληθεύστε τα πιστοποιητικά τώραΚοινές παγίδες υπογραφής
- Αυτουπογεγραμμένα Πιστοποιητικά: Οι περισσότερες εφαρμογές Android είναι αυτο-υπογεγραμμένες. Σε αντίθεση με το SSL για ιστότοπους, δεν υπάρχει κεντρική αρχή για την υπογραφή εφαρμογών Android. Πρέπει να εμπιστευτείτε άμεσα τον προγραμματιστή.
- Οι εφαρμογές Πιστοποιητικά εντοπισμού σφαλμάτων: που έχουν δημιουργηθεί για δοκιμή χρησιμοποιούν ένα γενικό κλειδί "debug". Αυτές οι εφαρμογές δεν πρέπει ποτέ να κυκλοφορούν στο κοινό και αποκλείονται από πολλά φίλτρα ασφαλείας.
- Απώλεια κλειδιού: Εάν ένας προγραμματιστής χάσει το χώρο αποθήκευσης ιδιωτικών κλειδιών, μπορεί να ενημερώσει ξανά την εφαρμογή του ποτέ. Θα έπρεπε να κυκλοφορήσουν μια "Νέα" εφαρμογή με διαφορετικό όνομα πακέτου.
Επιλογή του σωστού σχήματος υπογραφής για το SDK-στόχο σας
Η αθόρυβη υπογραφή εφαρμογών υποστηρίζει μεγάλο μέρος της ασφάλειας του Android. Μόλις κάνει κλικ η σχέση ιδιωτικού/δημόσιου κλειδιού, μπορείτε να κρίνετε μια πλευρική εφαρμογή βάσει των πλεονεκτημάτων της και να επιβεβαιώσετε ότι αυτό που εγκαθιστάτε δεν έχει αλλάξει από τότε που την υπέγραψε ο προγραμματιστής. Για περισσότερα σχετικά με τα εσωτερικά Android, ανατρέξτε στο οδηγός για τη μορφή XAPK.