Τι είναι το Base64;
Το Base64 ξαναγράφει τα byte με εξήντα τέσσερις αναγνώσιμους χαρακτήρες, ώστε τα δεδομένα να επιβιώνουν σε κανάλι φτιαγμένο για κείμενο: σώμα email, συμβολοσειρά JSON, χαρακτηριστικό XML, URL. Κάθε τρία byte γίνονται τέσσερις χαρακτήρες, και από εκεί προέρχεται το όνομα — το αλφάβητο έχει εξήντα τέσσερα σύμβολα και καθένα μεταφέρει ακριβώς έξι bit.
Πρόκειται για κωδικοποίηση μεταφοράς, όχι μέτρο ασφαλείας και όχι βήμα συμπίεσης. Η έξοδος είναι περίπου κατά ένα τρίτο μεγαλύτερη από την είσοδο, και όποιος έχει τη συμβολοσειρά μπορεί να την αναστρέψει αμέσως. Αν ο στόχος είναι να διαπιστωθεί αν τα δεδομένα αλλοιώθηκαν, χρειάζεται ένα hash (Hash Generator)· αν ο στόχος είναι να μείνουν μυστικά, χρειάζεται κρυπτογράφηση. Το Base64 δεν κάνει ούτε το ένα ούτε το άλλο.
Ο κρίσιμος αριθμός: τρία byte εισόδου γίνονται τέσσερις χαρακτήρες εξόδου. Όλα τα υπόλοιπα σε αυτή τη σελίδα προκύπτουν από αυτόν. Οι τέσσερις χαρακτήρες μεταφέρουν είκοσι τέσσερα bit, και τα είκοσι τέσσερα bit είναι ακριβώς τρία byte, οπότε δεν χάνονται ούτε επινοούνται ποτέ δεδομένα — εκτός από το τέλος, όπου η είσοδος μπορεί να μη γεμίζει την τελευταία ομάδα των τριών.
Τα πέντε αλφάβητα που μπορεί να χρησιμοποιήσει αυτή η σελίδα
Οι δύο πρώτες γραμμές είναι πρότυπα και οι τρεις τελευταίες συμβάσεις που αναπτύχθηκαν γύρω από το Unix. Και τα πέντε μεταφέρουν τα ίδια έξι bit ανά χαρακτήρα και διαφέρουν μόνο ως προς το ποιους εξήντα τέσσερις χαρακτήρες χρησιμοποιούν για τη μεταφορά, οπότε τα ίδια byte γίνονται πέντε διαφορετικές συμβολοσειρές. Τίποτα μέσα σε μια συμβολοσειρά δεν δηλώνει ποιο αλφάβητο την παρήγαγε, γι' αυτό ο επιλογέας αλφαβήτου έχει ως προεπιλογή το τυπικό και γι' αυτό το πλαίσιο ασφαλούς για URL είναι συντόμευση για τη δεύτερη γραμμή.
Πώς η σελίδα επιλέγει υποψήφιο: ο επιλογέας είναι η προεπιλογή και για τις δύο κατευθύνσεις. Κατά την αποκωδικοποίηση, το πλαίσιο δεξιά διαβάζει και το ίδιο το κείμενο — το - και το _ μπορούν να προέρχονται μόνο από το αλφάβητο ασφαλές για URL, το + ή το / μόνο από το τυπικό, και ένα / ή . κοντά στην αρχή παραπέμπει στα δύο αλφάβητα Unix. Κάθε αλφάβητο που μπορεί να διαβάσει την τρέχουσα είσοδο αναγράφεται εκεί, με την αιτιολογία για το αν είναι ή όχι υποψήφιο.
Αναδίπλωση γραμμής: 76 και 64 χαρακτήρες
Το MIME ζήτησε Base64 που να χωράει σε email χωρίς καμία γραμμή να μεγαλώνει υπερβολικά, και κατέληξε σε 76 χαρακτήρες ανά γραμμή, χωρισμένες με CRLF. Τα αρχεία PEM, που τυλίγουν πιστοποιητικά και κλειδιά, χρησιμοποιούν 64. Οι αλλαγές γραμμής δεν αποτελούν μέρος των δεδομένων: ο αποκωδικοποιητής τις αφαιρεί και ενώνει ξανά τις γραμμές πριν κάνει οτιδήποτε άλλο, οπότε μια τυλιγμένη και μια μη τυλιγμένη συμβολοσειρά αποκωδικοποιούνται στα ακριβώς ίδια byte. Κάθε γραμμή εκτός από την τελευταία περιέχει ακέραιο αριθμό ομάδων τεσσάρων χαρακτήρων, και αυτό είναι που καθιστά ασφαλή την ένωσή τους.
Η σελίδα αφήνει την έξοδο σε μία γραμμή εκτός αν επιλεγεί πλάτος, και ο αποκωδικοποιητής δέχεται είσοδο με ή χωρίς αλλαγές γραμμής. Οι αλλαγές που γράφει αυτή η σελίδα είναι απλά line feed, που είναι ό,τι μπορεί να χωρέσει ένα πλαίσιο κειμένου· τα σώματα email MIME χρησιμοποιούν παραδοσιακά carriage return πριν από κάθε line feed, και κάθε αποκωδικοποιητής που χρησιμοποιείται δέχεται και τα δύο.
Συμπλήρωση και γιατί μπορεί να παραλειφθεί
Όταν η είσοδος δεν είναι πολλαπλάσιο των τριών byte, η τελευταία ομάδα τεσσάρων χαρακτήρων είναι ημιτελής, και ένας ή δύο χαρακτήρες = τη συμπληρώνουν. Δεν μεταφέρουν καθόλου δεδομένα: δείχνουν μόνο πόσοι από τους τέσσερις χαρακτήρες είναι πραγματικοί. Ο αποκωδικοποιητής μπορεί να το υπολογίσει από το μήκος, και γι' αυτό το Base64 ασφαλές για URL παραδοσιακά αφήνει τη συμπλήρωση έξω — το = είναι άβολο σε URL ή όνομα αρχείου, και ορισμένα συστήματα το κωδικοποιούν με ποσοστά.
Το πλαίσιο επιλογής στη γραμμή επιλογών διατηρεί τη συμπλήρωση όταν επιλέγεται το αλφάβητο ασφαλές για URL. Τίποτα άλλο δεν αλλάζει· οι χαρακτήρες που μεταφέρουν δεδομένα είναι πανομοιότυποι και στις δύο περιπτώσεις.
Συνηθισμένες παρανοήσεις
- "Το Base64 κρύβει τα δεδομένα." Δεν το κάνει. Είναι αντικατάσταση χωρίς κλειδί, και ακριβώς σε αυτό έγκειται: κάθε αναγνώστης μπορεί να την αναιρέσει. Η περιτύλιξη ενός κωδικού πρόσβασης ή ενός διακριτικού σε Base64 δεν αλλάζει τίποτα ως προς το ποιος μπορεί να το διαβάσει.
- "Το Base64 συμπιέζει." Το αντίθετο: κάθε τρία byte εισόδου γίνονται τέσσερις χαρακτήρες εξόδου, οπότε το κείμενο είναι κατά ένα τρίτο μεγαλύτερο από τα δεδομένα που μεταφέρει.
- "Οι αλλαγές γραμμής είναι μέρος της τιμής." Είναι στοιχείο παρουσίασης. Η προσθήκη ή η αφαίρεσή τους δεν αλλάζει ποτέ τα byte που επιστρέφουν.
- "Το ασφαλές για URL σημαίνει διαφορετική κωδικοποίηση." Είναι η ίδια κωδικοποίηση με δύο χαρακτήρες αντικατεστημένους: το
+ γίνεται - και το / γίνεται _, οπότε η συμβολοσειρά μπορεί να τοποθετηθεί σε διαδρομή URL ή τιμή ερωτήματος χωρίς διαφυγή.
- "Μια συμβολοσειρά που αποκωδικοποιείται πρέπει να είναι έγκυρο Base64." Κάθε συμβολοσειρά από χαρακτήρες του αλφαβήτου είναι έγκυρο Base64, επειδή κάθε συνδυασμός τιμών των έξι bit είναι έγκυρη ακολουθία byte. Μια συμβολοσειρά αποδεικνύεται λανθασμένη μόνο στο επόμενο βήμα, όταν τα byte ελέγχονται έναντι της μορφής για την οποία προορίζονταν.
- "Η συμπλήρωση δείχνει ποιο αλφάβητο χρησιμοποιήθηκε." Δεν το δείχνει, και στις περισσότερες περιπτώσεις ούτε οι χαρακτήρες. Το τυπικό και το ασφαλές για URL αλφάβητο συμφωνούν στους εξήντα δύο από τα εξήντα τέσσερα σύμβολά τους, οπότε μια σύντομη συμβολοσειρά συχνά διαβάζεται το ίδιο και με τα δύο.
Ερωτήσεις που προκύπτουν συχνά
Γιατί μια συμβολοσειρά Base64 τελειώνει άλλοτε με ένα = και άλλοτε με δύο; Το ένα σημαίνει ότι η τελευταία ομάδα μεταφέρει τρεις πραγματικούς χαρακτήρες, δηλαδή δύο byte εισόδου· τα δύο σημαίνουν ότι μεταφέρει δύο, δηλαδή ένα byte εισόδου. Χωρίς = το μήκος της εισόδου ήταν πολλαπλάσιο των τριών.
Μπορεί το Base64 να αναπαραστήσει αυθαίρετα δυαδικά αρχεία; Ναι, και αυτή είναι η κύρια χρήση του. Η σελίδα αυτή αντιμετωπίζει την είσοδο ως κείμενο UTF-8· το αφιερωμένο εργαλείο Αρχείο σε Base64 διαβάζει ακατέργαστα byte όταν πρόκειται να κωδικοποιηθεί κάτι που δεν είναι κείμενο.
Ποιο αλφάβητο χρησιμοποιείται σε ένα API; Αυτό που τεκμηριώνει ο λήπτης. Αν αναφέρει ασφαλές για URL, τότε αυτό· αν δεν αναφέρει τίποτα και η τιμή ταξιδεύει μέσα σε URL, η επιλογή ασφαλής για URL χωρίς συμπλήρωση είναι η ασφαλής.
Η έξοδος διακρίνει πεζά και κεφαλαία; Πλήρως. Το a και το A είναι διαφορετικές τιμές, γι' αυτό το Base64 αντέχει ένα λανθασμένα πληκτρολογημένο χαρακτήρα πολύ λιγότερο ομαλά απ' ό,τι το Base32 ή το Crockford Base32.