Table of Contents
Κατανόηση κρυπτογράφησης δεδομένων στο iOS
Το iOS υλοποιεί κρυπτογράφηση σε πολλαπλά στρώματα για την προστασία ευαίσθητων δεδομένων. Σε επίπεδο υλικού, το Secure Enclave διαχειρίζεται τα κλειδιά κρυπτογράφησης και κρυπτογραφικές λειτουργίες. Στο επίπεδο του λειτουργικού συστήματος, Η Προστασία Δεδομένων χρησιμοποιεί κρυπτογράφηση επιπέδου αρχείου που συνδέει τα κλειδιά αποκρυπτογράφησης με τον κωδικό πρόσβασης της συσκευής. Για συγκεκριμένα δεδομένα εφαρμογών, οι προγραμματιστές μπορούν να αξιοποιήσουν πλαίσια όπως το CryptoKit, το CommonCrypto, και το πλαίσιο ασφαλείας για την κρυπτογράφηση μεμονωμένων αρχείων, αρχείων ή ωφέλιμου φορτίου δικτύου.
Η κρυπτογράφηση μετατρέπει το απλό κείμενο σε κρυπτογραφημένο κείμενο χρησιμοποιώντας έναν αλγόριθμο και ένα κλειδί. Χωρίς το σωστό κλειδί, τα δεδομένα παραμένουν μη αναγνώσιμα. iOS Προστασία Δεδομένων API κρυπτογραφεί αυτόματα αρχεία σε ηρεμία, αλλά οι προγραμματιστές χρειάζονται ρητή κρυπτογράφηση για δεδομένα που αποθηκεύονται εκτός του προστατευμένου συστήματος αρχείων ⁇ όπως στα δεδομένα πυρήνα, τα προεπιλεγμένα από το χρήστη, ή προσαρμοσμένες κρύπτες.
Το βασικό takeaway: κρυπτογραφεί ευαίσθητα δεδομένα όποτε βρίσκεται στη συσκευή, ακόμα και αν η κρυπτογράφηση iOS είναι ενεργοποιημένη από προεπιλογή. Αυτό εξασφαλίζει προστασία από φυσική πρόσβαση συσκευών, εγκληματολογική εξαγωγή, ή κακόβουλες εφαρμογές που τρέχουν στο ίδιο sandbox.
Πλαίσιο κρυπτογράφησης iOS και APIs
Η Apple παρέχει αρκετές κρυπτογραφικές βιβλιοθήκες. Επιλέγοντας τη σωστή εξαρτάται από τον στόχο ανάπτυξης και το επίπεδο ελέγχου που απαιτείται.
Κρυπτοκυτ ⁇ Σύγχρονο Swift API
Εισάγεται στο iOS 13, το CryptoKit προσφέρει μια διεπαφή Swift-native για τη συμμετρική και ασύμμετρη κρυπτογραφία, το hashing και τη βασική συμφωνία. Χρησιμοποιεί [AES-GCM για αυθεντική κρυπτογράφηση, η οποία προστατεύει τόσο την εμπιστευτικότητα όσο και την ακεραιότητα. Παρακάτω είναι ένα τυπικό μοτίβο κρυπτογράφησης και αποκρυπτογράφησης:
import CryptoKit
func encryptSensitiveData(_ plaintext: String, using key: SymmetricKey) throws -> Data {
let inputData = Data(plaintext.utf8)
let sealedBox = try AES.GCM.seal(inputData, using: key)
return sealedBox.combined
}
func decryptSensitiveData(_ encryptedData: Data, using key: SymmetricKey) throws -> String {
let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)
let decryptedData = try AES.GCM.open(sealedBox, using: key)
return String(decoding: decryptedData, as: UTF8.self)
}
Πάντα αποθηκεύετε το στο Κλειδί, όχι στο UserDefaults ή σε ένα απλό αρχείο. Χρησιμοποιήστε με για να συνδέσετε το κλειδί με τη συσκευή και την παρουσία του χρήστη.
Κοινό Κρυπτο- C- Βασιζόμενη ευελιξία
Για εφαρμογές που υποστηρίζουν παλαιότερες εκδόσεις iOS ή απαιτούν προσαρμοσμένες λειτουργίες κρυπτογράφησης μπλοκ (π.χ. CBC με HMAC), το CommonCrypto παρέχει λειτουργίες χαμηλού επιπέδου C. Υποστηρίζει AES, DES, 3DES, και διάφορους αλγόριθμους hashing. Παράδειγμα κρυπτογράφησης AES-CBC:
#include <CommonCrypto/CommonCryptor.h>
- (NSData *)aes256Encrypt:(NSData *)plaintext withKey:(NSData *)key iv:(NSData *)iv {
size_t outLength;
NSMutableData *ciphertext = [NSMutableData dataWithLength:plaintext.length + kCCBlockSizeAES128];
CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
key.bytes, key.length, iv.bytes,
plaintext.bytes, plaintext.length,
ciphertext.mutableBytes, ciphertext.length,
&outLength);
if (status == kCCSuccess) {
ciphertext.length = outLength;
return ciphertext;
}
return nil;
}
Το CommonCrypto απαιτεί χειροκίνητη διαχείριση των διανυσματικών οργάνων αρχικοποίησης (IVs) και των ετικετών ταυτοποίησης. Για αυθεντική κρυπτογράφηση, ζεύγους AES-CBC με ξεχωριστό HMAC, ή μετάβαση σε AES-GCM μέσω CryptoKit όταν είναι δυνατόν.
Πλαίσιο ασφαλείας και μπρελόκ
Το πλαίσιο ασφαλείας παρέχει υπηρεσίες Keychain για ασφαλή αποθήκευση κλειδιών, πιστοποιητικών και κωδικών πρόσβασης. Χρησιμοποιήστε [[[LFT:5]] για να αποθηκεύσετε κλειδιά με αυστηρούς ελέγχους πρόσβασης (π.χ., απαιτείται η παρουσία χρήστη μέσω βιομετρικών στοιχείων). Το Secure Enclave μπορεί να δημιουργήσει και να αποθηκεύσει ιδιωτικά κλειδιά για τις λειτουργίες ECC, εξασφαλίζοντας ότι το κλειδί δεν αφήνει ποτέ το υλικό.
Εφαρμογή κρυπτογράφησης για διαφορετικούς τύπους δεδομένων
Δεν χρειάζονται όλα τα δεδομένα την ίδια στρατηγική κρυπτογράφησης.
Κρυπτογράφηση προκαθορισμένων χρηστών και βασικών δεδομένων
Τα αρχεία SQLite είναι απλά αρχεία, εκτός αν κρυπτογραφηθούν. Για τα δεδομένα πυρήνα, ενεργοποιήστε το [[LPT:0]]NSFileProtectionType[[LFT:1]] χαρακτηριστικό στο αρχείο αποθήκευσης. Για λεπτότερη κοκκιοποίηση, κρυπτογραφήστε μεμονωμένα χαρακτηριστικά ή ολόκληρα αντικείμενα πριν αποθηκεύσετε:
- Χρήση βασικών δεδομένων μετασχηματισμένα [ χαρακτηριστικά με προσαρμοσμένο μετασχηματιστή αξίας που κρυπτογραφεί/αποκρυπτογραφεί σε ανάγνωση/γραφή.
- Κατ' επανάληψιν ολόκληρο το αντικείμενο ως JSON, κρυπτογραφήστε το, και αποθηκεύστε το κρυπτογραφημένο κείμενο σε ένα δυαδικό χαρακτηριστικό.
- Για το χρήστηΠροκαθορισμένα, ποτέ μην αποθηκεύετε ωμές ευαίσθητες χορδές. Κρυπτογράφηση κάθε τιμής και αποθήκευση των κρυπτογραφημένων δεδομένων.
Παράδειγμα αποθήκευσης κρυπτογραφημένων δεδομένων στο χρήστηΠροκαθορισμένα:
let key = SymmetricKey(size: .bits256)
let data = "user_ssn".data(using: .utf8)!
let sealedBox = try AES.GCM.seal(data, using: key)
UserDefaults.standard.set(sealedBox.combined, forKey: "encrypted_ssn")
UserDefaults.standard.synchronize()
Κρυπτογράφηση αρχείων με προστασία αρχείων
Το iOS προσφέρει κατηγορίες προστασίας σε επίπεδο αρχείου: , και . Ορίστε αυτές τις ιδιότητες κατά τη δημιουργία ή τη μετακίνηση αρχείων:
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)
Συνδυάστε την προστασία αρχείων με ρητή κρυπτογράφηση εάν τα δεδομένα πρέπει να παραμείνουν προστατευμένα ακόμα και όταν η συσκευή είναι ξεκλείδωτη. Για παράδειγμα, κρυπτογραφήστε το αρχείο με ένα κλειδί αποθηκευμένο στο Κλειδί και προσβάσιμο μόνο μετά την ταυτοποίηση.
Κρυπτογράφηση δεδομένων δικτύου (Ασφάλεια στρώματος μεταφορών)
Για προσαρμοσμένες συνδέσεις TCP, χρησιμοποιήστε [[LPT:11]] με TLS ή εφαρμόστε το SSL pining για την πρόληψη ανθρωπο-στο-μεσαίο επιθέσεις. Κρυπτογράφηση του ωφέλιμου φορτίου στο στρώμα εφαρμογής για επιπλέον άμυνα-σε-βαθύ: ακόμη και αν TLS είναι σε κίνδυνο, τα δεδομένα παραμένουν προστατευμένα.
Βασικές βέλτιστες πρακτικές διαχείρισης
Η κρυπτογράφηση είναι τόσο ισχυρή όσο και η διαχείριση κλειδιών. Ακολουθήστε αυτές τις οδηγίες για να διατηρήσετε την ασφάλεια:
- Γεννήστε τα πλήκτρα χρησιμοποιώντας κρυπτογραφικά ασφαλή γεννήτρια τυχαίων αριθμών ⁇ Χρησιμοποιήστε ή .
- Κλειδί στο Keychain με τα κατάλληλα χαρακτηριστικά προσβασιμότητας: εμποδίζει το εφεδρικό και συνδέει το κλειδί με τη συσκευή.
- Χρησιμοποιήστε βιομετρική ταυτοποίηση ή ταυτοποίηση κωδικού πρόσβασης πριν ανακτήσετε το κλειδί ⁇ με αναγκάζει την επαλήθευση χρήστη.
- Rotate κλειδιά σε ένα πρόγραμμα ή μετά από μια εκδήλωση ασφαλείας ⁇ Επανακρυπτογράφηση δεδομένων με νέα κλειδιά και με ασφάλεια διαγράψτε τα παλιά κλειδιά.
- Μην χρησιμοποιείτε πλήκτρα σκληρού κώδικα σε αρχεία πηγαίου κώδικα ή διαμόρφωσης. Παράγωγα κλειδιά από κωδικούς πρόσβασης χρήστη χρησιμοποιώντας μια αργή λειτουργία βασικής παραποίησης (PBKDF2 ή κρυπτογράφηση) όταν είναι απαραίτητο.
- Μεταποίηση του ασφαλούς εγκλωβισμού[ για ασύμμετρη παραγωγή κλειδιών ⁇ τα ιδιωτικά κλειδιά δεν μπορούν να εξαχθούν, εμποδίζοντας την εξώθηση.
Για εφαρμογές που χειρίζονται εξαιρετικά ευαίσθητα δεδομένα, εξετάστε τη χρήση μιας μονάδας ασφάλειας υλικού (HSM) μέσω δικτυακών υπηρεσιών, αν και αυτό εισάγει λανθάνουσα ισχύ και απαιτεί συνδεσιμότητα στο διαδίκτυο.
Περιστροφή κλειδιού και επανακρυπτογράφηση
Όταν ένα κλειδί είναι σε κίνδυνο ή μετά από μια καθορισμένη περίοδο (π.χ., κάθε 90 ημέρες), περιστρέφονται το κλειδί. Αυτό περιλαμβάνει την αποκρυπτογράφηση όλων των δεδομένων με το παλιό κλειδί, δημιουργώντας ένα νέο κλειδί, και επανακρυπτογράφηση. Για μεγάλα σύνολα δεδομένων, υλοποιήστε ένα εκδομένο βασικό σχήμα:
- Αποθηκεύστε ένα αναγνωριστικό κλειδιού (π.χ., UUID) παράλληλα με κάθε κρυπτογραφημένη εγγραφή.
- Διατήρηση χαρτογράφησης των αναγνωριστικών κωδικών στα πραγματικά κλειδιά της αλυσίδας κλειδιών (κρυπτογραφημένη σε ηρεμία).
- Κατά τη διάρκεια της περιστροφής, προσθέστε μια νέα καταχώρηση χωρίς να επανα-κρυπτογραφήσετε αμέσως όλα τα δεδομένα. Επανακρυπτογραφήστε με τεμπελιά κατά την πρόσβαση.
Συμμόρφωση και κανονιστική εξέταση
Πολλοί κανονισμοί ορίζουν κρυπτογράφηση για ευαίσθητα δεδομένα. GDPR[ απαιτεί κατάλληλα τεχνικά μέτρα, και η κρυπτογράφηση είναι αναγνωρισμένη τεχνική ψευδονυμοποίησης. Η HIPA εξουσιοδοτεί κρυπτογράφηση του ePHI σε ηρεμία και σε διαμετακόμιση. Η PCI DSS] απαιτεί κρυπτογράφηση δεδομένων κατόχου καρτών. Στο iOS, ακολουθώντας τις οδηγίες προστασίας δεδομένων της Apple σε συνδυασμό με κρυπτογράφηση εφαρμογών-στρωμάτων ικανοποιεί τις περισσότερες απαιτήσεις συμμόρφωσης. Εγγράψτε την εφαρμογή κρυπτογράφησης, βασικές πολιτικές κύκλου ζωής και τις διαδρομές ελέγχου για αναθεώρηση των ρυθμιστικών αρχών.
Ανατρέξτε στην επίσημη τεκμηρίωση της Apple για τις τελευταίες συστάσεις: CryptoKit Developer Guide, Keychain Services, και Προστατεύοντας το απόρρητο του χρήστη[]. Για τις οδηγίες της βιομηχανίας, δείτε [OWASP Mobile Security Testing Guide[ και NIST SP 800-175B ⁇ Cryptographic Standards.
Δοκιμή και επικύρωση
Μετά την εφαρμογή κρυπτογράφησης, επαληθεύστε ότι λειτουργεί σωστά:
- Γράψτε τις δοκιμές μονάδων που κρυπτογραφούν και αποκρυπτογραφούν γνωστά απλά κείμενα και να διεκδικήσουν εξόδους.
- Δοκιμές περιπτώσεις άκρη: άδεια δεδομένα, πολύ μεγάλα ωφέλιμο φορτίο, και αλλοιωμένα κρυπτογραφημένα κείμενα.
- Εκτελέστε δοκιμές ασφάλειας χρησιμοποιώντας μια συσκευή jailbreaked για την προσομοίωση σεναρίων επίθεσης ⁇ εβεβαιώστε ότι τα κλειδιά παραμένουν απρόσιτα χωρίς πιστοποίηση.
- Χρησιμοποιήστε εργαλεία στατικής ανάλυσης για να εξασφαλίσετε ότι δεν υπάρχουν σκληρούς κωδικοποιημένους ή αδύναμους αλγόριθμους.
- Επανεξέταση αρχείων καταγραφής ⁇ ποτέ μην καταγράφετε ευαίσθητα δεδομένα ή κλειδιά κρυπτογράφησης.
Συμπέρασμα
Η εφαρμογή κρυπτογράφησης δεδομένων για την ευαίσθητη αποθήκευση δεδομένων iOS είναι μια διαδικασία με πολλά στρώματα. Συνδυάζοντας την προστασία αρχείων iOS, κρυπτογράφηση εφαρμογών-layer με CryptoKit ή CommonCrypto, και αυστηρή διαχείριση κλειδιών μέσω του Keychain και Secure Enclave, οι προγραμματιστές μπορούν να μειώσουν σημαντικά τον κίνδυνο έκθεσης δεδομένων. Η συμμόρφωση με κανονισμούς όπως το GDPR και το HIPAA απαιτεί τεκμηριωμένες, ελεγκτικές πρακτικές κρυπτογράφησης. Τακτικές δοκιμές και περιστροφή κλειδιών εξασφαλίζουν μακροπρόθεσμη ασφάλεια. Η επένδυση σε μια ισχυρή αρχιτεκτονική κρυπτογράφησης όχι μόνο προστατεύει τα δεδομένα των χρηστών αλλά επίσης δημιουργεί εμπιστοσύνη και ανταποκρίνεται στις κανονιστικές προσδοκίες.