Как проверить строку Base64
- Вставьте строку в поле Base64 для проверки. Переносы строк, PEM-обёртку и префиксы
data:можно не убирать: они попадут в список замечаний, а остальное всё равно будет разобрано. - Прочитайте вердикт вверху. У каждой проблемы указана позиция, например «в строке 3, столбце 17 (символ 169)».
- В блоке Ваш ввод с подсветкой проблем проблемные символы отмечены прямо на месте.
- Таблица Каким вариантам Base64 соответствует строка? покажет, корректна ли строка как стандартный Base64, Base64 без дополнения, URL-safe, MIME или PEM, а если нет, то почему.
- Кнопка Исправить переключает в режим исправления, который приводит строку в порядок.
Что проверяет валидатор
- Символы вне алфавита с кодом Unicode, чтобы стали видны и невидимые, например неразрывный пробел (U+00A0) или пробел нулевой ширины (U+200B).
- Смешанные алфавиты:
+и/из стандартного Base64 вместе с-и_из Base64URL в одной строке. =в середине: почти всегда признак того, что склеены два закодированных значения.- Невозможная длина: если после удаления дополнения длина даёт остаток 1 при делении на 4, такую строку не выдаст ни один кодировщик. Какой-то символ потерян или лишний.
- Дополнение: отсутствует, лишнее или не соответствует длине данных.
- Неканонические хвостовые биты в последнем символе (RFC 4648 §3.5).
- Пробелы и переносы строк: пробелы и табуляции, ширина строк и то, чем строки заканчиваются: CRLF, LF или вперемешку.
Подробности добавляют длину, длину mod 4, состояние дополнения, алфавит, размер после декодирования и определённый тип содержимого. Подсвеченная копия ввода ограничена первыми 20 000 символов, но анализ всегда охватывает всю строку.
Одна строка, разные декодеры
«Корректно» зависит от того, кто проверяет. Эти пять строк прогнаны через четыре распространённых декодера (Python 3.13, Node.js 24, WHATWG atob и GNU coreutils 9.7):
| Ввод | Проблема | Python b64decode(s, validate=True) | Node Buffer.from(s, "base64") | atob(s) | base64 -d |
|---|---|---|---|---|---|
SGVsbG8gd29ybGQ | нет = | ошибка | Hello world | Hello world | Hello world |
SGVsbG9= | неканонический последний символ | Hello | Hello | Hello | ошибка |
SGVsbG8=V29ybGQ= | склеены два значения | ошибка | Hello (остальное отброшено) | ошибка | HelloWorld |
SGVsbG8gd | остаток 1 | ошибка | Hello | ошибка | ошибка |
SGVs bG8= | пробел | ошибка | Hello | Hello | ошибка |
Самая опасная ячейка у Node: он молча возвращает Hello для склеенной строки и теряет половину данных без всякой ошибки. Именно поэтому инструмент сообщает о каждом отклонении, даже если ваш собственный декодер его прощает. А таблица вариантов показывает, какому строгому формату строка соответствует.
Корректная строка может не быть Base64
abcd, test и 1234 проходят проверку как корректный Base64. Каждая из этих строк декодируется в три случайных на вид байта. Поэтому инструмент отвечает и на вопрос Это точно Base64?: оценкой от 0 до 100 и списком причин, каждая из которых помечена как довод за или против:
- за: правильное дополнение, смесь заглавных и строчных букв с цифрами, большое разнообразие символов, начало
eyJ(так в Base64 выглядит{", типичное для JSON и JWT), байты, которые декодируются в известный тип файла или читаемый текст; - против: одни буквы (может быть словом), одни hex-цифры (может быть hex-строкой), одни цифры (скорее всего, число), один регистр букв или очень короткая строка.
Считайте оценку подсказкой. Это эвристика, и короткая строка может обмануть её в любую сторону.
Проверка Base64 в коде
Строже всего на практике проверяет круговой прогон: декодировать, закодировать заново и сравнить. Он разом отсекает пробелы, отсутствие дополнения и неканонические концовки.
import base64
def is_canonical_base64(s):
try:
return base64.b64encode(base64.b64decode(s, validate=True)).decode() == s
except ValueError:
return False
В Node.js та же идея выглядит как Buffer.from(s, "base64").toString("base64") === s. Регулярное выражение вроде ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$ проверяет алфавит и длину, но пропускает SGVsbG9= и пустую строку. URL-safe строки сначала преобразуйте или используйте соответствующий алфавит; см. Base64 и Base64URL. Сообщения об ошибках из разных языков собраны в статье Ошибки Base64.
Вопросы и ответы
Как проверить, что строка в Base64?
Формально строка считается корректным стандартным Base64, если в ней только A–Z, a–z, 0–9, + и /, длина кратна 4, а в конце стоит не больше двух =. Под это правило попадает множество обычных слов, поэтому инструмент добавляет оценку от 0 до 100: по виду строки и по тому, что получается после декодирования.
Почему Base64 декодируется в одном языке и падает в другом?
Декодеры по-разному строги. Buffer.from в Node принимает почти что угодно, b64decode(s, validate=True) в Python отвергает строку без дополнения, а GNU base64 -d отвергает неканонические последние символы. В таблице выше одни и те же пять строк прогнаны через четыре декодера.
Что такое неканонический Base64?
Последний символ несёт несколько неиспользуемых битов, которые должны быть нулями. SGVsbG8= и SGVsbG9= оба декодируются в Hello, но канонический только первый. RFC 4648 разрешает декодерам отвергать второй, а повторное кодирование его никогда не воспроизведёт.
Безопасно ли декодировать корректную строку Base64?
Корректность ничего не говорит о содержимом. В разделе Подробности видны размер после декодирования и определённый тип содержимого со ссылкой на подходящий декодер, так что ещё до сохранения ясно, текст это, картинка или что-то ещё.