Πώς μπορεί ένας διακομιστής να αποθηκεύει και να συγχρονίζει τα μυστικά μας χωρίς να κρατά τα κλειδιά για να τα διαβάσει; Θα παρακολουθήσουμε πώς το Confidex δημιουργεί τα κλειδιά του, τα προστατεύει σε μια κλειδαριά και τα χρησιμοποιεί για την κρυπτογράφηση δεδομένων και την επαλήθευση των αλλαγών.
Λουκέτο
Μόνο ο Εκλεκτός μπορεί να ανοίξει την πόρτα
Το Matrix επαναφορτώθηκε
Φανταστείτε ότι κατασκευάζουμε ένα εικονικό vault για την αποθήκευση μυστικών δεδομένων. Πρέπει να διατηρήσει αυτά τα δεδομένα σε φορητό υπολογιστή μετά το κλείσιμο της εφαρμογής και να μας αφήσει να τα ανοίξουμε σε άλλη συσκευή. Το θησαυροφυλάκιο θα χρειαστεί τα δικά του κλειδιά. Πρέπει να τα αποθηκεύσουμε έτσι ώστε η αντιγραφή των αρχείων να μην δίνει σε κάποιον άλλο τρόπο να διαβάσει ή να αλλάξει το περιεχόμενό τους.
Ένα lock προστατεύει τα κλειδιά: ένα μικρό κρυπτογραφημένο αρχείο. Το άνοιγμά του απαιτεί έναν κύριο κωδικό πρόσβασης και έναν μυστικό κωδικό, secret_key; ούτε υπάρχει στο ίδιο το αρχείο. Θα μπορούσαμε να τυπώσουμε ολόκληρη την κλειδαριά στην πρωινή εφημερίδα. Οι αναγνώστες θα έπαιρναν ένα αντίγραφο, αλλά η δημοσίευσή του δεν θα αποκάλυπτε τα ιδιωτικά κλειδιά.
Ας υποθέσουμε ότι ένας ξένος λαμβάνει αυτό το αρχείο και μαθαίνει ακόμη και τον κύριο κωδικό πρόσβασης. Τώρα μπορούν να επαναλάβουν κάθε υπολογισμό που χρειάζεται μόνο τον κωδικό πρόσβασης, αλλά αυτοί οι υπολογισμοί δεν θα παράγουν το κλειδί που ανοίγει την κλειδαριά: Το secret_key είναι επίσης μια είσοδος. Το αρχείο δεν περιέχει ξεχωριστό έλεγχο μόνο του κωδικού πρόσβασης. Το άνοιγμά του εξακολουθεί να απαιτεί τον άγνωστο μυστικό κωδικό.
Αυτός ο κώδικας προέρχεται από κρυπτογραφικά τυχαία δεδομένα. ένα άτομο δεν το επινοεί. Εφόσον το secret_key είναι άγνωστο, ακόμη και ένας σωστά εικασμένος κύριος κωδικός πρόσβασης δεν ανοίγει το κλείδωμα: ο εισβολέας εξακολουθεί να μην έχει ένα τυχαίο μυστικό. Επομένως, μόνο ένας αδύναμος κωδικός πρόσβασης δεν μετατρέπει το αντίγραφο του διακομιστή σε πρακτική επίθεση λεξικού.
Εάν ο εισβολέας λάβει επίσης secret_key, μπορεί να δοκιμάσει τις εικασίες του κύριου κωδικού πρόσβασης εκτός σύνδεσης. Αυτό είναι δαπανηρό, αλλά η τελική δυσκολία εξαρτάται από την ισχύ του κωδικού πρόσβασης.
Κλειδιά
Κύριοι, τι κάνουν τα κλειδιά; Κλειδιά… ξεκλειδώνω πράγματα;
Πειρατές της Καραϊβικής: Το σεντούκι του νεκρού
Η εφαρμογή λαμβάνει 32 τυχαία byte από την κρυπτογραφική γεννήτρια του λειτουργικού συστήματος και τα προετοιμάζει για χρήση ως κλειδί. Αυτά τα προετοιμασμένα byte είναι το ιδιωτικό κύριο κλειδί, master_key.
Η εφαρμογή αντλεί πάντα τα ίδια κλειδιά από το master_key: η επανάληψη των ίδιων υπολογισμών στα ίδια byte δίνει το ίδιο αποτέλεσμα. Επομένως, ένας φορητός υπολογιστής και ένα τηλέφωνο μπορούν να ανακτήσουν τα ίδια κλειδιά. Για να αποκτήσετε το master_key σε μια νέα συσκευή, η εφαρμογή πρέπει πρώτα να ανοίξει το κλείδωμα με τον κύριο κωδικό πρόσβασης και secret_key.
Το πρώτο ζεύγος: κρυπτογράφηση
Είμαι ο Keymaster.
Ghostbusters
Για την αποθήκευση κρυπτογραφημένων δεδομένων, η εφαρμογή υπολογίζει ένα δημόσιο κλειδί από το master_key: secret_key. Μπορεί να κρυπτογραφήσει δεδομένα για το θησαυροφυλάκιο, ενώ η αποκρυπτογράφηση απαιτεί master_key.
Το "Public" περιγράφει τον ρόλο αυτού του κλειδιού στον αλγόριθμο, όχι την υποχρέωση να το δώσουμε σε όλους. Στο Confidex παραμένει στον χρήστη. Είναι επίσης το δεύτερο μυστικό που χρειάζεται για να ανοίξει η κλειδαριά, επομένως παραμένει τοπική και δεν αποστέλλεται μέσω του δικτύου. Από μόνο του, το secret_key επιτρέπει σε κάποιον να κρυπτογραφήσει δεδομένα για το θησαυροφυλάκιο, αλλά όχι να τα αποκρυπτογραφήσει ή να υπογράψει αλλαγές για λογαριασμό του.
Ο X25519 είναι ο αλγόριθμος που παίρνει το master_key και υπολογίζει το secret_key. Η ανάκτηση του master_key από το secret_key είναι πρακτικά ανέφικτη. Μια κλασική επίθεση σε έναν φανταστικό υπερυπολογιστή που εκτελεί ένα δισεκατομμύριο δισεκατομμύρια λειτουργίες καμπύλης ανά δευτερόλεπτο θα χρειαζόταν περίπου 2,3 τρισεκατομμύρια χρόνια κατά μέσο όρο (εκτίμηση SafeCurves).
Το δεύτερο ζευγάρι: υπογραφές
Το μόνο πρωτότυπο είναι η υπογραφή
Πιάσε με αν μπορείς
Το πρώτο ζεύγος βοηθά στην απόκρυψη του περιεχομένου. Τώρα χρειαζόμαστε έναν τρόπο για να επιβεβαιώσουμε ότι ο ιδιοκτήτης του θησαυροφυλάκιου εξουσιοδότησε μια αλλαγή. Ο διακομιστής πρέπει επίσης να μπορεί να ελέγχει τις υπογραφές, επομένως πρέπει να του στείλουμε ένα δημόσιο κλειδί επαλήθευσης. Το δημόσιο μέρος του πρώτου ζεύγους είναι secret_key, το οποίο ο διακομιστής δεν πρέπει να λάβει. Επομένως, δημιουργούμε ένα δεύτερο, μόνιμο ζεύγος κλειδιών για υπογραφές.
Αντί να αποθηκεύσουμε ένα άλλο ανεξάρτητο μυστικό, αντλούμε ένα ιδιωτικό κλειδί υπογραφής από το master_key και το ονομάζουμε signing_key. Η εφαρμογή το χρησιμοποιεί για να υπογράψει δεδομένα και το κλείδωμα. Άλλες συσκευές και ο διακομιστής χρησιμοποιούν το δημόσιο τμήμα του για να ελέγχουν τις υπογραφές χωρίς να διαβάζουν τα περιεχόμενα.
Μπορούμε να ανακτήσουμε αυτό το ζεύγος από το ίδιο master_key. Η εφαρμογή αντλεί μια αρχική τιμή από αυτήν: 32 byte που καθορίζουν μοναδικά το κλειδί υπογραφής.
Για να εξαγάγουμε διαφορετικά κλειδιά για διαφορετικές εργασίες, συμπεριλαμβάνουμε μια σταθερή ετικέτα στον υπολογισμό: εδώ, confidex/vault/ed25519/v1. Το ίδιο master_key και η ίδια ετικέτα παράγουν πάντα το ίδιο κλειδί.
Ο κύριος κωδικός πρόσβασης δεν έχει εισαγάγει αυτούς τους υπολογισμούς. Και τα δύο ζεύγη εξαρτώνται από τα τυχαία byte του master_key, όχι από μια συμβολοσειρά που εφευρέθηκε από ένα άτομο. Αυτή η διάκριση θα έχει σημασία αργότερα: ο κωδικός πρόσβασης θα προστατεύει την πρόσβαση σε κλειδιά που ήδη υπάρχουν, ώστε να μπορούμε να τον αλλάξουμε χωρίς να αλλάξουμε τα ίδια τα κλειδιά.
Η παραγωγή χρησιμοποιεί μια συνάρτηση παραγωγής κλειδιού που βασίζεται σε κατακερματισμό: HKDF, HMAC-based Extract-and-Expand Key Derivation Function. Το Confidex το χρησιμοποιεί με SHA-256, εξ ου και το όνομα HKDF-SHA256. Τα 32 byte που προκύπτουν είναι τα seed για το ζεύγος Ed25519. Το δημόσιο μέρος του signing_key δεν αποκαλύπτει το secret_key, επομένως μπορούμε να το στείλουμε στον διακομιστή για επαλήθευση υπογραφής.
Τι είναι ένα αρχείο κλειδώματος και τι κάνει;
Ανοίξτε τις πόρτες της θήκης, HAL.
Μια Οδύσσεια του Διαστήματος
Συγγνώμη, Ντέιβ. Φοβάμαι ότι δεν μπορώ να το κάνω αυτό.
Η κλειδαριά αποθηκεύει ένα κρυπτογραφημένο master_key. Για το άνοιγμά του απαιτείται ο κύριος κωδικός πρόσβασης και secret_key. Η δημόσια κεφαλίδα περιέχει την έκδοση μορφής, το αναγνωριστικό αποθήκευσης, το δημόσιο τμήμα του signing_key, ένα salt και τις παραμέτρους επεξεργασίας κωδικού πρόσβασης. Η έκδοση εσωτερικής μορφής είναι κρυπτογραφημένη μαζί με το master_key.
Κατά τη δημιουργία της κλειδαριάς, η εφαρμογή έχει ήδη master_key, επομένως υπολογίζει το secret_key πριν από την κρυπτογράφηση. Όταν το ανοίγει, ο χρήστης παρέχει το secret_key ξεχωριστά: απουσιάζει από το δημόσιο αντίγραφο της κλειδαριάς.
Μετά την αποκρυπτογράφηση, η εφαρμογή υπολογίζει το δημόσιο τμήμα του master_key χρησιμοποιώντας το X25519 και απαιτεί να ταιριάζει με το secret_key. Στη συνέχεια ανακτά το signing_key και συγκρίνει το δημόσιο τμήμα του με το κλειδί στην κεφαλίδα. Με αυτόν τον τρόπο, η κλειδαριά ελέγχει μόνη της.
Για να επιβραδυνθεί η εικασία του κύριου κωδικού πρόσβασης, κάθε προσπάθεια πρέπει να κοστίζει χρόνο και μνήμη. Το Confidex χρησιμοποιεί Argon2id με 64 MiB μνήμης και τρία περάσματα. Η επεξεργασία κωδικού πρόσβασης χρησιμοποιεί επίσης ένα τυχαίο αλάτι. Το αλάτι δεν είναι μυστικό: κάνει τον ίδιο κωδικό πρόσβασης να παράγει διαφορετικά αποτελέσματα σε διαφορετικές κλειδαριές.
Εάν το secret_key είναι ήδη γνωστό, το μήκος του κωδικού πρόσβασης αλλάζει δραματικά την κλίμακα μιας επίθεσης. Υπάρχουν περίπου 12 εκατομμύρια συνδυασμοί 5 τυχαίων πεζών λατινικών γραμμάτων, περίπου 8 δισεκατομμύρια από 7 και περίπου 9,5 × 10¹⁶ από 12. Η μετάβαση από 7 σε 12 γράμματα αυξάνει τον χώρο αναζήτησης σχεδόν 12 εκατομμύρια φορές. Αν η αναζήτηση 7 γραμμάτων χρειαζόταν μια μέρα κατά μέσο όρο σε μια δεδομένη μηχανή, 5 θα χρειάζονταν περίπου δύο λεπτά και 12 περίπου 33.000 χρόνια.
Για να λάβουμε ένα κλειδί από το αποτέλεσμα Argon2id και secret_key, χρησιμοποιούμε τη συνάρτηση HKDF-SHA256 που παρουσιάστηκε νωρίτερα, με την ετικέτα confidex/lock/wrap/v1. Το αποτέλεσμα είναι το wrapping_key, το κλειδί που κρυπτογραφεί την κλειδαριά.
Πρέπει να κρύψουμε το master_key και να το προστατέψουμε από παραποίηση. Το XChaCha20-Poly1305 το κρυπτογραφεί με wrapping_key και προσθέτει μια ετικέτα ελέγχου ταυτότητας. Η ετικέτα δεσμεύει το κρυπτογραφημένο κείμενο στη δημόσια κεφαλίδα: ένας λάθος κωδικός πρόσβασης ή μια αλλαγή στα προστατευμένα byte κάνει το άνοιγμα να αποτύχει. Η ετικέτα και μια τυχαία τιμή μίας χρήσης, το nonce, αποθηκεύονται μαζί με το κρυπτογραφημένο κείμενο.
Κάθε φορά που δημιουργείται ή κρυπτογραφείται ξανά το κλείδωμα, η εφαρμογή λαμβάνει ένα νέο αλάτι και nonce. Τα κρυπτογραφημένα περιεχόμενα περιλαμβάνουν ένα byte έκδοσης και τα 32 byte του master_key. μια ετικέτα 24 byte nonce και μια ετικέτα 16 byte αποθηκεύονται δίπλα τους. Η τεκμηρίωση του αλγόριθμου περιγράφει την κατασκευή.
Μια αναντιστοιχία μεταξύ των κλειδιών που ανακτήθηκαν μπορεί να προκύψει από μια εσκεμμένα κακή μορφή κλειδώματος ή ένα σφάλμα στο πρόγραμμα που το δημιούργησε. Η τυχαία καταστροφή byte εντοπίζεται συνήθως νωρίτερα, όταν ελέγχεται η ετικέτα.
Ο διακομιστής δεν έχει τα μυστικά που απαιτούνται για τον έλεγχο αυτής της ετικέτας. Για να μεταφέρει το κλείδωμα, η εφαρμογή προσθέτει μια υπογραφή με signing_key. Καλύπτει ολόκληρο το ολοκληρωμένο αρχείο, συμπεριλαμβανομένης της δημόσιας κεφαλίδας και του κρυπτογραφημένου περιεχομένου. Ο διακομιστής ελέγχει την υπογραφή και, κατά την πρώτη μεταφόρτωση, καρφιτσώνει το πλήρες δημόσιο τμήμα του signing_key και το εσωτερικό αναγνωριστικό θησαυροφυλακίου. Ελέγχει τις επόμενες αλλαγές σε αυτό το κλειδί. Το κλείδωμα και τα κρυπτογραφημένα δεδομένα υπογράφονται με το ίδιο signing_key, που ανακτάται από το master_key.
Το θησαυροφυλάκιο
Μπορούμε τώρα να δημοσιεύσουμε την κλειδαριά. Μόνο κάποιος που γνωρίζει το secret_key και το master password μπορεί να διαβάσει το master_key, ενώ οποιοσδήποτε μπορεί να πάρει το δημόσιο κλειδί υπογραφής από το αρχείο κλειδώματος και να ελέγξει τα υπογεγραμμένα δεδομένα χωρίς να δει τα περιεχόμενα της κλειδαριάς ή των δεδομένων.
Σκεφτείτε έναν κωδικό πρόσβασης, SuperPa55worD. Προς το παρόν, θέλουμε μόνο να το αποθηκεύσουμε: μετά το κλείσιμο της εφαρμογής, θα πρέπει να μπορούμε να στείλουμε το αρχείο κλειδώματος και τον κρυπτογραφημένο κωδικό πρόσβασης οπουδήποτε χωρίς να δει κανείς το SuperPa55worD, ενώ θα του επιτρέψουμε να επαληθεύσει την ιδιότητά μας. Η κρυπτογράφηση πρέπει να είναι αναστρέψιμη όταν έχουμε secret_key και master password. Ένας συμμετρικός κρυπτογράφηση μπορεί να κρυπτογραφήσει και να αποκρυπτογραφήσει με το ίδιο κλειδί. Εφόσον δεν αποθηκεύουμε αυτό το κλειδί, πρέπει να μπορούμε να το ανακτήσουμε χρησιμοποιώντας την κλειδαριά. Θα το ονομάσουμε message_key.
Θα λάβουμε ξεχωριστό message_key για κάθε νέα κρυπτογράφηση. Πρέπει ακόμα να κανονίσουμε την ανάκτησή του: αφήνοντας το κλειδί ανοιχτό δίπλα στο κρυπτογραφημένο κείμενο θα επιτρέψει σε όποιον είχε ένα αντίγραφο να διαβάσει τα πάντα.
Από φρέσκα τυχαία byte, η εφαρμογή δημιουργεί ένα προσωρινό ζεύγος X25519 μόνο για αυτήν την κρυπτογράφηση: record_key. Στη συνέχεια, παίρνει το ιδιωτικό μέρος του record_key και το μόνιμο δημόσιο κλειδί του θησαυροφυλακίου, secret_key, και υπολογίζει ένα κοινό μυστικό. Μια ξεχωριστή συνάρτηση προέρχεται από το message_key από αυτό το μυστικό. αυτό το κλειδί κρυπτογραφεί τον κωδικό πρόσβασής μας.
Κατά την ανάγνωση, η εφαρμογή ακολουθεί άλλη διαδρομή. Χρησιμοποιεί το master_key και το δημόσιο τμήμα του record_key. Αυτά τα δύο κλειδιά παράγουν το ίδιο κοινό μυστικό. Μαθηματικά, και οι δύο διαδρομές πολλαπλασιάζουν το ίδιο αρχικό σημείο στην καμπύλη με δύο ιδιωτικούς αριθμούς, με διαφορετική σειρά. Η σειρά δεν αλλάζει το αποτέλεσμα. Μπορούμε επομένως να ανακτήσουμε το κλειδί αποκρυπτογράφησης χωρίς να διατηρήσουμε το ιδιωτικό τμήμα του record_key.
Η απόκτηση αυτού του μυστικού από τα δύο δημόσια κλειδιά είναι πρακτικά αδύνατη: κάθε διαδρομή χρειάζεται το αντίστοιχο ιδιωτικό κλειδί. Τα δημόσια σημεία δεν μας επιτρέπουν να ανακτήσουμε αποτελεσματικά τους ιδιωτικούς αριθμούς που τους παρήγαγαν. Αυτό το μαθηματικό τέχνασμα στηρίζει την ασφάλεια του θησαυροφυλάκιου. Αλλά δεν εμποδίζει κάποιον να μας δώσει ένα διαφορετικό θησαυροφυλάκιο με την κλειδαριά μας συνδεδεμένη σε αυτό.
Μπορούμε τώρα να αποθηκεύσουμε το κρυπτογραφημένο κείμενο δίπλα στο δημόσιο τμήμα του record_key. Το ιδιωτικό μέρος του record_key και το χρησιμοποιημένο message_key δεν χρειάζονται πλέον για μελλοντική ανάγνωση. Αργότερα, η εφαρμογή ανακτά το κλειδί αποκρυπτογράφησης από το master_key και το αποθηκευμένο δημόσιο τμήμα του record_key. Ένα μόνιμο μυστικό θησαυροφυλάκιο μπορεί έτσι να αποκρυπτογραφήσει πολλές ξεχωριστά κρυπτογραφημένες τιμές, καθεμία με το δικό της message_key που ανακτάται όταν χρειάζεται.
Η απόκρυψη του κειμένου δεν αρκεί: πρέπει επίσης να εντοπίσουμε παραποίηση κατά την ανάγνωση. Επομένως, η κρυπτογράφηση προσθέτει μια ετικέτα ελέγχου ταυτότητας, μια σύντομη τιμή που ελέγχεται μαζί με τα κρυπτογραφημένα δεδομένα. Εάν ο έλεγχος αποτύχει, η εφαρμογή απορρίπτει το αποτέλεσμα. Δεν πρέπει να εμφανίζει τυχαίο ή τροποποιημένο κείμενο ως επιτυχώς αποκρυπτογραφημένο κωδικό πρόσβασης.
Περιγράψαμε μια κατασκευή στην οποία ένα ασύμμετρο ζεύγος βοηθά στη δημιουργία ενός κοινόχρηστου μυστικού, ενώ το message_key κρυπτογραφεί τα περιεχόμενα. Αυτό ονομάζεται Hybrid Public Key Encryption ή HPKE και προσδιορίζεται στο RFC 9180. Το Confidex χρησιμοποιεί το X25519 για να συμφωνήσει σχετικά με το μυστικό, το HKDF-SHA256 για την παραγωγή κλειδιών και το ChaCha20-Poly1305 για την κρυπτογράφηση με έλεγχο ακεραιότητας. Εδώ, ο HKDF παίρνει το κοινό μυστικό που συμφωνήθηκε χρησιμοποιώντας το ζεύγος record_key και master_key. Αυτή είναι μια ξεχωριστή εργασία από την παραγωγή του Ed25519 seed. Το RFC 5869 περιγράφει το HKDF.
Για την επόμενη κρυπτογράφηση, η εφαρμογή δημιουργεί ένα νέο record_key και ένα νέο περιβάλλον HPKE. Η επαναχρησιμοποίηση ενός συνδυασμού message_key και nonce σπάει την προστασία του κρυπτογράφησης. Στο Confidex, το κλειδί και το nonce προέρχονται από το HPKE, χρησιμοποιούνται για ένα μήνυμα και, στη συνέχεια, το περιβάλλον απορρίπτεται.
Το ίδιο το ChaCha20 χρησιμοποιεί ένα 256-bit message_key. Για να έχετε την αίσθηση μιας άμεσης επίθεσης, φανταστείτε έναν φανταστικό υπερυπολογιστή να δοκιμάζει ένα δισεκατομμύριο δισεκατομμύρια υποψηφίους ανά δευτερόλεπτο. Η αναζήτηση των 2²⁵⁶ πιθανών κλειδιών θα διαρκέσει περίπου 1,8 × 10⁵¹ χρόνια. Το RFC 8439 περιγράφει τον αλγόριθμο και την ανάλυσή του.
Ένα ρεκόρ
Είμαστε χαρούμενοι;
Pulp Fiction
Έχουμε αποθηκεύσει τον κωδικό πρόσβασης, αλλά η σύνδεση σε έναν ιστότοπο συνήθως απαιτεί επίσης ένα όνομα χρήστη και μια διεύθυνση. Μερικές φορές χρειαζόμαστε ένα σημείωμα δίπλα τους. Εάν αποθηκεύσουμε αυτές τις τιμές χωριστά, η εφαρμογή πρέπει με κάποιο τρόπο να θυμάται ότι ανήκουν μαζί. Ας βάλουμε αυτά τα «χαρτιά» σε ένα φάκελο. Συνδυάζουμε τα πεδία σε μια συλλογή και την ονομάζουμε record.
Μια εγγραφή μπορεί να περιέχει οποιονδήποτε συνδυασμό πεδίων. Η εφαρμογή τα συγκεντρώνει σε ένα πακέτο, το συμπιέζει και κρυπτογραφεί το σύνολο χρησιμοποιώντας την κατασκευή που μόλις περιγράψαμε. Οι τιμές πεδίων, τα ονόματα, οι τύποι και οι ετικέτες προστατεύονται όλα. Η αλλαγή της διεύθυνσης του ιστότοπου, ακόμη και αν διατηρείται ο ίδιος κωδικός πρόσβασης, δημιουργεί μια νέα έκδοση ολόκληρης της εγγραφής, κρυπτογραφημένη με ένα νέο record_key.
Hash-αλυσίδα
ΘΑ ΠΡΕΠΕΙ ΤΟ ΕΡΓΟ ΣΑΣ ΝΑ ΧΡΗΣΙΜΟΠΟΙΕΙ BLOCKCHAIN; → ΟΧΙ
XKCD 2267
Κάποιος που γνωρίζει το secret_key μπορεί να ετοιμάσει ένα κρυπτογραφημένο αρχείο για το θησαυροφυλάκιό μας. Για να μην το αποδεχθούμε ως δικό μας, η εφαρμογή υπογράφει κάθε έκδοση εγγραφής με signing_key. Χωρίς αυτό το κλειδί, ένας εξωτερικός χρήστης δεν μπορεί να δημιουργήσει μια έκδοση με υπογραφή που θα αποδεχτεί ο διακομιστής και άλλες συσκευές.
Η κρυπτογραφημένη έκδοση χρειάζεται κάποιες συνοδευτικές πληροφορίες: σε ποιο θησαυροφυλάκιο και αρχείο ανήκει, πότε άλλαξε και ποιες εκδόσεις προηγούνται. Αυτό σχηματίζει τη δημόσια κεφαλίδα. Δεν περιέχει τον κωδικό πρόσβασης, αλλά εξακολουθεί να χρειάζεται προστασία: διαφορετικά κάποιος θα μπορούσε να αλλάξει την ιδιοκτησία και τις σχέσεις των αντικειμένων χωρίς να αγγίξει το κρυπτογραφημένο κείμενο. Η εφαρμογή υπογράφει τα ακριβή byte της κεφαλίδας μαζί με το κρυπτογραφημένο κείμενο. Η αλλαγή των υπογεγραμμένων δεδομένων ακυρώνει την υπογραφή.
Ο διακομιστής μοιάζει με αποθήκη σφραγισμένων δεμάτων. Βλέπει την κεφαλίδα, το κρυπτογραφημένο περιεχόμενο και την υπογραφή, αλλά όχι τον κωδικό πρόσβασης μέσα και γνωρίζει ότι ο παραλήπτης υπάρχει στην πόλη. Ελέγχει την υπογραφή στο καρφιτσωμένο δημόσιο τμήμα του signing_key και αποφασίζει εάν θα αποδεχτεί τη νέα έκδοση. Δεν χρειάζεται ούτε τον κύριο κωδικό πρόσβασης ούτε secret_key ούτε κανένα ιδιωτικό κλειδί. Κατά την ανάγνωση, ο πελάτης ελέγχει την ίδια υπογραφή και, στη συνέχεια, ελέγχει ξανά τη σύνδεση μεταξύ του περιεχομένου και της κεφαλίδας κατά την αποκρυπτογράφηση, χρησιμοποιώντας την ετικέτα ελέγχου ταυτότητας HPKE.
Η υπογραφή προστατεύει επίσης τους συνδέσμους μεταξύ των εκδόσεων. Ένας κατακερματισμός SHA-256 της ακριβούς κεφαλίδας και των byte κρυπτογραφημένου κειμένου γίνεται το αναγνωριστικό της έκδοσης. Η κεφαλίδα της επόμενης έκδοσης περιέχει το αναγνωριστικό της προηγούμενης έκδοσης. Όταν αλλάζουμε έναν κωδικό πρόσβασης ιστότοπου, η εφαρμογή δημιουργεί και υπογράφει ένα νέο αντικείμενο με αυτόν τον σύνδεσμο. Το παλιό αντικείμενο και η υπογραφή του παραμένουν αμετάβλητα. Επομένως, η αντικατάσταση του προκατόχου διατηρώντας την υπογραφή της νέας έκδοσης θα αποτύχει. Εάν δύο συσκευές κάνουν ανεξάρτητες αλλαγές, επιβιώνουν και οι δύο κλάδοι. μια συγχωνευμένη έκδοση μπορεί να αναφέρεται και στα δύο.
Θυμάστε το blockchain; Ορίστε :-).
Η δημόσια κεφαλίδα μας επιτρέπει να ελέγχουμε συνδέσμους χωρίς αποκρυπτογράφηση, αλλά ορισμένες πληροφορίες παραμένουν ορατές. Ο διακομιστής γνωρίζει τα αναγνωριστικά, τους συνδέσμους έκδοσης, τον χρόνο αλλαγής που παρέχεται από τον πελάτη, τον αριθμό των πεδίων και το κωδικοποιημένο μέγεθος κάθε τιμής πεδίου. Η κρυπτογράφηση κρύβει τα περιεχόμενα της εγγραφής, όχι αυτές τις δομικές πληροφορίες.
Συγχρονισμός
"Όχι διαρροή δεδομένων, δωρεάν κατανεμημένο αντίγραφο ασφαλείας."
Διαδικτυακό μιμίδιο.
Για να δουλέψουμε σε πολλές συσκευές, πρέπει να μεταφέρουμε το κλείδωμα και να καταγράψουμε το ιστορικό μεταξύ τους. Η μορφή του αντικειμένου δεν αλλάζει: μεταφέρουμε τα ίδια κρυπτογραφημένα byte και υπογραφές που αποθηκεύονται τοπικά.
Για μη αυτόματη μεταφορά, η εφαρμογή δημιουργεί ένα αρχείο ZIP που περιέχει το κλείδωμα, όλες τις τοπικά αποθηκευμένες κρυπτογραφημένες εκδόσεις εγγραφών και μια λίστα υπογεγραμμένων αρχείων. Δεν περιλαμβάνεται ούτε ο κωδικός πρόσβασης ούτε το secret_key. Σε μια άλλη συσκευή, η εφαρμογή ανοίγει πρώτα το κλείδωμα, στη συνέχεια ελέγχει τις υπογραφές, αποκρυπτογραφεί τις εγγραφές και επαναφέρει ένα τοπικό αντίγραφο αποθήκευσης. Η εισαγωγή προορίζεται για μια συσκευή όπου αυτό το θησαυροφυλάκιο δεν υπάρχει ακόμη. δεν συγχωνεύει το ιστορικό με ένα υπάρχον αντίγραφο.
Ένας διακομιστής συγχρονισμού ανταλλάσσει αλλαγές μεταξύ των αντιγράφων που λειτουργούν. Κατά την πρώτη μεταφόρτωση, λαμβάνει την υπογεγραμμένη κλειδαριά, ελέγχει την υπογραφή και υπολογίζει τη διεύθυνση του δημόσιου θησαυροφυλακίου από το δημόσιο τμήμα του signing_key. Στη συνέχεια, θυμάται αυτό το κλειδί και το αναγνωριστικό θυρίδας από την κεφαλίδα: αυτό καταχωρεί το θησαυροφυλάκιο στον διακομιστή. Οι επόμενες αλλαγές πρέπει να ταιριάζουν με αυτό το αναγνωριστικό και να φέρουν υπογραφή από το ίδιο κλειδί.
Μια νέα συσκευή χρειάζεται τη διεύθυνση αποθήκευσης και το secret_key, επομένως η εφαρμογή τα συνδυάζει σε έναν κωδικό μεταφοράς με ένα άθροισμα ελέγχου. Ο χρήστης μεταφέρει αυτόν τον κωδικό στη συσκευή και εισάγει τον κύριο κωδικό πρόσβασης ξεχωριστά. μόνο η δημόσια διεύθυνση αποστέλλεται στον διακομιστή.
Μετά το άνοιγμα της κλειδαριάς που έχει ληφθεί, η εφαρμογή συγκρίνει τα δημόσια μέρη των κλειδιών που ανακτήθηκαν με το secret_key και την κεφαλίδα και ελέγχει την υπολογισμένη διεύθυνση έναντι του κωδικού μεταφοράς. Στη συνέχεια, αποθηκεύει το επαληθευμένο δημόσιο τμήμα του signing_key για να ελέγξει τις εγγραφές.
Κατά τη διάρκεια του συγχρονισμού, η εφαρμογή ανακτά εκδόσεις που λείπουν και ανεβάζει τις αλλαγές της. Ο διακομιστής ελέγχει τις υπογραφές και τους συνδέσμους σε προηγούμενες εκδόσεις, αποθηκεύει αποδεκτά αντικείμενα και τα μεταβιβάζει σε άλλες συσκευές. Ο έλεγχος των ληφθέντων δεδομένων, η αποκρυπτογράφηση και η επίλυση διενέξεων συμβαίνουν στις συσκευές του χρήστη.
Η εγγραφή δεν ζητά όνομα, διεύθυνση email ή ξεχωριστό κωδικό πρόσβασης. Ο διακομιστής βλέπει τη δημόσια διεύθυνση, το κλειδί επαλήθευσης υπογραφής, τις δημόσιες κεφαλίδες, τα μεγέθη αντικειμένων και τους συνδέσμους έκδοσης. Βλέπει επίσης διευθύνσεις IP και χρόνους αιτημάτων. Ο κύριος κωδικός πρόσβασης, secret_key, τα ιδιωτικά κλειδιά και τα περιεχόμενα εγγραφής απλού κειμένου παραμένουν στις συσκευές του χρήστη. Όποιος γνωρίζει τη δημόσια διεύθυνση μπορεί να κατεβάσει τα κρυπτογραφημένα αντικείμενα, αλλά η ανάγνωσή τους απαιτεί τα μυστικά του χρήστη.
Αυτοί οι έλεγχοι εντοπίζουν πλαστά αντικείμενα, αλλά δεν αποδεικνύουν ότι ο διακομιστής έχει δείξει το πλήρες ιστορικό και την πιο πρόσφατη κατάστασή του. Μπορεί να κρύψει έναν κλάδο που δεν έχει δει ποτέ ο πελάτης ή να επιστρέψει ένα συνεπές παλαιότερο σύνολο δεδομένων. Μια υπογραφή επιβεβαιώνει την αυθεντικότητα ενός μεμονωμένου αντικειμένου και όχι την πληρότητα της απάντησης του διακομιστή. Ο χρήστης μπορεί να παρατηρήσει αλλαγές που λείπουν σε άλλη συσκευή, αλλά ένα σταθερό παλιό ιστορικό θα περάσει την επαλήθευση hash-chain.
Αλλαγή του κύριου κωδικού πρόσβασης
Λοιπόν, η αγιότητά σας θα ενδιαφερόταν να αλλάξει τον κωδικό πρόσβασής της;
Hackers (1995)
Η αλλαγή του κύριου κωδικού πρόσβασης κρυπτογραφεί εκ νέου μόνο το κλείδωμα. Το master_key στο εσωτερικό παραμένει το ίδιο. Επομένως, τα αρχεία, οι υπογραφές τους, το secret_key και η διεύθυνση του θησαυροφυλακίου παραμένουν αμετάβλητα. Η νέα κλειδαριά υπογράφεται με το ίδιο signing_key.
Ένα παλιό αντίγραφο κλειδώματος ανοίγει ακόμα με τον παλιό κωδικό πρόσβασης και τον ίδιο secret_key. Η αλλαγή του κωδικού πρόσβασης δεν ανακαλεί κλειδιά που έχουν ήδη εκτεθεί.
Η πλήρης εικόνα
Η κλειδαριά προστατεύει το master_key, το message_key κρυπτογραφεί τις εγγραφές και το signing_key δημιουργεί υπογραφές. Τα αρχεία ZIP και ο διακομιστής λαμβάνουν κρυπτογραφημένα αντικείμενα με υπογραφές.