Πίσω στην αρχική

Πώς δουλεύει το ChatNorris

Διαφάνεια χωρίς αστερίσκους. Τι κρυπτογραφούμε, τι όχι, ποιος μπορεί να δει τι.

Σύντομα

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

1. Τα κλειδιά σας

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

Τι σημαίνει αυτό στην πράξη:

┌──────────────────────────────────────────────────────────────┐ │ │ │ Γεννήτρια τυχαιότητας (στη ΔΙΚΗ σας συσκευή) │ │ │ │ │ ▼ │ │ ┌──────────────────────────┐ │ │ │ Μυστικό κλειδί (32 bytes)│ ← δεν φεύγει ακρυπτογράφητο │ │ └──────────────────────────┘ │ │ │ │ │ │ ▼ (X25519) ▼ σφραγίζεται με τον κωδ. ανάκτησης │ │ ┌────────────┐ ┌───────────────────────────┐ │ │ │ Δημόσιο │ │ Σφραγισμένο κουτί → ο │ │ │ │ κλειδί → │ │ διακομιστής το αποθηκεύει │ │ │ │ οι φίλοι │ │ αλλά ΔΕΝ το ανοίγει │ │ │ └────────────┘ └───────────────────────────┘ │ │ │ │ Κωδικός ανάκτησης: XXXX-XXXX-… → μένει σε ΕΣΑΣ │ └──────────────────────────────────────────────────────────────┘
Το αλλάξαμε — και να γιατί, ειλικρινά

Μέχρι τον Ιούλιο του 2026, τα κλειδιά σας προέρχονταν από το όνομα χρήστη + τον κωδικό σας. Βολικό — αλλά ο κωδικός σας φτάνει στον διακομιστή μας σε κάθε σύνδεση (έτσι λειτουργεί η σύνδεση). Θεωρητικά, εμείς — ή όποιος παραβίαζε τον διακομιστή — θα μπορούσαμε να ανακατασκευάσουμε το μυστικό σας κλειδί. Δεν θα έπρεπε ποτέ να βασίζεστε στις καλές μας προθέσεις, γι' αυτό το επανασχεδιάσαμε: τα κλειδιά είναι πλέον τυχαία, και το μόνο που τα ξεκλειδώνει είναι ένας κωδικός που δεν βλέπουμε ποτέ. Οι υπάρχοντες λογαριασμοί κρατούν το παλιό σχήμα μέχρι να αποδεχθούν την αναβάθμιση μέσα στην εφαρμογή — όταν σας προταθεί, σας συνιστούμε να πείτε ναι.

Πηγή: assets/js/crypto.js → generateIdentityKeyPair(), generateRecoveryCode(), wrapSecretKey() · api/keys.php → set_recovery (αποθηκεύει μόνο σφραγισμένο υλικό). Χρησιμοποιούμε τη βιβλιοθήκη TweetNaCl — ελεγμένη από ανεξάρτητους ερευνητές ασφαλείας.

2. Πώς στέλνεται ένα μήνυμα

Για κάθε άτομο στο δωμάτιο, ο υπολογιστής/τηλέφωνό σας κρυπτογραφεί χωριστά το μήνυμα με το δημόσιο κλειδί του παραλήπτη. Ο διακομιστής λαμβάνει N κουτάκια κλειδωμένα — δεν έχει το κλειδί για κανένα.

┌─────────────┐ ┌─────────────┐ │ ΕΣΕΙΣ │ │ Διακομιστής│ │ │ │ │ │ «Γεια Νικη» │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌─────────┐ │ nacl.box(μήνυμα, nonce, │ │ │ │ Κουτί 1 │ │ δημ.κλ.Νίκη, μυσ.κλ.εσείς) │ │ │ │ για Νίκη│─┼───────────────────────────────►│ ┌─────────┐ │ │ └─────────┘ │ │ │ ✉ #1 │ │ │ ┌─────────┐ │ │ │ για Νίκη│ │ │ │ Κουτί 2 │ │ │ └─────────┘ │ │ │ για Άννα│─┼───────────────────────────────►│ ┌─────────┐ │ │ └─────────┘ │ │ │ ✉ #2 │ │ │ │ │ │ για Άννα│ │ │ │ │ └─────────┘ │ │ │ │ │ │ │ │ ❌ Ο διακομι- │ │ │ │ στής ΔΕΝ μπο-│ │ │ │ ρεί να δει το│ │ │ │ περιεχόμενο. │ └─────────────┘ └─────────────┘

Κάθε «κουτί» είναι κρυπτογραφημένο με XSalsa20-Poly1305 — έναν αλγόριθμο που εξασφαλίζει ότι αν κάποιος αλλάξει ένα μόνο byte, η αποκρυπτογράφηση θα αποτύχει. Δεν είναι δυνατόν να αλλοιωθεί ένα μήνυμα χωρίς ο παραλήπτης να το καταλάβει.

Πηγή: assets/js/crypto.js → encryptMessage(), decryptMessage(). Ένα νέο τυχαίο nonce ανά μήνυμα.

3. Πώς φτάνει το μήνυμα σε εσάς

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

Μόλις τα παραλάβετε, στέλνετε ένα «το έλαβα» στον διακομιστή — και ο διακομιστής σβήνει αμέσως την κρυπτογραφημένη έκδοση. Δεν τα κρατάμε.

Παραλήπτης Διακομιστής Αποστολέας │ │ │ │ «έχω κάτι;» │ │ │──────────────────────►│ │ │ │ │ │ ✉ κρυπτογραφημένο │ │ │◄──────────────────────│ │ │ │ │ │ το λέει στο NaCl │ │ │ ─► «Γεια Νίκη» │ │ │ │ │ │ «το έλαβα» │ │ │──────────────────────►│ │ │ │ ✉ ΔΙΑΓΡΑΦΗ │ │ │ ❌ Δεν υπάρχει πια │ │ │ │

Πηγή: api/poll.php (παραλαβή) · api/ack.php (διαγραφή).

4. Πολιτική παράδοσης — «πρέπει να είσαι στο δωμάτιο»

Σε αντίθεση με WhatsApp/Signal/Telegram, το ChatNorris δεν αποθηκεύει μηνύματα για να τα παραλάβετε αργότερα. Αν ο παραλήπτης δεν είναι ενεργός στο δωμάτιο, ο αποστολέας ειδοποιείται («Ο Χ δεν ήταν στο δωμάτιο — πάτησε για επαναποστολή»).

Αυτό είναι σκόπιμο: μειώνει δραστικά το χρονικό παράθυρο όπου ένα κρυπτογραφημένο μήνυμα υπάρχει στον διακομιστή. Αν δεν είστε παρόντες, το μήνυμα δεν στέλνεται — άρα δεν υπάρχει τίποτα να κλαπεί από εμάς ακόμα κι αν εμείς (ή κάποιος από εμάς) θέλαμε να το κάνουμε.

Γιατί έτσι;

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

5. Τι βλέπουμε εμείς ως πάροχος

Στον διακομιστή αποθηκεύουμε:

Διευθύνσεις IP — η ειλικρινής εκδοχή

Μια παλαιότερη έκδοση αυτής της σελίδας έλεγε ότι κρατάμε «μόνο την τελευταία IP». Ήταν ελλιπές — και προτιμούμε να διορθωνόμαστε παρά να στρογγυλεύουμε υπέρ μας. Όπως σχεδόν κάθε διαδικτυακή υπηρεσία, τα λειτουργικά μας αρχεία καταγράφουν την IP κάθε αιτήματος. Να τι ακριβώς υπάρχει και πόσο ζει — όλα τα παρακάτω διαγράφονται αυτόματα από προγραμματισμένη εργασία:

Επαλήθευση: cron/cleanup.php — κάθε περίοδος διατήρησης παραπάνω επιβάλλεται εκεί, σε κοινή θέα.

Δεν αποθηκεύουμε ποτέ:

6. Φωνητικές κλήσεις

Οι κλήσεις χρησιμοποιούν WebRTC peer-to-peer — ο ήχος ταξιδεύει απευθείας από τη μία συσκευή στην άλλη, ποτέ μέσα από τον διακομιστή μας. Το πρωτόκολλο WebRTC κρυπτογραφεί τον ήχο με DTLS-SRTP — βιομηχανικό στάνταρ.

Ο διακομιστής μας μεσολαβεί μόνο για την εγκατάσταση της κλήσης (ποιος, σε ποιον, σε ποιο δωμάτιο) — όχι για το περιεχόμενό της.

7. Διαχειριστική πρόσβαση — τι μπορεί να δει ο admin

Έστω την αλήθεια: ένας admin με πρόσβαση στον διακομιστή μπορεί να δει:

Ένας admin δεν μπορεί να δει:

8. Τι βελτιώσαμε πρόσφατα

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

🔑 Κλειδιά που ο διακομιστής δεν μπορεί πλέον να παράγει (Ιούλιος 2026)

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

⚠️ Οι αλλαγές κλειδιών εμφανίζουν πλέον πραγματική, επίμονη προειδοποίηση

Αν αλλάξει το κλειδί κρυπτογράφησης μιας επαφής, βλέπετε πλέον μόνιμη προειδοποίηση μέσα στη συνομιλία — στη γλώσσα σας — μέχρι είτε να επαληθεύσετε τον Αριθμό Ασφαλείας είτε να την απορρίψετε συνειδητά. Εντοπίζει και αλλαγές που έγιναν όσο ήσασταν εκτός σύνδεσης. Παλαιότερα ήταν ένα σύντομο αγγλικό μήνυμα που χανόταν εύκολα. Μια αλλαγή κλειδιού μπορεί να είναι νόμιμη αναβάθμιση (βλ. παραπάνω) ή απόπειρα πλαστοπροσωπίας· τώρα αποφασίζετε εσείς.

⛔ Ο αποκλεισμός πλέον αποκλείει παντού

Όταν αποκλείετε κάποιον, κόβεται πλέον κάθε δρόμος επικοινωνίας του προς εσάς: μηνύματα, κλήσεις (και μέσα από κοινά δωμάτια), ειδοποιήσεις κλήσης, pokes, ειδοποιήσεις screenshot — και δεν μπορεί να ξαναμπεί σε ιδιωτικό δωμάτιο μαζί σας. Παλαιότερα κάποιοι από αυτούς τους δρόμους έμεναν ανοιχτοί. Επίσης, οι αποκλεισμοί λογαριασμών από διαχειριστές ισχύουν πλέον αμέσως, στις ενεργές συνεδρίες — όχι στην επόμενη σύνδεση.

🛡️ Καθαρισμός μεταδεδομένων από φωτογραφίες

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

🚫 Αποκλεισμός επικίνδυνων μορφών αρχείων

Συγκεκριμένες μορφές εικόνας (όπως SVG) μπορούν τεχνικά να περιέχουν εκτελέσιμο κώδικα. Πλέον δεν τις εμφανίζουμε «inline» στη συνομιλία — αν κάποιος στείλει τέτοιο αρχείο, εμφανίζεται ως απλό συνημμένο με κουμπί λήψης. Καμία αυτόματη εκτέλεση κώδικα από ένα μήνυμα.

🔒 Αυτόματο κλείδωμα μετά από αδράνεια

Αν αφήσετε ξεκλείδωτη τη συσκευή σας και απομακρυνθείτε, η εφαρμογή κλειδώνει αυτόματα μετά από 10 λεπτά αδράνειας. Σβήνει το κλειδί από τη μνήμη και ζητάει ξανά τον κωδικό σας. Έτσι, μια ξεχασμένη συσκευή δεν δίνει πρόσβαση σε κάποιον που την βρει.

🧹 Αυστηρότερη αποσύνδεση

Όταν πατάτε «Αποσύνδεση», πλέον καθαρίζονται όλα τα κρυπτογραφικά υλικά από τη συσκευή σας — όχι μόνο η συνεδρία. Έτσι, αν χάσετε τη συσκευή μετά την αποσύνδεση, δεν υπάρχει πια κανένα κρυπτογραφημένο κλειδί για να προσπαθήσει κάποιος να σπάσει επιτόπου.

🧪 Sandbox στην προεπισκόπηση πολυμέσων

Όταν ανοίγετε μια εικόνα ή βίντεο σε πλήρη οθόνη, το αρχείο εμφανίζεται μέσα σε ένα απομονωμένο «κουτί» (sandbox) που δεν έχει πρόσβαση στα δεδομένα της εφαρμογής. Είναι ένα επιπλέον δίχτυ ασφαλείας: ακόμη κι αν κάτι ξεπεράσει τους προηγούμενους ελέγχους, δεν μπορεί να διαβάσει τα κλειδιά σας.

Επαλήθευση: assets/js/chat.js → stripImageMetadata(), SAFE_INLINE_IMAGE_MIMES, lockSession(), openMediaViewer(). Επίσης assets/js/app.js → logout().

9. Τι ΔΕΝ ισχυριζόμαστε

Δεν έχουμε «forward secrecy»

Το κλειδί ταυτότητάς σας είναι μακράς διάρκειας. Αν κάποιος αποκτήσει στο μέλλον το μυστικό σας κλειδί ή τον κωδικό ανάκτησής σας και έχει αποθηκεύσει παλιά κρυπτογραφημένη κίνηση, θα μπορούσε να την αποκρυπτογραφήσει αναδρομικά. Apps όπως το Signal χρησιμοποιούν εφήμερα κλειδιά ανά μήνυμα που σβήνουν αμέσως μετά — εμείς όχι ακόμα. (Αυτό βελτιώθηκε με την αλλαγή κλειδιών του Ιουλίου 2026: το κλειδί σας δεν παράγεται πια από τον κωδικό σας, οπότε ένας διαρρεύσας κωδικός από μόνος του δεν εκθέτει πλέον παλιά κίνηση. Παραμένει όμως όχι-per-message forward secrecy, και δεν θα προσποιηθούμε το αντίθετο.)

Τα συνθηματικά δωματίων αποθηκεύονται σε καθαρό κείμενο

Αυτή είναι μια συνειδητή επιλογή προϊόντος: ο admin πρέπει να μπορεί να βοηθήσει χρήστες που ξεχνούν το συνθηματικό ενός δωματίου. Δεν είναι ο κωδικός λογαριασμού σας (αυτός είναι hashed). Είναι μόνο το πρόσθετο συνθηματικό κάποιων δωματίων. Αν αυτό σας ενοχλεί, μην βάζετε συνθηματικό στο δωμάτιο.

Δεν αναζητούμε το περιεχόμενο των μηνυμάτων σας

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

Δεν μπορούμε να αποτρέψουμε screenshots

Κανείς δεν μπορεί. Όταν ένα μήνυμα είναι αποκρυπτογραφημένο στην οθόνη του παραλήπτη, εκείνος μπορεί να βγάλει screenshot, να φωτογραφίσει την οθόνη, να αντιγράψει το κείμενο. Προσπαθούμε να ανιχνεύσουμε screenshots σε iOS με μια ευρετική (το shutter animation κρύβει την οθόνη για λίγα ms) και να ειδοποιήσουμε τους συνομιλητές, αλλά είναι best-effort, όχι εγγύηση.

10. Πώς να επαληθεύσετε

Ο πιο γρήγορος τρόπος: ανοίξτε τα DevTools του browser σας → πηγαίνετε στο tab Network → στείλτε ένα μήνυμα → δείτε τι περιέχει το POST request προς το /api/send.php. Θα δείτε μόνο κρυπτογραφημένα bytes (Base64).

Για πιο βαθιά επαλήθευση, οι ενδιαφερόμενοι μπορούν να μελετήσουν τον πηγαίο κώδικα — ειδικά:

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

11. Επικοινωνία

Αν βρείτε κάτι που σας ανησυχεί — bug, υποψία ευπάθειας, ασάφεια σε αυτή τη σελίδα — γράψτε μας. Δεν προσποιούμαστε ότι είμαστε τέλειοι. Προτιμούμε να μάθουμε.