Czym jest Base64 i kiedy się go używa

Base64 to sposób zapisu dowolnych bajtów za pomocą tylko 64 bezpiecznych znaków: wielkich i małych liter, cyfr, plusa i ukośnika. Jest potrzebny, gdy dane binarne muszą przejść przez kanał przeznaczony dla tekstu: załączniki e-mail, obrazy osadzone na stronie jako data URI, klucze i certyfikaty w plikach PEM, tokeny JWT.

Mechanizm jest prosty: bierze się trzy bajty, czyli 24 bity, i dzieli je na cztery grupy po sześć. Sześć bitów to wartości od 0 do 63, a każdej wartości odpowiada jeden znak. Gdy na końcu zostaje jeden lub dwa bajty, uzupełnia się je zerami, a znak = pokazuje, ile znaków nie niesie danych. Dlatego ciąg Base64 jest zawsze mniej więcej o jedną trzecią dłuższy niż dane pierwotne.

Base64 to nie szyfrowanie: każdy może go odkodować bez klucza. Przekształca, nie chroni. Wariant URL-safe zamienia + i / na - i _, bo pierwsze dwa mają znaczenie w adresach internetowych, i często pomija dopełnienie.

Częste błędy

  • Traktowanie Base64 jako sposobu na ukrycie hasła: to kodowanie, które każdy może odwrócić, i nie daje żadnego bezpieczeństwa.
  • Dekodowanie jako tekstu danych, które tekstem nie są: obraz lub klucz w Base64 dają bajty, które nie tworzą poprawnego UTF-8, i to jest normalne.
  • Mieszanie dwóch alfabetów: ciąg URL-safe z - i _ podany standardowemu dekoderowi zostaje odrzucony albo źle odczytany, jeśli dekoder pomija nieznane znaki.

Najczęstsze pytania

Dlaczego ciąg Base64 kończy się jednym lub dwoma znakami =?

Ponieważ dane nie były wielokrotnością trzech bajtów. Jeden pozostały bajt daje dwa znaki i dwa =, dwa bajty dają trzy znaki i jedno =. Dopełnienie mówi dekoderowi, ile bajtów odtworzyć; wiele dekoderów, w tym ten, akceptuje też jego brak.

O ile dłuższy staje się plik w Base64?

Każde trzy bajty stają się czterema znakami, czyli około 33% więcej, z zaokrągleniem w górę do wielokrotności czterech. Obraz o rozmiarze 30 kB staje się ciągiem o długości około 40 kB.

Co oznacza liczba całkowita big-endian?

Bajty są czytane jako jedna liczba, w której pierwszy bajt jest najbardziej znaczącą cyfrą w systemie o podstawie 256. Bajty 01 00 mają wartość 256. To ta sama kolejność, której używają protokoły sieciowe i duże liczby w kryptografii.

Dlaczego odkodowany tekst pokazuje dziwne znaki albo nie pojawia się wcale?

Bo bajty nie są tekstem UTF-8: mogą być obrazem, skompresowanym plikiem albo tekstem w innym kodowaniu, np. Latin-1 lub Windows-1250. Wtedy liczy się zapis szesnastkowy, który pokazuje bajty takimi, jakie są.

Jak działa to obliczenie

Każda grupa trzech bajtów b₁ b₂ b₃ tworzy liczbę N = b₁·65536 + b₂·256 + b₃. Cztery znaki to pozycje ⌊N / 262144⌋, ⌊N / 4096⌋ mod 64, ⌊N / 64⌋ mod 64 oraz N mod 64 w alfabecie ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/. Dekodowanie przebiega odwrotnie. Liczba całkowita to suma bajtów ważonych przez 256 podniesione do ich pozycji liczonej od prawej.