Web & Dev Εργαλεία 5 λεπτά ανάγνωση

Base64, URL Encoding και Punycode — Οδηγός

Τι είναι το Base64 και πότε να το χρησιμοποιήσεις, πώς λειτουργεί το URL encoding και τι είναι το Punycode για ελληνικά domain.

Τι Είναι το Base64 — και Γιατί Χρειάζεται;

Το Base64 είναι ένα σχήμα κωδικοποίησης που μετατρέπει δυαδικά δεδομένα (binary) σε μια σειρά από εκτυπώσιμους ASCII χαρακτήρες. Ο λόγος ύπαρξής του είναι απλός: πολλά πρωτόκολλα και συστήματα (email, HTTP headers, JSON) σχεδιάστηκαν για κείμενο και δεν μπορούν να «μεταφέρουν» ακατέργαστα bytes χωρίς να αλλοιωθούν.

Το Base64 χρησιμοποιεί έναν αλφάβητο 64 χαρακτήρων: τα γράμματα A–Z και a–z (52), τους αριθμούς 0–9 (10) και τα σύμβολα + και / (2). Κάθε 3 bytes εισόδου γίνονται 4 χαρακτήρες εξόδου — αύξηση μεγέθους ~33%. Αν τα bytes δεν διαιρούνται ακριβώς με 3, προστίθεται padding με τον χαρακτήρα = (ένα ή δύο) ώστε το output να έχει πάντα μήκος πολλαπλάσιο του 4.

Είσοδος (3 bytes):  M  a  n
Binary:             01001101 01100001 01101110
Base64 groups:      010011  010110  000101  101110
Έξοδος:             T      W      F      u  → TWFu

Πρακτικές Χρήσεις του Base64

JWT Tokens

Ένα JSON Web Token αποτελείται από τρία μέρη χωρισμένα με τελεία: header.payload.signature. Τα δύο πρώτα μέρη (header και payload) είναι κωδικοποιημένα με Base64URL — μια παραλλαγή του Base64 κατάλληλη για URLs. Αυτό σημαίνει ότι οποιοσδήποτε μπορεί να τα αποκωδικοποιήσει και να δει τα περιεχόμενα:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
 → {"alg":"HS256","typ":"JWT"}

Μόνο η υπογραφή (τρίτο μέρος) εξασφαλίζει ακεραιότητα — το JWT δεν κρυπτογραφεί τα δεδομένα, απλώς τα υπογράφει.

HTTP Basic Authentication

Το Basic Auth κωδικοποιεί τα διαπιστευτήρια ως username:password σε Base64 και τα στέλνει στο header:

Authorization: Basic dXNlcjpwYXNz

Αποκωδικοποιώντας: dXNlcjpwYXNzuser:pass. Για αυτό το Basic Auth πρέπει πάντα να χρησιμοποιείται μόνο πάνω από HTTPS — η κωδικοποίηση δεν προσφέρει καμία ασφάλεια από υποκλοπή.

Data URIs

Εικόνες, γραμματοσειρές και άλλα αρχεία μπορούν να ενσωματωθούν απευθείας σε HTML/CSS χωρίς εξωτερικό αίτημα:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

Χρήσιμο για μικρά εικονίδια σε email templates ή για να μειωθούν τα HTTP requests σε σελίδες.

Email MIME Attachments

Το πρωτόκολλο MIME χρησιμοποιεί Base64 για να μεταφέρει συνημμένα αρχεία (PDF, εικόνες) μέσα στο σώμα ενός email, το οποίο μεταδίδεται ως αμιγές κείμενο.

Base64 vs Base64URL — Ποια Διαφορά;

Το κλασικό Base64 χρησιμοποιεί + και /, χαρακτήρες που έχουν ειδική σημασία σε URLs (query string, path). Το Base64URL τους αντικαθιστά:

ΠαραλλαγήΧαρακτήρεςPaddingΧρήση
Base64A–Z a–z 0–9 + /= (υποχρεωτικό)Email, data URIs, γενική χρήση
Base64URLA–Z a–z 0–9 - _Συνήθως παραλείπεταιJWT, OAuth tokens, URL parameters

URL Encoding (Percent-Encoding)

Το URL encoding (ή percent-encoding) μετατρέπει χαρακτήρες που δεν επιτρέπονται σε URLs σε μορφή %XX, όπου XX είναι το hexadecimal του byte στο UTF-8. Κάθε ειδικός χαρακτήρας, κενό ή μη-ASCII γράμμα αντικαθίσταται έτσι:

Ελλάδα → %CE%95%CE%BB%CE%BB%CE%AC%CE%B4%CE%B1
κενό   → %20  (ή + σε form data)
&      → %26
=      → %3D

Στη JavaScript υπάρχουν δύο διαφορετικές συναρτήσεις:

  • encodeURIComponent(): κωδικοποιεί τα πάντα εκτός από A–Z a–z 0–9 - _ . ! ~ * ' ( ). Κατάλληλο για τιμές query string parameters.
  • encodeURI(): δεν κωδικοποιεί χαρακτήρες που έχουν δομικό ρόλο στο URL (: / ? # [ ] @ ! $ & ' ( ) * + , ; =). Κατάλληλο για ολόκληρο URL.
encodeURIComponent("hello world&foo=bar")
 → "hello%20world%26foo%3Dbar"

encodeURI("https://example.com/search?q=hello world")
 → "https://example.com/search?q=hello%20world"

Punycode και Διεθνοποιημένα Domains (IDN)

Το σύστημα DNS σχεδιάστηκε αποκλειστικά για ASCII χαρακτήρες. Για να υποστηριχθούν domain names με ελληνικά, κινέζικα ή αραβικά γράμματα (IDN — Internationalized Domain Names), αναπτύχθηκε το Punycode (RFC 3492).

Το Punycode μετατρέπει Unicode labels σε ASCII με το πρόθεμα xn--:

ελλάδα.gr    → xn--hxakic4aa.gr
münchen.de   → xn--mnchen-3ya.de
παράδειγμα.com → xn--hxajbheg2az3al.com

Ο browser εμφανίζει στη γραμμή διεύθυνσης την Unicode μορφή (πιο φιλική), αλλά στο δίκτυο αποστέλλεται πάντα η Punycode μορφή. Αυτό έχει σημασία σε DNS queries, πιστοποιητικά SSL και ρυθμίσεις email.

Σύγκριση: Base64 / URL Encode / Punycode

ΚωδικοποίησηΣκοπόςΤυπική ΕίσοδοςΤυπική Έξοδος
Base64 Binary → ASCII κείμενο Αρχεία, bytes, credentials dXNlcjpwYXNz
URL Encode Ασφαλής ενσωμάτωση σε URL Query params, ελληνικά κείμενα %CE%B5%CE%BB
Punycode Unicode domain → ASCII DNS IDN domain names xn--hxakic4aa.gr

Δοκιμάστε Base64, URL Encoding και Punycode μετατροπές απευθείας στο εργαλείο:

→ Base64 & URL Encoder

Συχνές Ερωτήσεις

Το Base64 είναι μορφή κρυπτογράφησης;
Όχι. Το Base64 είναι κωδικοποίηση, όχι κρυπτογράφηση — δεν χρειάζεται κλειδί και είναι πλήρως αναστρέψιμο από οποιονδήποτε. Δεν προσφέρει καμία ασφάλεια ή εμπιστευτικότητα. Μπερδεύεται συχνά με κρυπτογράφηση επειδή το output φαίνεται «τυχαίο», αλλά ένα απλό online εργαλείο μπορεί να το αποκωδικοποιήσει σε δευτερόλεπτα.
Πώς αναγνωρίζω αν ένα string είναι Base64;
Ένα Base64 string χρησιμοποιεί μόνο χαρακτήρες από το σύνολο A–Z a–z 0–9 + / =, το μήκος του είναι πάντα πολλαπλάσιο του 4 (με padding), και τελειώνει συχνά με ένα ή δύο =. Αν το μήκος δεν διαιρείται με 4 ή περιέχει άλλους χαρακτήρες, πιθανόν να είναι Base64URL ή απλώς κείμενο.
Ποια διαφορά έχει το URL encode από το rawurlencode στην PHP;
Στην PHP, η urlencode() κωδικοποιεί τα κενά ως + (στυλ HTML form data), ενώ η rawurlencode() τα κωδικοποιεί ως %20 σύμφωνα με το RFC 3986. Για URL paths και query parameters που δεν προέρχονται από φόρμες, χρησιμοποιήστε rawurlencode() — είναι πιο ασφαλής επιλογή και συμβατή με όλα τα HTTP clients.
Επηρεάζει το Punycode το SEO του domain μου;
Τα IDN domains (π.χ. ελλάδα.gr) είναι πλήρως αποδεκτά από το Google και δεν υπάρχει ποινή SEO. Ωστόσο, εάν χρησιμοποιείτε ελληνικό domain, βεβαιωθείτε ότι το SSL πιστοποιητικό σας καλύπτει και τη Punycode μορφή (xn--...), διότι ορισμένες CA εκδίδουν πιστοποιητικά μόνο για τη μία μορφή. Επίσης, τα email που στέλνονται από IDN domain χρειάζονται ειδική υποστήριξη (EAI / RFC 6531) από τον mail server.

Δοκιμάστε αμέσως

Σχετικοί οδηγοί

Αναφορά σφάλματος