Конвертер Hex в Base64

Вставьте шестнадцатеричные байты и получите те же данные в Base64. Разделители вроде пробелов, двоеточий и префиксов 0x удаляются автоматически, так что хеши и отпечатки можно вставлять как есть.

Работает полностью в браузере. Данные никуда не загружаются.

Как пользоваться

  1. Вставьте шестнадцатеричную строку в поле ввода. Hex уже выбран в качестве исходной кодировки, а Base64 — в качестве целевой.
  2. Не беспокойтесь о форматировании: пробелы, переводы строк, двоеточия, дефисы и префиксы 0x или \x игнорируются.
  3. Если значение будет использоваться в URL, JWT или JSON Web Key, выберите целевую кодировку Base64URL.
  4. Скопируйте результат в Base64.

Зачем переводить hex в Base64

Большинство утилит хеширования выводят дайджесты в hex, но многие протоколы ожидают Base64, который на треть короче. Типичные случаи:

  • Subresource Integrity. Атрибут integrity у скриптов и таблиц стилей содержит дайджест в Base64, например sha384-, за которым следуют 64 символа Base64.
  • Content Security Policy. Хеши, разрешающие встроенные скрипты, записываются как 'sha256-...' со значением в Base64.
  • Контрольные суммы в HTTP API. Заголовок Content-MD5 и заголовки контрольных сумм Amazon S3 содержат Base64 двоичного дайджеста, а не шестнадцатеричную строку, которую выводит md5sum.
  • Компактные идентификаторы. UUID занимает 16 байт: это 32 шестнадцатеричные цифры, но всего 22 символа в Base64URL без дополнения.

Поддерживаемые форматы hex

Регистр шестнадцатеричных цифр не важен. Перед декодированием конвертер удаляет пробельные символы, переводы строк, двоеточия, точки с запятой, запятые, дефисы и префиксы 0x, \x, % и &#x. Это охватывает отпечатки OpenSSL вида AB:CD:EF, массивы в стиле C вида 0x12, 0x34, экранированные строки вида \x12\x34, байты в процентной кодировке и UUID с дефисами.

После очистки во входных данных должно остаться чётное число цифр, по две на байт. Нечётное количество считается ошибкой и обычно означает, что потерян ведущий ноль, например abc вместо 0abc.

Кодируйте байты, а не hex-текст

Частая ошибка — вставить шестнадцатеричный дайджест в обычный кодировщик текста в Base64. Тогда кодируются символы 0-9a-f, а не байты, которые они обозначают, и результат получается вдвое длиннее, чем нужно: 88 символов для дайджеста SHA-256 вместо 44. Всё, что ожидает двоичный дайджест, например атрибут SRI или заголовок контрольной суммы, такое значение отвергнет. Этот конвертер сначала декодирует hex в байты.

# Командная строка: шестнадцатеричный дайджест в Base64
printf '%s' "$HEX" | xxd -r -p | base64

# Значение SRI для файла одной командой
openssl dgst -sha384 -binary script.js | openssl base64 -A

# Python
base64.b64encode(bytes.fromhex(h)).decode()

// Node.js (молча останавливается на первом символе, не являющемся hex-цифрой)
Buffer.from(h, 'hex').toString('base64')

Часто задаваемые вопросы

Почему моя шестнадцатеричная строка вызывает ошибку?

Либо во входных данных есть символ, не являющийся шестнадцатеричной цифрой, например буква O вместо нуля, либо количество цифр нечётное. В сообщении об ошибке указана позиция недопустимого символа; при нечётной длине проверьте, не пропущен ли ведущий 0.

Какой длины будет результат в Base64?
Разделите количество шестнадцатеричных цифр на 2, чтобы получить число байтов, затем считайте по 4 символа на каждые 3 байта с округлением вверх. 64-значный дайджест SHA-256 превращается в 44 символа Base64, включая один знак =.
Как создать хеш Subresource Integrity?
Вычислите дайджест SHA-384 файла, преобразуйте здесь шестнадцатеричный результат и запишите integrity="sha384-..." со значением в Base64. С OpenSSL это можно сделать одной командой: openssl dgst -sha384 -binary file.js | openssl base64 -A.
Результат — стандартный Base64 или безопасный для URL?
Стандартный Base64 с символами + и /, как того требуют SRI, CSP и заголовки контрольных сумм HTTP. Если нужен результат, безопасный для URL, выберите целевую кодировку Base64URL.