Η φορητή ασφάλεια είναι ένα σύνολο μέτρων για την προστασία της εφαρμογής, των δεδομένων χρήστη και της υποδομής διακομιστή από επιθέσεις και διαρροές. Σύμφωνα με το OWASP Mobile Top 10 (2024), η μη ασφαλής αποθήκευση δεδομένων παραμένει η πιο κοινή ευπάθεια σε φορητές εφαρμογές. Σε αυτό το άρθρο θα εξετάσουμε τις κύριες απειλές, τις μεθόδους κρυπτογράφησης, την ασφαλή αποθήκευση, την ταυτοποίηση και την προστασία κώδικα — όλα όσα πρέπει να γνωρίζει ένας αρχάριος προγραμματιστής.
Βασικά Σημεία
OWASP (Open Web Application Security Project) είναι ένας μη κερδοσκοπικός οργανισμός που δημοσιεύει μια κατάταξη των πιο επικίνδυνων ευπαθειών φορητής ασφάλειας. Το OWASP Mobile Top 10 είναι μια λίστα που βοηθά τους προγραμματιστές να κατανοήσουν σε τι πρέπει να επικεντρωθούν πρώτα. Στην έκδοση του 2024, τα προβλήματα που σχετίζονται με τη μη ασφαλή αποθήκευση, την αδύναμη ταυτοποίηση και τη μη ασφαλή επικοινωνία δικτύου πρωτοστατούν στην κατάταξη.
M1: Μη ασφαλής αποθήκευση δεδομένων — το πιο κοινό πρόβλημα: κωδικοί πρόσβασης, διακριτικά και προσωπικά δεδομένα παραμένουν σε SharedPreferences, NSUserDefaults ή τοπικά αρχεία χωρίς κρυπτογράφηση. M2: Αδύναμη ταυτοποίηση — έλλειψη επαλήθευσης από την πλευρά του διακομιστή, αδύναμοι κωδικοί πρόσβασης. M3: Μη ασφαλής επικοινωνία δικτύου — έλλειψη HTTPS ή λανθασμένη επαλήθευση πιστοποιητικού SSL. Τα M4 και M5 σχετίζονται με κρυπτογραφία και λανθασμένη χρήση API.
M6: Μη ασφαλής εξουσιοδότηση — ένας χρήστης μπορεί να αποκτήσει πρόσβαση σε δεδομένα άλλου χρήστη αντικαθιστώντας ένα αναγνωριστικό σε ένα αίτημα. M7: Ενέσεις κώδικα (SQL Injection, XSS). M8: Χειρισμός εφαρμογής — ανασυσκευασία, αντικατάσταση κώδικα. M9 και M10 — διαρροή δεδομένων μέσω βιβλιοθηκών τρίτων και αντίστροφη μηχανική. Για καθεμία από αυτές τις απειλές υπάρχουν αποδεδειγμένα αντίμετρα και στην IT Sectr τα εφαρμόζουμε σε όλα τα έργα από το 2017.
Επίθεση MITM συμβαίνει όταν ένας εισβολέας υποκλέπτει την κίνηση μεταξύ της εφαρμογής και του διακομιστή. Αυτό είναι δυνατό μέσω πλαστογραφίας DNS, ARP spoofing ή σύνδεσης σε ένα μη ασφαλές δίκτυο Wi-Fi. Για προστασία χρησιμοποιούνται πιστοποιητικά SSL/TLS και Certificate Pinning.
Certificate Pinning είναι ένας μηχανισμός όπου η εφαρμογή επαληθεύει ότι το πιστοποιητικό του διακομιστή ταιριάζει με ένα προαποθηκευμένο στον κώδικα της εφαρμογής. Ακόμα κι αν ένας εισβολέας αντικαταστήσει το πιστοποιητικό μέσω ενός διαμεσολαβητή (π.χ. Burp Suite), η εφαρμογή θα απορρίψει τη σύνδεση. Το Pinning είναι δύο τύπων: Public Key Pinning και Certificate Hash Pinning.
AES (Advanced Encryption Standard) είναι ένας συμμετρικός αλγόριθμος κρυπτογράφησης, το θεμέλιο της ασφάλειας δεδομένων στη συσκευή. Το AES χρησιμοποιεί το ίδιο κλειδί για κρυπτογράφηση και αποκρυπτογράφηση δεδομένων. Το AES υποστηρίζει κλειδιά μήκους 128, 192 ή 256 bit. Στη φορητή ανάπτυξη, το AES-256 χρησιμοποιείται για κρυπτογράφηση δεδομένων στη συσκευή: αρχεία, προσωρινή μνήμη, εγγραφές στην τοπική βάση δεδομένων.
Λειτουργίες AES: GCM (συνιστάται) — παρέχει ταυτοποίηση δεδομένων, CBC — βασική λειτουργία με αλυσίδα μπλοκ, ECB — μη ασφαλής, μην τη χρησιμοποιείτε. Για iOS, το AES είναι διαθέσιμο μέσω CommonCrypto (CCOptions), για Android — μέσω Cipher στην Java Cryptography Architecture (JCA). Σημαντικό: το κλειδί κρυπτογράφησης δεν πρέπει ποτέ να αποθηκεύεται στον κώδικα της εφαρμογής — χρησιμοποιήστε Keychain/Keystore.
Ασύμμετρη Κρυπτογράφηση: RSA — χρησιμοποιεί ένα ζεύγος κλειδιών (δημόσιο και ιδιωτικό). Το RSA χρησιμοποιείται για κρυπτογράφηση μικρών όγκων δεδομένων — συνήθως για ανταλλαγή συμμετρικού κλειδιού μεταξύ πελάτη και διακομιστή. Το ελάχιστο μήκος κλειδιού RSA είναι 2048 bit (συνιστάται 4096). Στο iOS, το RSA είναι διαθέσιμο μέσω Security Framework (SecKeyCreateRandomKey), στο Android — μέσω KeyPairGenerator στο Android Keystore.
Κατακερματισμός (SHA-256, SHA-3) είναι ένας μη αναστρέψιμος μετασχηματισμός δεδομένων σε μια συμβολοσειρά σταθερού μήκους. Οι τιμές κατακερματισμού χρησιμοποιούνται για επαλήθευση ακεραιότητας δεδομένων και αποθήκευση κωδικών πρόσβασης. Για κωδικούς πρόσβασης, χρησιμοποιήστε υποχρεωτικά bcrypt, scrypt ή Argon2 — το απλό SHA-256 είναι ευάλωτο σε επιθέσεις με ουράνια τραπέζια. SSL/TLS είναι ένα πρωτόκολλο κρυπτογράφησης της κυκλοφορίας δικτύου μεταξύ πελάτη και διακομιστή. Το σύγχρονο πρότυπο είναι TLS 1.3, το οποίο παρέχει Perfect Forward Secrecy (PFS).
TLS 1.3 είναι ταχύτερο από τους προκατόχους του: η χειραψία διαρκεί έναν γύρο αντί για δύο. Στο Android, η ελάχιστη έκδοση TLS διαμορφώνεται μέσω SSLSocket, στο iOS — μέσω ATS (App Transport Security), το οποίο από προεπιλογή απαιτεί TLS 1.2 ή υψηλότερο. Η απενεργοποίηση του ATS είναι δυνατή μόνο για συγκεκριμένους τομείς με αιτιολόγηση.
Keychain (Μπρελόκ) είναι ένα ασφαλές αποθετήριο στο iOS / macOS για κωδικούς πρόσβασης, κλειδιά κρυπτογράφησης, πιστοποιητικά και διακριτικά. Τα δεδομένα στο Keychain κρυπτογραφούνται με ένα κλειδί υλικού μοναδικό για κάθε συσκευή. Η πρόσβαση στο Keychain ελέγχεται μέσω Security Framework (SecItemAdd, SecItemCopyMatching). Το Keychain κλειδώνεται αυτόματα όταν η συσκευή κλειδωθεί και κρυπτογραφείται χρησιμοποιώντας το Secure Enclave.
Android Keystore είναι ένα αποθετήριο συστήματος για κρυπτογραφικά κλειδιά, απομονωμένο από την εφαρμογή. Από το Android 6.0 (API 23), το Keystore χρησιμοποιεί υποστήριξη υλικού (TEE — Trusted Execution Environment) σε συσκευές με τσιπ ασφαλείας. Τα κλειδιά στο Keystore δεν εγκαταλείπουν ποτέ την ασφαλή περιοχή — η εφαρμογή λαμβάνει μόνο μια λαβή για λειτουργίες κρυπτογράφησης και υπογραφής.
| Παράμετρος | iOS Keychain | Android Keystore |
|---|---|---|
| Τύπος αποθηκευμένων δεδομένων | Κωδικοί, διακριτικά, κλειδιά, πιστοποιητικά | Κρυπτογραφικά κλειδιά |
| Υποστήριξη υλικού | Secure Enclave (όλα τα iPhone με A7+) | TEE (Android 6+, εξαρτάται από το τσιπ) |
| Κρυπτογράφηση | AES-256 υλικού | AES/GCM με κλειδί υλικού |
| Βιομετρικά | Face ID / Touch ID για πρόσβαση | BiometricPrompt για πρόσβαση |
| iCloud / αντίγραφο ασφαλείας | Συγχρονισμός μέσω iCloud Keychain | Δεν συγχρονίζεται με το cloud |
| Απόδοση | Πιο αργό (κρυπτογράφηση υλικού) | Ταχύτερο (TEE) |
SharedPreferences και NSUserDefaults δεν έχουν σχεδιαστεί για αποθήκευση ευαίσθητων δεδομένων — αποθηκεύουν πληροφορίες σε απλό κείμενο. Για προστασία δεδομένων, χρησιμοποιήστε EncryptedSharedPreferences (Android) ή κρυπτογραφήστε τα δεδομένα πριν από την αποθήκευση στο UserDefaults (iOS). Στην IT Sectr, χρησιμοποιούμε πάντα Keychain και Keystore για διακριτικά πρόσβασης και κωδικούς.
OAuth 2.0 είναι ένα πρωτόκολλο εξουσιοδοτημένης αντιπροσώπευσης που παρέχει ασφαλή πρόσβαση σε πόρους χρήστη χωρίς μετάδοση κωδικού πρόσβασης. Στις φορητές εφαρμογές, χρησιμοποιείται συχνότερα το Authorization Code Flow με PKCE (Proof Key for Code Exchange). Το PKCE αποτρέπει την υποκλοπή του κωδικού εξουσιοδότησης — μια υποχρεωτική απαίτηση για φορητές εφαρμογές.
OpenID Connect (OIDC) είναι μια επέκταση πάνω από το OAuth 2.0 για ταυτοποίηση χρήστη. Το OIDC προσθέτει ένα ID Token σε μορφή JWT που περιέχει πληροφορίες χρήστη (όνομα, email, id). Η ροή OAuth 2.0 + OIDC περιλαμβάνει: ανακατεύθυνση του χρήστη στη σελίδα σύνδεσης, λήψη κωδικού εξουσιοδότησης, ανταλλαγή του κωδικού για διακριτικά (access + refresh + id), χρήση του διακριτικού πρόσβασης για αιτήματα API.
JWT (JSON Web Token) είναι μια συμπαγής, ασφαλής για URL μορφή διακριτικού που περιέχει αξιώσεις σε μορφή JSON. Το JWT αποτελείται από τρία μέρη: κεφαλίδα (τύπος και αλγόριθμος υπογραφής), ωφέλιμο φορτίο (δεδομένα) και υπογραφή. Το Διακριτικό Πρόσβασης είναι ένα βραχύβιο διακριτικό (15–60 λεπτά) για πρόσβαση API. Το Διακριτικό Ανανέωσης είναι ένα μακρόβιο διακριτικό (ημέρες/εβδομάδες) για λήψη νέου διακριτικού πρόσβασης χωρίς επανασύνδεση.
Διακριτικό Συνεδρίας είναι μια παραδοσιακή προσέγγιση όπου ο διακομιστής αποθηκεύει τη συνεδρία σε μια βάση δεδομένων ή Redis και ο πελάτης λαμβάνει ένα τυχαίο αναγνωριστικό. Στη φορητή ανάπτυξη, το JWT προτιμάται: δεν απαιτεί αποθήκευση συνεδρίας από την πλευρά του διακομιστή, περιέχει όλες τις πληροφορίες μέσα του και είναι εύκολο να επαληθευτεί. Ωστόσο, το JWT δεν μπορεί να ανακληθεί άμεσα — αυτός είναι ένας συμβιβασμός που επιλύεται με μικρή διάρκεια ζωής του διακριτικού πρόσβασης και χρήση διακριτικών ανανέωσης.
Face ID και Touch ID στο iOS, Ταυτοποίηση με Αποτύπωμα στο Android — βιομετρικές μέθοδοι ταυτοποίησης που χρησιμοποιούν μοναδικά φυσικά χαρακτηριστικά του χρήστη. Στο iOS, τα βιομετρικά λειτουργούν μέσω LocalAuthentication (LAContext), στο Android — μέσω BiometricPrompt (Android 9+) ή FingerprintManager (ξεπερασμένο). Τα βιομετρικά χρησιμοποιούνται για ξεκλείδωμα εφαρμογής, επιβεβαίωση πληρωμών και πρόσβαση σε προστατευμένα δεδομένα.
Σημαντικές αποχρώσεις: τα βιομετρικά είναι μια βολική εμπειρία χρήστη, αλλά όχι υποκατάστατο της ταυτοποίησης διακομιστή. Μετά από επιτυχή βιομετρική επαλήθευση, η εφαρμογή θα πρέπει να λάβει ένα διακριτικό πρόσβασης από τον διακομιστή. Στο Android, βεβαιωθείτε ότι η συσκευή χρησιμοποιεί βιομετρικά Κλάσης 3 (Ισχυρά), όχι μόνο αναγνώριση προσώπου μέσω κάμερας (Κλάση 1).
ProGuard είναι ένα εργαλείο συσκότισης, συμπίεσης και βελτιστοποίησης bytecode Java για Android, που αυξάνει την ασφάλεια κώδικα έναντι της αντίστροφης μηχανικής. Το R8 είναι ο διάδοχός του, ενσωματωμένο στο Gradle από το Android Studio 3.4. Το R8 εκτελεί τέσσερις εργασίες: συμπίεση (αφαιρεί μη χρησιμοποιούμενες κλάσεις και μεθόδους), βελτιστοποίηση (ενσωματώνει μεθόδους, απλοποιεί κώδικα), συσκότιση (μετονομάζει κλάσεις και μεθόδους σε σύντομα ονόματα) και προ-επαλήθευση (έλεγχος bytecode).
DexGuard είναι μια εμπορική έκδοση του ProGuard με εκτεταμένη προστασία: κρυπτογράφηση συμβολοσειρών, συσκότιση πόρων, προστασία από ανασυσκευασία, έλεγχος ακεραιότητας APK. Για τα περισσότερα έργα, το R8 είναι αρκετό, αλλά για χρηματοοικονομικές και τραπεζικές εφαρμογές, το DexGuard παρέχει ένα επιπλέον επίπεδο ασφάλειας. Το R8 ενεργοποιείται μέσω build.gradle: minifyEnabled = true και proguardFiles.
Root Detection (Android) και Jailbreak Detection (iOS) είναι μηχανισμοί που ελέγχουν αν έχουν αποκτηθεί δικαιώματα υπερχρήστη στη συσκευή. Σε παραβιασμένες συσκευές, είναι δυνατή η ανάγνωση της μνήμης διεργασίας, η υποκλοπή κίνησης και η αντικατάσταση κώδικα. Για έλεγχο στο Android, χρησιμοποιείται η παρουσία του δυαδικού αρχείου SU, δοκιμαστικών κλειδιών υπογραφής και μη τυπικών σημάτων κατασκευής.
RASP (Runtime Application Self-Protection) είναι μια τεχνολογία που προστατεύει την εφαρμογή κατά την εκτέλεση. Το RASP ανιχνεύει απόπειρες εντοπισμού σφαλμάτων, ανασυσκευασίας, έγχυσης κώδικα και τερματίζει την εφαρμογή όταν ανιχνεύονται απειλές. Παραδείγματα λύσεων RASP: Dexter, Guardsquare, Promon. Το RASP λειτουργεί κατά τον χρόνο εκτέλεσης και αντιδρά σε ανωμαλίες — σε αντίθεση με τη στατική συσκότιση, η οποία προστατεύει τον κώδικα πριν από την εκτέλεση.
Αντίστροφη Μηχανική είναι η διαδικασία ανάκτησης του πηγαίου κώδικα από μια μεταγλωττισμένη εφαρμογή. Εργαλεία: JADX (απομεταγλωττιστής APK), Ghidra, IDA Pro, Hopper. Η προστασία από την Αντίστροφη Μηχανική είναι ένας συνδυασμός συσκότισης, κρυπτογράφησης συμβολοσειρών, ελέγχου ακεραιότητας και Root Detection. Δεν υπάρχει πλήρης προστασία — ο στόχος είναι να γίνει η αντίστροφη μηχανική αρκετά δαπανηρή για τον εισβολέα.
Συχνές Ερωτήσεις
Ξεκινήστε με το OWASP Mobile Top 10 — είναι ένας χάρτης πορείας των πιο κοινών ευπαθειών. Στη συνέχεια, μελετήστε HTTPS και πιστοποιητικά SSL, ρυθμίστε το Certificate Pinning και προχωρήστε στην ασφαλή αποθήκευση μέσω Keychain / Keystore.
AES (συμμετρική) — ένα κλειδί για κρυπτογράφηση και αποκρυπτογράφηση, γρήγορο, κατάλληλο για μεγάλους όγκους δεδομένων. RSA (ασύμμετρη) — ένα ζεύγος κλειδιών (δημόσιο και ιδιωτικό), πιο αργό, χρησιμοποιείται για ανταλλαγή του συμμετρικού κλειδιού.
Πρέπει να κρυπτογραφείτε μόνο εμπιστευτικά δεδομένα: κωδικούς πρόσβασης, διακριτικά, προσωπικά δεδομένα χρήστη, πληροφορίες πληρωμών. Οι εικόνες, τα κείμενα και οι ρυθμίσεις διεπαφής δεν απαιτούν κρυπτογράφηση — αυτό θα αυξήσει το μέγεθος και θα επιβραδύνει την εφαρμογή.
Διακριτικό Ανανέωσης είναι ένα μακρόβιο διακριτικό που επιτρέπει τη λήψη νέου Διακριτικού Πρόσβασης χωρίς εκ νέου εισαγωγή του κωδικού πρόσβασης. Αυτό αυξάνει την ασφάλεια — το Διακριτικό Πρόσβασης ζει 15–60 λεπτά και ακόμα κι αν διαρρεύσει, ο εισβολέας δεν μπορεί να το χρησιμοποιήσει για πολύ.
Ναι, το R8 πρέπει να ενεργοποιηθεί για τις εκδόσεις έκδοσης Android. Δεν είναι μόνο προστασία από την Αντίστροφη Μηχανική, αλλά και μείωση μεγέθους APK και βελτιστοποίηση απόδοσης. Χωρίς R8, ο κώδικάς σας μπορεί να απομεταγλωττιστεί σε αναγνώσιμη μορφή με μία μόνο εντολή JADX.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.