Διαφάνεια χωρίς αστερίσκους. Τι κρυπτογραφούμε, τι όχι, ποιος μπορεί να δει τι.
Τα μηνύματά σας κρυπτογραφούνται στη συσκευή σας πριν φύγουν. Μόνο ο παραλήπτης μπορεί να τα αποκρυπτογραφήσει — ούτε εμείς, ούτε ο πάροχός μας, ούτε όποιος υποκλέψει την επικοινωνία. Το διακομιστή τον χρησιμοποιούμε σαν ταχυδρομικό κουτί, όχι σαν μάτι.
Η συσκευή σας παράγει ένα εντελώς τυχαίο ζεύγος κρυπτογραφικών κλειδιών. Το μυστικό κλειδί δεν φεύγει ποτέ από τη συσκευή σας ακρυπτογράφητο. Για να μπορείτε να συνδεθείτε και από άλλες συσκευές, η συσκευή σας «σφραγίζει» το μυστικό κλειδί με ένα κλειδί που προκύπτει από τον κωδικό ανάκτησής σας — έναν κωδικό που σας εμφανίζεται ακριβώς μία φορά — και μόνο αυτό το σφραγισμένο αντίγραφο αποθηκεύεται στον διακομιστή μας. Δεν μπορούμε να το ανοίξουμε. Ο κωδικός ανάκτησης δεν φτάνει ποτέ σε εμάς.
Τι σημαίνει αυτό στην πράξη:
Μέχρι τον Ιούλιο του 2026, τα κλειδιά σας προέρχονταν από το όνομα χρήστη + τον κωδικό σας. Βολικό — αλλά ο κωδικός σας φτάνει στον διακομιστή μας σε κάθε σύνδεση (έτσι λειτουργεί η σύνδεση). Θεωρητικά, εμείς — ή όποιος παραβίαζε τον διακομιστή — θα μπορούσαμε να ανακατασκευάσουμε το μυστικό σας κλειδί. Δεν θα έπρεπε ποτέ να βασίζεστε στις καλές μας προθέσεις, γι' αυτό το επανασχεδιάσαμε: τα κλειδιά είναι πλέον τυχαία, και το μόνο που τα ξεκλειδώνει είναι ένας κωδικός που δεν βλέπουμε ποτέ. Οι υπάρχοντες λογαριασμοί κρατούν το παλιό σχήμα μέχρι να αποδεχθούν την αναβάθμιση μέσα στην εφαρμογή — όταν σας προταθεί, σας συνιστούμε να πείτε ναι.
Πηγή: assets/js/crypto.js → generateIdentityKeyPair(), generateRecoveryCode(), wrapSecretKey() · api/keys.php → set_recovery (αποθηκεύει μόνο σφραγισμένο υλικό). Χρησιμοποιούμε τη βιβλιοθήκη TweetNaCl — ελεγμένη από ανεξάρτητους ερευνητές ασφαλείας.
Για κάθε άτομο στο δωμάτιο, ο υπολογιστής/τηλέφωνό σας κρυπτογραφεί χωριστά το μήνυμα με το δημόσιο κλειδί του παραλήπτη. Ο διακομιστής λαμβάνει N κουτάκια κλειδωμένα — δεν έχει το κλειδί για κανένα.
Κάθε «κουτί» είναι κρυπτογραφημένο με XSalsa20-Poly1305 — έναν αλγόριθμο που εξασφαλίζει ότι αν κάποιος αλλάξει ένα μόνο byte, η αποκρυπτογράφηση θα αποτύχει. Δεν είναι δυνατόν να αλλοιωθεί ένα μήνυμα χωρίς ο παραλήπτης να το καταλάβει.
Πηγή: assets/js/crypto.js → encryptMessage(), decryptMessage(). Ένα νέο τυχαίο nonce ανά μήνυμα.
Το πρόγραμμά σας ρωτάει τον διακομιστή τακτικά: «έχω κάτι νέο;». Αν ναι, ο διακομιστής επιστρέφει τα κρυπτογραφημένα μηνύματα που είναι για εσάς, και ο υπολογιστής/τηλέφωνό σας τα ξεκλειδώνει τοπικά με το μυστικό σας κλειδί.
Μόλις τα παραλάβετε, στέλνετε ένα «το έλαβα» στον διακομιστή — και ο διακομιστής σβήνει αμέσως την κρυπτογραφημένη έκδοση. Δεν τα κρατάμε.
Πηγή: api/poll.php (παραλαβή) · api/ack.php (διαγραφή).
Σε αντίθεση με WhatsApp/Signal/Telegram, το ChatNorris δεν αποθηκεύει μηνύματα για να τα παραλάβετε αργότερα. Αν ο παραλήπτης δεν είναι ενεργός στο δωμάτιο, ο αποστολέας ειδοποιείται («Ο Χ δεν ήταν στο δωμάτιο — πάτησε για επαναποστολή»).
Αυτό είναι σκόπιμο: μειώνει δραστικά το χρονικό παράθυρο όπου ένα κρυπτογραφημένο μήνυμα υπάρχει στον διακομιστή. Αν δεν είστε παρόντες, το μήνυμα δεν στέλνεται — άρα δεν υπάρχει τίποτα να κλαπεί από εμάς ακόμα κι αν εμείς (ή κάποιος από εμάς) θέλαμε να το κάνουμε.
Επειδή ένα μήνυμα που δεν στάλθηκε ποτέ δεν μπορεί να διαρρεύσει ποτέ. Το μοντέλο μας ευνοεί την παρουσία αντί της ευκολίας — μια συνειδητή επιλογή ιδιωτικότητας.
Στον διακομιστή αποθηκεύουμε:
Μια παλαιότερη έκδοση αυτής της σελίδας έλεγε ότι κρατάμε «μόνο την τελευταία IP». Ήταν ελλιπές — και προτιμούμε να διορθωνόμαστε παρά να στρογγυλεύουμε υπέρ μας. Όπως σχεδόν κάθε διαδικτυακή υπηρεσία, τα λειτουργικά μας αρχεία καταγράφουν την IP κάθε αιτήματος. Να τι ακριβώς υπάρχει και πόσο ζει — όλα τα παρακάτω διαγράφονται αυτόματα από προγραμματισμένη εργασία:
Επαλήθευση: cron/cleanup.php — κάθε περίοδος διατήρησης παραπάνω επιβάλλεται εκεί, σε κοινή θέα.
Δεν αποθηκεύουμε ποτέ:
Οι κλήσεις χρησιμοποιούν WebRTC peer-to-peer — ο ήχος ταξιδεύει απευθείας από τη μία συσκευή στην άλλη, ποτέ μέσα από τον διακομιστή μας. Το πρωτόκολλο WebRTC κρυπτογραφεί τον ήχο με DTLS-SRTP — βιομηχανικό στάνταρ.
Ο διακομιστής μας μεσολαβεί μόνο για την εγκατάσταση της κλήσης (ποιος, σε ποιον, σε ποιο δωμάτιο) — όχι για το περιεχόμενό της.
Έστω την αλήθεια: ένας admin με πρόσβαση στον διακομιστή μπορεί να δει:
Ένας admin δεν μπορεί να δει:
Δουλεύουμε διαρκώς στο να κάνουμε την εφαρμογή πιο ασφαλή. Οι παρακάτω αλλαγές αφορούν δύο σενάρια που μας απασχόλησαν: κακόβουλος συνομιλητής μέσα σε ένα δωμάτιο, και συσκευή που χάθηκε ή κλάπηκε ενώ ήταν ξεκλείδωτη. Όλα τα παρακάτω ίσχυσαν με σιωπηλή ενημέρωση — δεν χρειάστηκε να ξανασυνδεθείτε ή να αλλάξετε κάτι.
Η μεγαλύτερη αλλαγή αυτής της σελίδας: τα κλειδιά κρυπτογράφησης είναι πλέον τυχαία και ξεκλειδώνουν μόνο με έναν κωδικό ανάκτησης που δεν φτάνει ποτέ σε εμάς — βλ. ενότητα 1. Πριν, προέρχονταν από τον κωδικό σας, ο οποίος όντως φτάνει σε εμάς κατά τη σύνδεση. Κλείσαμε αυτό το κενό γιατί μια υπόσχεση που πρέπει να πάρετε τοις μετρητοίς δεν είναι εγγύηση. Οι νέοι λογαριασμοί το έχουν αυτόματα· στους υπάρχοντες προσφέρεται η αναβάθμιση κατά τη σύνδεση.
Αν αλλάξει το κλειδί κρυπτογράφησης μιας επαφής, βλέπετε πλέον μόνιμη προειδοποίηση μέσα στη συνομιλία — στη γλώσσα σας — μέχρι είτε να επαληθεύσετε τον Αριθμό Ασφαλείας είτε να την απορρίψετε συνειδητά. Εντοπίζει και αλλαγές που έγιναν όσο ήσασταν εκτός σύνδεσης. Παλαιότερα ήταν ένα σύντομο αγγλικό μήνυμα που χανόταν εύκολα. Μια αλλαγή κλειδιού μπορεί να είναι νόμιμη αναβάθμιση (βλ. παραπάνω) ή απόπειρα πλαστοπροσωπίας· τώρα αποφασίζετε εσείς.
Όταν αποκλείετε κάποιον, κόβεται πλέον κάθε δρόμος επικοινωνίας του προς εσάς: μηνύματα, κλήσεις (και μέσα από κοινά δωμάτια), ειδοποιήσεις κλήσης, pokes, ειδοποιήσεις screenshot — και δεν μπορεί να ξαναμπεί σε ιδιωτικό δωμάτιο μαζί σας. Παλαιότερα κάποιοι από αυτούς τους δρόμους έμεναν ανοιχτοί. Επίσης, οι αποκλεισμοί λογαριασμών από διαχειριστές ισχύουν πλέον αμέσως, στις ενεργές συνεδρίες — όχι στην επόμενη σύνδεση.
Όταν στέλνετε μια φωτογραφία, η συσκευή σας πλέον καθαρίζει αυτόματα τα μεταδεδομένα πριν την κρυπτογραφήσει: GPS, σειριακός αριθμός κάμερας, ημερομηνία λήψης, σχόλια. Μένουν μόνο τα ορατά pixels της εικόνας. Έτσι, ακόμα κι αν ο παραλήπτης κάνει screenshot ή προωθήσει τη φωτογραφία αλλού, η τοποθεσία σας δεν ταξιδεύει μαζί της.
Συγκεκριμένες μορφές εικόνας (όπως SVG) μπορούν τεχνικά να περιέχουν εκτελέσιμο κώδικα. Πλέον δεν τις εμφανίζουμε «inline» στη συνομιλία — αν κάποιος στείλει τέτοιο αρχείο, εμφανίζεται ως απλό συνημμένο με κουμπί λήψης. Καμία αυτόματη εκτέλεση κώδικα από ένα μήνυμα.
Αν αφήσετε ξεκλείδωτη τη συσκευή σας και απομακρυνθείτε, η εφαρμογή κλειδώνει αυτόματα μετά από 10 λεπτά αδράνειας. Σβήνει το κλειδί από τη μνήμη και ζητάει ξανά τον κωδικό σας. Έτσι, μια ξεχασμένη συσκευή δεν δίνει πρόσβαση σε κάποιον που την βρει.
Όταν πατάτε «Αποσύνδεση», πλέον καθαρίζονται όλα τα κρυπτογραφικά υλικά από τη συσκευή σας — όχι μόνο η συνεδρία. Έτσι, αν χάσετε τη συσκευή μετά την αποσύνδεση, δεν υπάρχει πια κανένα κρυπτογραφημένο κλειδί για να προσπαθήσει κάποιος να σπάσει επιτόπου.
Όταν ανοίγετε μια εικόνα ή βίντεο σε πλήρη οθόνη, το αρχείο εμφανίζεται μέσα σε ένα απομονωμένο «κουτί» (sandbox) που δεν έχει πρόσβαση στα δεδομένα της εφαρμογής. Είναι ένα επιπλέον δίχτυ ασφαλείας: ακόμη κι αν κάτι ξεπεράσει τους προηγούμενους ελέγχους, δεν μπορεί να διαβάσει τα κλειδιά σας.
Επαλήθευση: assets/js/chat.js → stripImageMetadata(), SAFE_INLINE_IMAGE_MIMES, lockSession(), openMediaViewer(). Επίσης assets/js/app.js → logout().
Το κλειδί ταυτότητάς σας είναι μακράς διάρκειας. Αν κάποιος αποκτήσει στο μέλλον το μυστικό σας κλειδί ή τον κωδικό ανάκτησής σας και έχει αποθηκεύσει παλιά κρυπτογραφημένη κίνηση, θα μπορούσε να την αποκρυπτογραφήσει αναδρομικά. Apps όπως το Signal χρησιμοποιούν εφήμερα κλειδιά ανά μήνυμα που σβήνουν αμέσως μετά — εμείς όχι ακόμα. (Αυτό βελτιώθηκε με την αλλαγή κλειδιών του Ιουλίου 2026: το κλειδί σας δεν παράγεται πια από τον κωδικό σας, οπότε ένας διαρρεύσας κωδικός από μόνος του δεν εκθέτει πλέον παλιά κίνηση. Παραμένει όμως όχι-per-message forward secrecy, και δεν θα προσποιηθούμε το αντίθετο.)
Αυτή είναι μια συνειδητή επιλογή προϊόντος: ο admin πρέπει να μπορεί να βοηθήσει χρήστες που ξεχνούν το συνθηματικό ενός δωματίου. Δεν είναι ο κωδικός λογαριασμού σας (αυτός είναι hashed). Είναι μόνο το πρόσθετο συνθηματικό κάποιων δωματίων. Αν αυτό σας ενοχλεί, μην βάζετε συνθηματικό στο δωμάτιο.
…και δεν μπορούμε. Αν θέλατε «αναζήτηση παλαιότερων μηνυμάτων», δεν μπορούμε να σας το προσφέρουμε χωρίς να σπάσουμε το μοντέλο που περιγράψαμε εδώ. Είναι μια λειτουργία που λείπει σκόπιμα.
Κανείς δεν μπορεί. Όταν ένα μήνυμα είναι αποκρυπτογραφημένο στην οθόνη του παραλήπτη, εκείνος μπορεί να βγάλει screenshot, να φωτογραφίσει την οθόνη, να αντιγράψει το κείμενο. Προσπαθούμε να ανιχνεύσουμε screenshots σε iOS με μια ευρετική (το shutter animation κρύβει την οθόνη για λίγα ms) και να ειδοποιήσουμε τους συνομιλητές, αλλά είναι best-effort, όχι εγγύηση.
Ο πιο γρήγορος τρόπος: ανοίξτε τα DevTools του browser σας → πηγαίνετε στο tab Network → στείλτε ένα μήνυμα → δείτε τι περιέχει το POST request προς το /api/send.php. Θα δείτε μόνο κρυπτογραφημένα bytes (Base64).
Για πιο βαθιά επαλήθευση, οι ενδιαφερόμενοι μπορούν να μελετήσουν τον πηγαίο κώδικα — ειδικά:
assets/js/crypto.js — όλη η λογική κρυπτογράφησης στον πελάτη.api/send.php, api/poll.php, api/ack.php — πώς ο διακομιστής χειρίζεται την παράδοση.includes/auth.php → register() — πώς αποθηκεύεται ο κωδικός (Argon2id).Το TweetNaCl, η βιβλιοθήκη κρυπτογράφησης που χρησιμοποιούμε, έχει υποστεί ανεξάρτητο audit και είναι ευρέως αποδεκτό στον χώρο της κρυπτογραφίας.
Αν βρείτε κάτι που σας ανησυχεί — bug, υποψία ευπάθειας, ασάφεια σε αυτή τη σελίδα — γράψτε μας. Δεν προσποιούμαστε ότι είμαστε τέλειοι. Προτιμούμε να μάθουμε.