Secure Storage (ασφαλής αποθήκευση) — ένα σύνολο μεθόδων και τεχνολογιών για την προστασία εμπιστευτικών δεδομένων στη συσκευή: διακριτικά, κλειδιά κρυπτογράφησης, πληροφορίες πληρωμής και προσωπικά δεδομένα χρηστών. Σύμφωνα με το OWASP Mobile Top 10 (2024), η μη ασφαλής αποθήκευση δεδομένων συγκαταλέγεται στους τρεις πιο κρίσιμους κινδύνους. Η σωστή υλοποίηση της ασφαλούς αποθήκευσης αποτρέπει διαρροές δεδομένων ακόμη και με φυσική πρόσβαση στη συσκευή.
Κύρια σημεία
Secure Storage — η πρακτική αποθήκευσης εμπιστευτικών δεδομένων της εφαρμογής κινητού με τέτοιο τρόπο ώστε να είναι μη προσβάσιμα σε άλλες εφαρμογές, κακόβουλο λογισμικό και επιτιθέμενο με φυσική πρόσβαση στη συσκευή. Σε αντίθεση με τη συνήθη αποθήκευση, το Secure Storage χρησιμοποιεί κρυπτογράφηση, απομόνωση και προστασία υλικού.
Δεν απαιτούν όλα τα δεδομένα Secure Storage: οι εικόνες προφίλ ή η προσωρινή μνήμη ειδήσεων μπορούν να αποθηκευτούν στο συνηθισμένο σύστημα αρχείων. Ωστόσο, τα κλειδιά κρυπτογράφησης, τα διακριτικά ελέγχου ταυτότητας, τα δεδομένα πληρωμής, τα ιδιωτικά κλειδιά και τα βιομετρικά πρότυπα πρέπει να προστατεύονται. Σύμφωνα με το Google Security Blog (2025), το 67% των τρωτών σημείων σε εφαρμογές κινητού σχετίζονται με την αποθήκευση μυστικών σε ανοιχτή μορφή.
Κάθε πλατφόρμα κινητού παρέχει τους δικούς της μηχανισμούς Secure Storage: Android — Keystore και EncryptedSharedPreferences, iOS — Keychain και Data Protection API. Αυτοί οι μηχανισμοί είναι ενσωματωμένοι με ενότητες ασφαλείας υλικού (TEE, Secure Enclave) και εγγυώνται ότι τα δεδομένα δεν μπορούν να διαβαστούν ακόμη και μετά από jailbreak ή root της συσκευής.
Η σωστή επιλογή της μεθόδου Secure Storage εξαρτάται από τον τύπο των δεδομένων, το σενάριο χρήσης και τις απαιτήσεις απόδοσης. Η κατανόηση της αρχιτεκτονικής κάθε μηχανισμού επιτρέπει στον προγραμματιστή να λάβει τη σωστή αρχιτεκτονική απόφαση.
Η πλατφόρμα Android παρέχει πολλά επίπεδα προστασίας δεδομένων, από αποθήκευση κλειδιών υλικού έως κρυπτογραφημένες SharedPreferences. Η επιλογή εξαρτάται από την ευαισθησία των δεδομένων και τις απαιτήσεις απόδοσης.
Android Keystore — πάροχος κρυπτογράφησης που δημιουργεί και αποθηκεύει κλειδιά σε απομονωμένο περιβάλλον εκτέλεσης (TEE — Trusted Execution Environment) σε συσκευές με υποστήριξη προστασίας υλικού. Τα κλειδιά δεν εγκαταλείπουν ποτέ το TEE: οι κρυπτογραφικές λειτουργίες εκτελούνται εντός προστατευμένης περιοχής μη προσβάσιμης ακόμη και από το λειτουργικό σύστημα.
Από το Android 9 (API 28), το Keystore υποστηρίζει StrongBox Keymaster — ένα αποκλειστικό τσιπ ασφαλείας με δική του CPU, True Random Number Generator (TRNG) και προστατευμένη μνήμη. Το StrongBox είναι πιστοποιημένο σύμφωνα με το Common Criteria EAL 4+ και αποτελεί το ασφαλέστερο επίπεδο αποθήκευσης κλειδιών στο Android. Για τη χρήση του StrongBox, πρέπει να προσδιορίσετε ρητά τη σημαία inStrongBox() κατά τη δημιουργία του κλειδιού.
Το Keystore υποστηρίζει τους αλγόριθμους: AES/GCM/NoPadding (256 bit), EC (secp256r1, secp384r1), RSA (2048–4096 bit) και HMAC-SHA256. Όλα τα κλειδιά μπορούν να συνδεθούν με βιομετρικό έλεγχο ταυτότητας μέσω setUserAuthenticationRequired(true).
EncryptedSharedPreferences — βιβλιοθήκη από το πακέτο AndroidX Security που κρυπτογραφεί αυτόματα όλα τα δεδομένα που αποθηκεύονται μέσω του API SharedPreferences. Οι τιμές κρυπτογραφούνται με κλειδί AES-256 GCM και τα κλειδιά — με AES-256 SIV (συνθετικό IV), αποτρέποντας επιθέσεις λεξικού σε ονόματα κλειδιών.
Το κύριο κλειδί κρυπτογράφησης αποθηκεύεται στο Android Keystore, παρέχοντας προστασία δύο επιπέδων: το Keystore προστατεύει το κύριο κλειδί, το EncryptedSharedPreferences προστατεύει τα δεδομένα. Η απόδοση κρυπτογράφησης είναι μικρότερη από 5 ms ανά λειτουργία ανάγνωσης/εγγραφής για τυπικά δεδομένα (διακριτικό, ρυθμίσεις), καθιστώντας τη βιβλιοθήκη κατάλληλη για σενάρια χρήστη.
Το EncryptedSharedPreferences δεν προορίζεται για μεγάλους όγκους δεδομένων (πάνω από 5 MB) — σε τέτοιες περιπτώσεις χρησιμοποιήστε κρυπτογραφημένη βάση δεδομένων μέσω SQLCipher ή Room με κρυπτογράφηση.
Το SQLCipher — επέκταση SQLite που κρυπτογραφεί ολόκληρη τη βάση δεδομένων σελίδα προς σελίδα με AES-256-CBC. Κάθε σελίδα της βάσης δεδομένων κρυπτογραφείται με ξεχωριστό κλειδί που προέρχεται από τον κύριο κωδικό πρόσβασης μέσω PBKDF2. Το SQLCipher προσθέτει περίπου 5–15% επιβάρυνση απόδοσης ανάλογα με το μέγεθος των δεδομένων.
Η ενοποίηση με Android γίνεται μέσω της βιβλιοθήκης net.zetetic:android-database-sqlcipher, η οποία παρέχει API συμβατό με το τυπικό SQLiteOpenHelper. Ο κωδικός πρόσβασης για SQLCipher συνιστάται να αποθηκεύεται στο Keystore, όχι στον κώδικα ή στις SharedPreferences.
Η πλατφόρμα iOS παρέχει το Keychain Services — τον κύριο ασφαλή χώρο αποθήκευσης, καθώς και το Data Protection API για κρυπτογράφηση αρχείων σε επίπεδο ΛΣ.
Το Keychain είναι μια κρυπτογραφημένη βάση δεδομένων SQLite στην οποία το iOS αποθηκεύει κωδικούς πρόσβασης, κλειδιά κρυπτογράφησης, πιστοποιητικά και σημειώσεις. Κάθε στοιχείο Keychain (SecItem) αποθηκεύεται σε κρυπτογραφημένη μορφή χρησιμοποιώντας ένα κλειδί υλικού μοναδικό για τη συσκευή. Η πρόσβαση στο στοιχείο ελέγχεται μέσω ACL (Access Control List), η οποία μπορεί να απαιτεί βιομετρικό έλεγχο ταυτότητας (Face ID, Touch ID) ή κωδικό πρόσβασης.
Το Keychain υποστηρίζει κλάσεις προστασίας (Protection Class) που καθορίζουν πότε τα δεδομένα είναι διαθέσιμα: kSecAttrAccessibleWhenUnlockedThisDeviceOnly — τα δεδομένα είναι διαθέσιμα μόνο όταν η συσκευή είναι ξεκλείδωτη και δεν μεταφέρονται κατά τη δημιουργία αντιγράφων ασφαλείας. Αυτή η κλάση συνιστάται για τα περισσότερα σενάρια αποθήκευσης διακριτικών ελέγχου ταυτότητας.
Στο iOS 15+ είναι διαθέσιμο το Security framework με υποστήριξη για κλειδιά υλικού μέσω Secure Enclave — ενός αποκλειστικού επεξεργαστή Apple που επεξεργάζεται κρυπτογραφικές λειτουργίες και αποθηκεύει ιδιωτικά κλειδιά σε απομονωμένη μνήμη. Το Secure Enclave υποστηρίζει τους αλγόριθμους ECDSA (secp256r1) και ECDH για δημιουργία κλειδιών που δεν μπορούν να εξαχθούν από το τσιπ.
Το Data Protection είναι ένας μηχανισμός iOS που κρυπτογραφεί κάθε αρχείο σε επίπεδο συστήματος αρχείων (APFS) χρησιμοποιώντας ένα κλειδί συνδεδεμένο με τον κωδικό πρόσβασης της συσκευής. Ο προγραμματιστής καθορίζει το επίπεδο προστασίας μέσω του χαρακτηριστικού NSFileProtectionType κατά τη δημιουργία του αρχείου: NSFileProtectionComplete — το αρχείο είναι διαθέσιμο μόνο όταν η συσκευή είναι ξεκλείδωτη.
Το Data Protection λειτουργεί αυτόματα σε όλες τις συσκευές με iOS 5+ εάν έχει οριστεί κωδικός πρόσβασης. Η κρυπτογράφηση πραγματοποιείται σε επίπεδο υλικού μέσω της Dedicated AES Engine του επεξεργαστή Apple, εξασφαλίζοντας υψηλή απόδοση — η καθυστέρηση κρυπτογράφησης είναι πρακτικά ανεπαίσθητη για τον χρήστη. Για να ενεργοποιήσετε την προστασία στην εφαρμογή, αρκεί να ορίσετε το χαρακτηριστικό προστασίας κατά τη δημιουργία του αρχείου μέσω του FileManager.
Το Data Protection δεν αντικαθιστά το Keychain για αποθήκευση κλειδιών — χρησιμοποιείται για κρυπτογράφηση αρχείων, βάσεων δεδομένων Core Data και άλλων μεγάλων όγκων δεδομένων. Ο συνδυασμός Keychain (για κλειδιά) και Data Protection (για αρχεία) παρέχει πλήρη κύκλο ασφαλούς αποθήκευσης στο iOS.
Ας εξετάσουμε πρακτικά παραδείγματα Secure Storage χρησιμοποιώντας τα ενσωματωμένα API των Android και iOS.
Το παράδειγμα δείχνει την αρχικοποίηση του EncryptedSharedPreferences με κύριο κλειδί από το Android Keystore. Όλες οι επόμενες λειτουργίες ανάγνωσης και εγγραφής κρυπτογραφούνται και αποκρυπτογραφούνται αυτόματα.
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val prefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
prefs.edit()
.putString("auth_token", "eyJhbGciOiJIUzI1NiJ9...")
.apply()
Το παράδειγμα δείχνει την αποθήκευση και ανάγνωση δεδομένων από το iOS Keychain χρησιμοποιώντας το Security framework. Ο κώδικας χρησιμοποιεί kSecAttrAccessibleWhenUnlockedThisDeviceOnly για μέγιστη προστασία.
import Security
func saveToKeychain(key: String, data: Data) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessible as String:
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
SecItemAdd(query as CFDictionary, nil)
}
func readFromKeychain(key: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]
var result: AnyObject?
let status = SecItemCopyMatching(
query as CFDictionary, &result
)
return status == errSecSuccess ? result as? Data : nil
}
Παράδειγμα σύνδεσης σε κρυπτογραφημένη βάση δεδομένων SQLite μέσω SQLCipher με κωδικό πρόσβασης αποθηκευμένο στο Android Keystore.
import net.sqlcipher.database.SQLiteDatabase
import net.sqlcipher.database.SQLiteOpenHelper
class SecureDBHelper(context: Context) :
SQLiteOpenHelper(context, "secure.db", null, 1) {
private val password = getKeyFromKeystore()
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("CREATE TABLE tokens (id INTEGER PRIMARY KEY, value TEXT)")
}
override fun onUpgrade(
db: SQLiteDatabase, oldVersion: Int, newVersion: Int
) {
onCreate(db)
}
}
// Χρήση: εισάγετε τον κωδικό πρόσβασης κατά το άνοιγμα
val helper = SecureDBHelper(context)
val db = helper.getWritableDatabase(password)
Η σωστή χρήση του Secure Storage απαιτεί τήρηση ορισμένων θεμελιωδών αρχών που αποτρέπουν τυπικά λάθη προγραμματιστών.
Καθορίστε την ταξινόμηση των δεδομένων: ποια δεδομένα απαιτούν προστασία υλικού (Keystore / Secure Enclave), ποια — κρυπτογράφηση σε επίπεδο ΛΣ (EncryptedSharedPreferences / Data Protection) και ποια μπορούν να αποθηκευτούν στο συνηθισμένο σύστημα αρχείων. Διακριτικά ελέγχου ταυτότητας, ιδιωτικά κλειδιά και δεδομένα πληρωμής — μόνο επίπεδο υλικού. Ρυθμίσεις χρήστη (θέμα, γλώσσα) — αρκεί το EncryptedSharedPreferences. Δεδομένα περιόδου σύνδεσης (προσωρινές προσωρινές μνήμες) μπορούν να αποθηκευτούν στη μνήμη ή στον προσωρινό κατάλογο.
Μην αποθηκεύετε ποτέ μυστικά στον κώδικα: συμβολοσειρές με κλειδιά API, κωδικούς πρόσβασης ή φράσεις seed στον πηγαίο κώδικα — το πιο σοβαρό σφάλμα ασφαλείας. Οποιαδήποτε αντίστροφη μηχανική θα αποκαλύψει αμέσως αυτά τα δεδομένα. Χρησιμοποιήστε το Keystore για κλειδιά και για διαμόρφωση — φόρτωση διακομιστή κατά την εκκίνηση της εφαρμογής (remote config).
Χρησιμοποιήστε βιομετρική σύνδεση για κρίσιμες λειτουργίες: Το Android Keystore και το iOS Keychain υποστηρίζουν τη σύνδεση κλειδιών με βιομετρικό έλεγχο ταυτότητας. Κάθε πρόσβαση στο κλειδί ζητά Face ID, Touch ID ή βιομετρικά Android (BiometricPrompt). Αυτό εγγυάται ότι ακόμη και με πλήρη έλεγχο της συσκευής, ο επιτιθέμενος δεν μπορεί να χρησιμοποιήσει τα αποθηκευμένα δεδομένα χωρίς τον ιδιοκτήτη.
Δοκιμάστε την προστασία: χρησιμοποιήστε εργαλεία ανάλυσης ασφαλείας — MobSF (Mobile Security Framework) για στατική ανάλυση, objection για δοκιμή χρόνου εκτέλεσης και Frida για παράκαμψη προστασίας. Ελέγξτε ότι τα δεδομένα είναι μη προσβάσιμα μετά από root ή jailbreak. Το Android επιτρέπει τον έλεγχο ύπαρξης root μέσω SafetyNet Attestation ή Play Integrity API, το iOS — μέσω επαλήθευσης ακεραιότητας Secure Enclave.
Ενημερώνετε τακτικά τις βιβλιοθήκες κρυπτογράφησης: τρωτά σημεία σε βιβλιοθήκες κρυπτογράφησης ανακαλύπτονται τακτικά. Παρακολουθήστε CVE για AndroidX Security, SQLCipher και wrappers Keychain. Εφαρμόστε σύστημα αυτόματων ειδοποιήσεων για νέες εκδόσεις μέσω Dependabot ή Renovate.
Σύμφωνα με το Apple Security Research (2025), η σωστή υλοποίηση του Secure Storage αποτρέπει το 96% των επιθέσεων που στοχεύουν στην κλοπή δεδομένων από τη συσκευή. Το υπόλοιπο 4% — επιθέσεις με φυσική πρόσβαση και exploits μηδενικής ημέρας, έναντι των οποίων είναι αποτελεσματική η βιομετρική σύνδεση.
Συχνές Ερωτήσεις
iOS Keychain — κρυπτογραφημένη βάση δεδομένων για αποθήκευση κωδικών πρόσβασης, κλειδιών και πιστοποιητικών με έλεγχο πρόσβασης μέσω ACL. Android Keystore — πάροχος κρυπτογράφησης που δημιουργεί και αποθηκεύει κλειδιά σε απομονωμένο περιβάλλον (TEE/StrongBox) και δεν επιτρέπει εξαγωγή ιδιωτικού κλειδιού.
Το EncryptedSharedPreferences χρησιμοποιεί AES-256 GCM για κρυπτογράφηση τιμών και AES-256 SIV για κρυπτογράφηση κλειδιών. Το κύριο κλειδί αποθηκεύεται στο Android Keystore, παρέχοντας προστασία δύο επιπέδων. Επιπλέον, χρησιμοποιείται HMAC-SHA256 για έλεγχο ακεραιότητας.
Ναι, το HTTPS προστατεύει δεδομένα μόνο στο κανάλι μετάδοσης. Στη συσκευή, τα δεδομένα αποθηκεύονται σε ανοιχτή μορφή μετά την αποκρυπτογράφηση. Εάν ο επιτιθέμενος αποκτήσει φυσική πρόσβαση στη συσκευή ή εγκαταστήσει κακόβουλο λογισμικό, το HTTPS δεν θα προστατεύσει τα αποθηκευμένα δεδομένα. Πάντα κρυπτογραφείτε τα δεδομένα σε επίπεδο αποθήκευσης.
Χρησιμοποιήστε το Android Keystore με τη σημαία setUnlockedDeviceRequired(true), η οποία αποκλείει την πρόσβαση σε κλειδιά σε συσκευές με root. Επιπλέον, ελέγξτε την ακεραιότητα μέσω Play Integrity API και σε περίπτωση απόκλισης από τιμές αναφοράς, διαγράψτε όλα τα μυστικά από τον χώρο αποθήκευσης.
Όχι, το UserDefaults αποθηκεύει δεδομένα σε ανοιχτή μορφή σε αρχείο plist μέσα στην προστατευμένη περιοχή. Οποιαδήποτε εφαρμογή με εργαλεία αντίστροφης μηχανικής (μέσω αντιγράφου ασφαλείας ή jailbreak) μπορεί να διαβάσει τα διακριτικά. Μόνο το Keychain — το μόνο ασφαλές μέρος για αποθήκευση μυστικών στο iOS.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης