Base64 to sposób przedstawiania dowolnych danych binarnych jako tekstu złożonego wyłącznie z liter, cyfr i znaków +, / oraz =. Nie kompresuje ani nie szyfruje danych — wynik jest około jednej trzeciej większy, a każdy, kto zna algorytm, może odczytać oryginalną zawartość.
Jak działa kodowanie
Bajty wejściowe są grupowane po trzy (24 bity) i dzielone na cztery sześciobitowe bloki. Każdy blok odpowiada jednemu znakowi z alfabetu Base64 (A–Z, a–z, 0–9, +, /). Jeśli długość danych wejściowych nie jest wielokrotnością trzech bajtów, na końcu dodawany jest znak wypełniający =.
Do czego to służy
Wiele protokołów i formatów — e-mail (MIME), adresy URL, JSON, XML — jest przeznaczonych dla tekstu i nie radzi sobie dobrze z „surowymi" bajtami: bajtami zerowymi, znakami kontrolnymi czy sekwencjami kolidującymi ze składnią formatu. Base64 omija to ograniczenie, zamieniając dowolne dane binarne w bezpieczny tekst.
Typowe zastosowania
- Załączniki e-mail przez MIME.
- Przesyłanie obrazów lub małych plików w API JSON.
- Przechowywanie danych binarnych w polach tekstowych bazy danych lub pliku konfiguracyjnego.
- Kodowanie części header i payload tokenu JWT.
Czym Base64 NIE jest
To nie jest ani szyfrowanie, ani hashowanie. Każdy może zdekodować ciąg Base64 z powrotem do oryginalnych danych bez klucza czy hasła — to wyłącznie format reprezentacji, nie zabezpieczenie.
Alfabet standardowy i URL-safe
Klasyczny alfabet Base64 wykorzystuje znaki + i /, które mają specjalne znaczenie w adresach URL i nazwach plików. Dla takich przypadków istnieje wariant Base64URL, w którym + zastąpiono -, a / — _. Jeśli wynik standardowego kodowania wstawimy do URL bez dodatkowego percent-encoding, znaki + i / mogą zniekształcić adres lub kolidować z separatorami ścieżki.
Częsty błąd: obcięty lub „zepsuty" znak wypełniający
Znak = na końcu ciągu to nie śmieć, lecz część kodowania wskazująca, ile bajtów brakuje w ostatnim bloku. Jeśli skopiujemy ciąg Base64 niepełny albo usuniemy wypełnienie ręcznie, dekoder zwróci błąd lub urwany wynik. Niektóre systemy (np. JWT) celowo pomijają =, a wtedy długość trzeba odtworzyć przed dekodowaniem.