Ασφάλεια · Σε βάθος

Ο πλήρης κρυπτογραφικός κύκλος ζωής

Μια ακριβής περιγραφή του τι συμβαίνει στα δεδομένα σας σε κάθε βήμα — με τους αλγορίθμους, τις παραμέτρους και τα όρια εμπιστοσύνης αναλυτικά. Κάθε βήμα ξεκινά με μια σύνοψη σε απλά λόγια, ώστε να διαβάσετε στο βάθος που θέλετε.

Βήμα 01 · Κρυπτογράφηση

Το μυστικό σας σφραγίζεται στη συσκευή σας

Με απλά λόγια: η ανάμειξη γίνεται στο πρόγραμμα περιήγησής σας, πριν μεταφορτωθεί οτιδήποτε. Αυτό που λαμβάνουμε είναι ήδη αδιάβαστο.

Όταν πατάτε Κρυπτογράφηση, το πρόγραμμα περιήγησης παράγει ένα νέο κλειδί περιεχομένου 256 bit από το WebCrypto CSPRNG και κρυπτογραφεί το φορτίο σας με AES-256-GCM. Το GCM είναι αυθεντικοποιημένο: κάθε τμήμα φέρει ετικέτα 128 bit, οπότε κάθε μεταγενέστερη αλλοίωση εντοπίζεται αντί να αποκρυπτογραφηθεί σιωπηλά.

Το κείμενο και τα αρχεία αντιμετωπίζονται με τον ίδιο τρόπο — και τα δύο γίνονται ένα αδιαφανές δυαδικό blob, συμπληρωμένο σε τυπικό μέγεθος, ώστε ένας σύντομος κωδικός και ένα μικρό αρχείο να μοιάζουν ίδια. Το απλό κείμενο δεν αγγίζει ποτέ το δίκτυο και δεν φεύγει ποτέ από τη μνήμη της καρτέλας.

ΚρυπτογράφησηAES-256-GCM, τμήματα 64 KiB
Κλειδί περιεχομένου256 bit, νέο για κάθε μυστικό
Nonceτυχαίο πρόθεμα 7 byte + μετρητής
Ετικέτα αυθεντικότητας128 bit ανά τμήμα
ΣυμπλήρωσηPadmé, ελάχιστο 64 KiB

Βήμα 02 · Φύλαξη κλειδιού

Το κλειδί κρύβεται στον σύνδεσμο, όχι στους διακομιστές μας

Με απλά λόγια: το μέρος του συνδέσμου μετά το # περιέχει το κλειδί — και τα προγράμματα περιήγησης δεν στέλνουν ποτέ αυτό το μέρος σε κανέναν διακομιστή.

Ο σύνδεσμός σας μεταφέρει έναν τυχαίο σπόρο 256 bit στο τμήμα (fragment) του URL — όλα όσα βρίσκονται μετά το #. Σύμφωνα με την προδιαγραφή URL, το πρόγραμμα περιήγησης αφαιρεί το τμήμα και αυτό δεν περιλαμβάνεται ποτέ στο αίτημα που στέλνεται στους διακομιστές μας. Από αυτόν τον σπόρο το πρόγραμμα περιήγησης παράγει, με HKDF, μια τιμή αναζήτησης για να βρει το μυστικό και το κλειδί που ξετυλίγει το κλειδί περιεχομένου. Ο διακομιστής βλέπει μόνο έναν κατακερματισμό της τιμής αναζήτησης.

Το πρόγραμμα περιήγησης του παραλήπτη διαβάζει τον σπόρο από το τμήμα και κάνει την ίδια παραγωγή τοπικά. Αυτό σημαίνει εδώ «μηδενική γνώση»: η κατοχή του κρυπτογραφημένου κειμένου μόνη της είναι άχρηστη χωρίς τον σύνδεσμο.

Θέση κλειδιούΤμήμα URL #
Στέλνεται στον διακομιστή;ποτέ
Σπόρος32 τυχαία byte, base64url
ΠαραγωγήHKDF-SHA-256
Ο διακομιστής αποθηκεύειμόνο SHA-256(lookup)

Βήμα 03 · Προαιρετική φράση πρόσβασης

Μια δεύτερη κλειδαριά που την ξέρουν μόνο άνθρωποι

Με απλά λόγια: προσθέστε φράση πρόσβασης, και ακόμη και κάποιος με ολόκληρο τον σύνδεσμο δεν μπορεί να ανοίξει το μυστικό χωρίς αυτήν.

Αν ορίσετε φράση πρόσβασης, αυτή ενισχύεται με Argon2id — μια συνάρτηση παραγωγής κλειδιού που απαιτεί πολλή μνήμη — και συνδυάζεται με τον σπόρο στο κλειδί που τυλίγει το κλειδί περιεχομένου. Η ίδια η φράση πρόσβασης δεν μεταδίδεται ούτε αποθηκεύεται ποτέ· μόνο εσείς και ο παραλήπτης την ξέρετε. Οι λανθασμένες προσπάθειες επαναλαμβάνονται στο πρόγραμμα περιήγησης του παραλήπτη, πάνω σε δεδομένα που έχει ήδη, οπότε ο διακομιστής δεν μπορεί να τις μετρήσει.

Η απαίτηση μνήμης κάνει τις μαζικές μαντεψιές εκτός σύνδεσης ακριβές ακόμη και σε GPU και ASIC. Στείλτε τη φράση πρόσβασης από διαφορετικό κανάλι από τον σύνδεσμο, και οι δύο παράγοντες δεν συναντιούνται ποτέ στο ίδιο σημείο. Η μονάδα Argon2 φορτώνεται σε κάθε δημιουργία και εμφάνιση, ώστε το δίκτυο να μην μπορεί να καταλάβει ποια μυστικά χρησιμοποιούν φράση πρόσβασης.

KDFArgon2id
Salt128 bit, τυχαίο
ΤύλιγμαAES-256-GCM, IV 96 bit

Βήμα 04 · Μεταφορά & αποθήκευση

Από τη συσκευή σας φεύγει μόνο κρυπτογραφημένο κείμενο

Με απλά λόγια: αποθηκεύουμε ένα κλειδωμένο κουτί και έναν χρόνο λήξης. Τίποτε άλλο — ούτε απλό κείμενο, ούτε κλειδί, ούτε κάποιο ίχνος σας.

Το blob μεταφορτώνεται μέσω TLS και αποθηκεύεται ως κρυπτογραφημένο κείμενο μαζί με κατακερματισμένα διαπιστευτήρια, τη διάρκεια ζωής του και έναν στρογγυλοποιημένο χρόνο λήξης. Σκόπιμα δεν κρατάμε ταυτότητα αποστολέα, παραλήπτη, αρχεία IP, χρόνο δημιουργίας ή ιστορικό πρόσβασης. Δεν υπάρχει σύστημα λογαριασμών που να συνδέει ένα μυστικό με ένα πρόσωπο. Ο περιορισμός ρυθμού λειτουργεί με ένα HMAC της διεύθυνσης κάτω από ένα salt που εναλλάσσεται, οπότε τίποτα πριν από μια εναλλαγή δεν μπορεί να συνδεθεί με κάτι μετά από αυτήν.

Επειδή το αποθηκευμένο αντικείμενο δεν έχει νόημα χωρίς τον σπόρο στο τμήμα του URL, μια παραβίαση του διακομιστή ή μια δικαστική εντολή αποδίδει μόνο αδιαφανή byte και κατακερματισμούς που δεν μπορούν να μετατραπούν ξανά σε τίποτα.

Κατά τη μεταφοράTLS
Κατά την αποθήκευσηκρυπτογραφημένο κείμενο + κατακερματισμένα κλειδιά + λήξη
Αρχεία καταγραφήςκανένα ανά μυστικό

Βήμα 05 · Ανάκτηση & καταστροφή

Η πρώτη ανάγνωση κερδίζει — και μετά σβήνεται

Με απλά λόγια: το άνοιγμα ενός συνδέσμου μίας προβολής παραδίδει το κουτί μία φορά και διαγράφει το αντίγραφο του διακομιστή. Ή καταστρέψτε το μόνοι σας, οποτεδήποτε.

Τίποτα δεν ανακτάται όταν φορτώνει η σελίδα εμφάνισης: το αίτημα στέλνεται μόνο με πραγματικό κλικ ή πάτημα πλήκτρου, οπότε οι σαρωτές συνδέσμων και οι προεπισκοπήσεις συνομιλιών δεν μπορούν να καταναλώσουν ένα μυστικό. Για ένα μυστικό μίας προβολής ο διακομιστής διεκδικεί τη γραμμή με μία μόνο υπό όρους ενημέρωση — ακριβώς ένα αίτημα κερδίζει — και το μυστικό θεωρείται καταναλωμένο από εκείνη τη στιγμή. Το ίδιο πρόγραμμα περιήγησης μπορεί να κάνει ξανά λήψη για 15 λεπτά αν διακοπεί η σύνδεση· κανείς άλλος δεν μπορεί, και μια διεκδίκηση που δεν επιβεβαιώνεται καταστρέφεται, ποτέ δεν αναιρείται. Τα χρονομετρημένα μυστικά είναι μια απλή ανάγνωση μέχρι να λήξουν.

Κάθε μυστικό έχει επίσης έναν ιδιωτικό σύνδεσμο καταστροφής. Το άνοιγμά του δεν καταστρέφει τίποτα από μόνο του· η επιβεβαίωση σβήνει αμέσως το κρυπτογραφημένο κείμενο — πριν μπορέσει να το διαβάσει οποιοσδήποτε παραλήπτης.

Μίας προβολήςατομική διεκδίκηση, μετά καταστροφή
Περιθώριο νέας λήψης15 λεπτά, μόνο ο ίδιος πελάτης
Λήξη15 λεπτά – 14 ημέρες
Έλεγχος από τον δημιουργόσύνδεσμος καταστροφής

Μοντέλο απειλών

Τι μπορεί και τι δεν μπορεί να δει το shhnote

Η ειλικρινής εκδοχή. Δείτε ακριβώς πού βρίσκεται το όριο εμπιστοσύνης.

Δεν φεύγει ποτέ από τη συσκευή σας

Τι δεν μπορούμε να δούμε

Το απλό κείμενό σας · το κλειδί περιεχομένου και τον σπόρο · τη φράση πρόσβασής σας · αν ορίστηκε φράση πρόσβασης · ποιος δημιούργησε ή άνοιξε ένα μυστικό · πότε δημιουργήθηκε · αρχεία πρόσβασης σε επίπεδο IP. Τίποτα από αυτά δεν μεταδίδεται ούτε διατηρείται.

Αποθηκεύεται στους διακομιστές μας

Τι κρατάμε

Ένα κρυπτογραφημένο blob που δεν μπορούμε να ανοίξουμε · την κατηγορία μεγέθους του μετά τη συμπλήρωση · μονόδρομους κατακερματισμούς των τιμών που χρησιμοποιεί το πρόγραμμα περιήγησής σας για να το βρει ή να το καταστρέψει · αν είναι μίας προβολής ή χρονομετρημένο · έναν στρογγυλοποιημένο χρόνο λήξης. Όλα άχρηστα χωρίς τον σπόρο στον σύνδεσμό σας.

Καλό να ξέρετε

Οι ειλικρινείς επιφυλάξεις

Όποιος έχει ολόκληρο τον σύνδεσμο (και τη φράση πρόσβασης, αν έχει οριστεί) μπορεί να διαβάσει ένα μυστικό μίας προβολής — αντιμετωπίστε τον σύνδεσμο ως το ίδιο το μυστικό. Αφού εμφανιστεί ένα μυστικό, η σελίδα αντικαθιστά ό,τι μπορεί όταν φεύγετε, αλλά η JavaScript δεν μπορεί να το εγγυηθεί· κλείστε την καρτέλα όταν τελειώσετε. Ένα πρόγραμμα περιήγησης που ελέγχεται από αυτοματισμό και εισάγει πραγματική είσοδο μπορεί να ανοίξει ένα μυστικό μίας προβολής όπως θα το έκανε ένας άνθρωπος — ο παραλήπτης τότε δεν βρίσκει τίποτα, που είναι το ειλικρινές αποτέλεσμα. Η διαγραφή ενός μυστικού αφαιρεί την εγγραφή· κρυπτογραφημένα υπολείμματα μπορεί να παραμείνουν σε ημερολόγια, σε ελεύθερο χώρο δίσκου ή σε αντίγραφα ασφαλείας μέχρι να αντικατασταθούν, ως κρυπτογραφημένο κείμενο χωρίς κλειδί. Τα μεγάλα μυστικά που φυλάσσονται εκτός της βάσης δεδομένων φέρουν τον χρόνο εγγραφής του αρχείου. Και όπως με κάθε διαδικτυακή εφαρμογή, εμπιστεύεστε τον κώδικα που φτάνει στο πρόγραμμα περιήγησής σας — γι' αυτό το shhnote είναι ανοιχτού κώδικα και μπορείτε να το φιλοξενήσετε μόνοι σας.

Κρυπτογραφική προδιαγραφή

Όλοι οι αλγόριθμοι, σε ένα σημείο

Κρυπτογράφηση

AES-256-GCM

Αυθεντικοποιημένη συμμετρική κρυπτογράφηση σε τμήματα των 64 KiB. Κλειδί 256 bit και ετικέτα ακεραιότητας ανά τμήμα, ώστε κάθε αλλοίωση ή περικοπή να εντοπίζεται — όχι απλώς να μένει αδιάβαστη.

Παραγωγή κλειδιού

HKDF · Argon2id

Τα κλειδιά και τα αναγνωριστικά προέρχονται από τον σπόρο μέσω HKDF-SHA-256. Οι προαιρετικές φράσεις πρόσβασης ενισχύονται με μια KDF που απαιτεί πολλή μνήμη, κάνοντας την ωμή βία εκτός σύνδεσης αργή και ακριβή ακόμη και σε εξειδικευμένο υλικό.

Τυχαιότητα

WebCrypto CSPRNG

Οι σπόροι, τα κλειδιά, τα salt και τα nonce προέρχονται από την κρυπτογραφικά ασφαλή γεννήτρια του προγράμματος περιήγησης. Ποτέ Math.random(), ποτέ προβλέψιμα.

Φύλαξη κλειδιού

Τμήμα URL #

Ο σπόρος ταξιδεύει μετά το # στον σύνδεσμό σας. Τα προγράμματα περιήγησης δεν μεταδίδουν ποτέ αυτό το τμήμα, οπότε δεν φτάνει ποτέ στους διακομιστές μας.

Κατά τη μεταφορά

TLS

Από τη συσκευή σας φεύγει μόνο κρυπτογραφημένο κείμενο, μέσω σύγχρονου TLS. Αυτό που λαμβάνουμε είναι ένα αδιαφανές blob που δεν μπορούμε να ανοίξουμε.

Κατά την αποθήκευση

Κρυπτογραφημένο κείμενο + κατακερματισμοί

Αποθηκεύουμε ένα κρυπτογραφημένο blob, μονόδρομους κατακερματισμούς των διαπιστευτηρίων του και έναν στρογγυλοποιημένο χρόνο λήξης — ούτε απλό κείμενο, ούτε κλειδιά, ούτε μεταδεδομένα αποστολέα ή παραλήπτη.

Τεχνικές ερωτήσεις

Για όσους νοιάζονται για την ασφάλεια

Πώς διασφαλίζεται η εγγύηση μίας προβολής απέναντι σε ταυτόχρονα αιτήματα;

Η εμφάνιση εκτελεί μία μόνο υπό όρους ενημέρωση που μετακινεί τη γραμμή από «ενεργό» σε «διεκδικημένο». Δύο ταυτόχρονα αιτήματα δεν μπορούν να πετύχουν και τα δύο· το δεύτερο βρίσκει μια ήδη διεκδικημένη εγγραφή και παίρνει την ίδια απάντηση «δεν βρέθηκε μυστικό» με οποιονδήποτε άλλον. Η διεκδίκηση δεν αναιρείται ποτέ: αν η λήψη χαθεί, ο κάτοχος του διακριτικού διεκδίκησης κάνει ξανά λήψη μέσα στο χρονικό περιθώριο, αλλιώς το μυστικό καταστρέφεται αδιάβαστο.

Γιατί το τμήμα (fragment) του URL και όχι μια παράμετρος ερωτήματος;

Οι παράμετροι ερωτήματος στέλνονται στον διακομιστή και καταλήγουν σε αρχεία καταγραφής πρόσβασης, διακομιστές μεσολάβησης και εργαλεία ανάλυσης. Το τμήμα (μετά το #) ορίζεται από την προδιαγραφή URL να μένει στην πλευρά του πελάτη — το πρόγραμμα περιήγησης δεν το βάζει ποτέ στο αίτημα HTTP. Αυτή η ιδιότητα είναι όλη η βάση του σχεδιασμού μηδενικής γνώσης. Μετά την εμφάνιση, η σελίδα αφαιρεί επίσης το τμήμα από τη γραμμή διευθύνσεων και το ιστορικό.

Τι εμποδίζει τους σαρωτές συνδέσμων να «κάψουν» νωρίς τα μυστικά μίας προβολής;

Η σελίδα προβολής είναι το ίδιο στατικό έγγραφο για κάθε μυστικό και δεν ανακτά τίποτα κατά τη φόρτωση. Το αίτημα στέλνεται μόνο με ένα αξιόπιστο κλικ ή πάτημα πλήκτρου — ένα click() από σενάριο ή μια υποβολή φόρμας δεν μετράει. Οι αυτόματοι σαρωτές (ασφάλεια email, προεπισκοπήσεις συνδέσμων σε συνομιλίες, προγράμματα προστασίας από ιούς) φορτώνουν μόνο αυτό το στατικό κέλυφος.

Μπορώ να το επαληθεύσω ή να το φιλοξενήσω μόνος μου;

Ναι. Ο πλήρης πηγαίος κώδικας είναι δημόσιος με άδεια AGPLv3, το πρωτόκολλο είναι καταγεγραμμένο σε μια προδιαγραφή με διανύσματα συμμόρφωσης με τα οποία κάθε υλοποίηση μπορεί να ελεγχθεί, και υπάρχει οδηγός αυτοφιλοξενίας. Μπορείτε να ελέγξετε την κρυπτογραφία στην πλευρά του πελάτη και να λειτουργήσετε τη δική σας εγκατάσταση, ώστε το όριο εμπιστοσύνης να είναι εξ ολοκλήρου δικό σας.

Καταγράφεται κάτι για την πρόληψη της κατάχρησης;

Δεν κρατάμε αρχεία πρόσβασης ανά μυστικό ούτε ιστορικό IP. Ο περιορισμός ρυθμού χρησιμοποιεί έναν κατακερματισμό της διεύθυνσης με κλειδί, κάτω από ένα salt που εναλλάσσεται και μηδενίζει μαζί του κάθε μετρητή. Οι αναφορές κατάχρησης μετρώνται ανά ημέρα· δεν υπάρχει αρχείο για το ποιο μυστικό αναφέρθηκε.

Συμβουλές για ασφαλή κοινοποίηση

  • Στείλτε τη φράση πρόσβασης με διαφορετικό τρόπο από τον σύνδεσμο, για παράδειγμα τον σύνδεσμο με email και τη φράση πρόσβασης τηλεφωνικά.
  • Επιλέξτε τη συντομότερη λήξη που σας εξυπηρετεί.
  • Χρησιμοποιήστε μυστικό μίας προβολής για κωδικούς και άλλες πληροφορίες που πρέπει να διαβαστούν ακριβώς μία φορά.

Αναφορά κενού ασφαλείας

Αν πιστεύετε ότι βρήκατε πρόβλημα ασφάλειας σε αυτόν τον ιστότοπο, στείλτε email στο [email protected] και ενημερώστε μας ιδιωτικά πριν το πείτε σε οποιονδήποτε άλλο. Περιγράψτε τι βρήκατε και πώς μπορεί να αναπαραχθεί.

Εμείς θα:

  • απαντήσουμε μέσα σε 5 εργάσιμες ημέρες·
  • σας ενημερώνουμε όσο το διορθώνουμε·
  • αναφέρουμε το όνομά σας όταν δημοσιεύσουμε τη διόρθωση, αν το επιθυμείτε.

Κατά τις δοκιμές, μην αποκτάτε πρόσβαση σε δεδομένα άλλων, μη διαταράσσετε την υπηρεσία και μην εκτελείτε αυτοματοποιημένες σαρώσεις που την επιβαρύνουν σημαντικά.

Κενά ασφαλείας στο ίδιο το λογισμικό shhnote: δείτε την πολιτική ασφάλειας του έργου.

Δημιουργία μυστικού Δείτε τον κώδικα στο GitHub

Δοκιμάστε το — παίρνει δέκα δευτερόλεπτα

Γράψτε κάτι μυστικό, πάρτε τον σύνδεσμο μίας προβολής και δείτε το να εξαφανίζεται.

Δημιουργία μυστικού