Walidator Base64

Wklej ciąg, aby sprawdzić, czy jest prawidłowym Base64. Walidator określa wariant, wskazuje nieprawidłowe znaki i problemy z dopełnieniem oraz informuje, co zawierają dane po zdekodowaniu.

Działa w całości w przeglądarce. Nic nie jest wysyłane.

Jak używać

  1. Wklej ciąg do sprawdzenia w polu wejściowym.
  2. Odczytaj werdykt: prawidłowy lub nieprawidłowy, wykryty wariant (standardowy lub bezpieczny dla URL) oraz rozmiar po dekodowaniu.
  3. Jeśli pojawi się lista problemów, na podstawie podanych pozycji odszukaj nieprawidłowe znaki, białe znaki lub źle umieszczone dopełnienie.
  4. Sprawdź wykryty typ zawartości, aby dowiedzieć się, czy dane są tekstem, czy plikiem, np. PNG, PDF lub ZIP.

Kiedy Base64 jest prawidłowy

  • Alfabet. Dozwolone są tylko A-Z, a-z, 0-9 i dwa dodatkowe znaki: + i / w standardowym Base64 lub - i _ w Base64URL. Ciąg, w którym występują obie pary, zwykle został uszkodzony albo złożony z dwóch różnych źródeł.
  • Dopełnienie. Znak = może występować tylko na końcu i najwyżej dwa razy. Dopełnienie w środku zwykle oznacza, że połączono dwie zakodowane wartości.
  • Długość. Przy dopełnieniu długość jest wielokrotnością 4. Bez dopełnienia dopuszczalna jest każda długość oprócz 4n + 1: jeden pozostały znak przenosi tylko 6 bitów, czyli za mało na bajt.

Ścisłe dekodery stosują jeszcze jedną regułę: nieużywane najmniej znaczące bity ostatniego znaku muszą być zerami. Wiele dekoderów ignoruje te bity, ale niektóre, np. base64.StdEncoding.Strict() w Go, odrzucają taki ciąg.

Typowe błędy i sposoby ich naprawy

ProblemTypowa przyczynaRozwiązanie
Nieprawidłowy znakCudzysłowy, ukośniki wsteczne lub sekwencje %2B i %3D skopiowane razem z wartościąUsuń zbędne znaki lub najpierw zdekoduj ciąg z kodowania URL
Spacje w środkuZnaki + zamienione na spacje, gdy wartość przeszła przez URL lub formularzPrzywróć znaki + lub używaj Base64URL w adresach URL
Długość 4n + 1Wartość obcięta przez limit długości kolumny, wiersz logu lub niepełne kopiowanieSkopiuj ponownie całą wartość
Dopełnienie w środkuDwa połączone ze sobą ciągi Base64Rozdziel je i zdekoduj każdą część osobno
Podziały wierszyZawijanie wierszy MIME lub PEMZwykle nieszkodliwe; usuń je tam, gdzie wymagany jest jeden wiersz

Prawidłowy nie znaczy sensowny

Base64 nie ma nagłówka ani sumy kontrolnej, więc poprawność oznacza jedynie, że ciąg da się zdekodować. Test ten przechodzi wiele zwykłych słów: dowolne cztery litery tworzą prawidłową grupę. Dlatego walidator dodatkowo dekoduje dane i podaje ich rozmiar oraz typ zawartości. Czytelny tekst lub znana sygnatura pliku, np. PNG, PDF lub ZIP, to mocna przesłanka, że ciąg rzeczywiście jest zakodowany w Base64; garść losowych bajtów już nie. Aby sprawdzić także inne kodowania, wypróbuj wykrywacz kodowania.

Walidacja Base64 w kodzie

// JavaScript: standardowy Base64 z dopełnieniem (pasuje też do pustego ciągu)
/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/

# Python: zgłoś błąd zamiast pomijać nieprawidłowe znaki
import base64, binascii
try:
    base64.b64decode(s, validate=True)
except binascii.Error:
    print('invalid')

Najczęściej zadawane pytania

Dlaczego zwykłe słowo jest uznawane za prawidłowy Base64?
Ponieważ rzeczywiście jest prawidłowe. Każdy ciąg znaków z alfabetu o odpowiedniej długości dekoduje się do jakichś bajtów; na przykład słowo test daje po zdekodowaniu trzy bajty. Sprawdź wykryty typ zawartości: jeśli wynik nie jest ani czytelnym tekstem, ani znanym typem pliku, dane wejściowe najprawdopodobniej nigdy nie były zakodowane w Base64.
Czy Base64 ze spacjami lub podziałami wierszy jest prawidłowy?

MIME i PEM dzielą Base64 na wiersze, a większość dekoderów pomija białe znaki. Pola JSON, nagłówki HTTP, tokeny JWT i data URI oczekują jednak jednego nieprzerwanego ciągu. Walidator wymienia białe znaki osobno, aby można było ocenić, czy mają one znaczenie tam, gdzie ciąg zostanie użyty.

Czy Base64 bez dopełnienia = jest prawidłowy?
Często tak. Base64URL zwykle pomija dopełnienie, a RFC 4648 pozwala z niego zrezygnować, gdy długość wynika z kontekstu. Niektóre ścisłe dekodery nadal go wymagają; jeśli system odrzuca ciąg, dodawaj znaki =, aż długość będzie wielokrotnością 4. Ciągi bez dopełnienia o długości 4n + 1 znaków nigdy nie są prawidłowe.
Jak sprawdzić w JavaScripcie, czy ciąg jest zakodowany w Base64?
W przypadku ścisłego Base64 z dopełnieniem sprawdź ciąg wyrażeniem regularnym, które dopuszcza grupy po cztery znaki alfabetu i opcjonalne dopełnienie na końcu. Szybszym sposobem jest wywołanie atob() w bloku try/catch. Warto pamiętać, że atob() zgłasza wyjątek InvalidCharacterError dla błędnych danych, ale bez ostrzeżenia akceptuje białe znaki i brak dopełnienia, a przy tym nie przyjmuje znaków z wariantu bezpiecznego dla URL.