Как пользоваться
- Вставьте шестнадцатеричную строку в поле ввода. Hex уже выбран в качестве исходной кодировки, а Base64 — в качестве целевой.
- Не беспокойтесь о форматировании: пробелы, переводы строк, двоеточия, дефисы и префиксы 0x или \x игнорируются.
- Если значение будет использоваться в URL, JWT или JSON Web Key, выберите целевую кодировку Base64URL.
- Скопируйте результат в 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?
=.Как создать хеш Subresource Integrity?
integrity="sha384-..." со значением в Base64. С OpenSSL это можно сделать одной командой: openssl dgst -sha384 -binary file.js | openssl base64 -A.Результат — стандартный Base64 или безопасный для URL?
+ и /, как того требуют SRI, CSP и заголовки контрольных сумм HTTP. Если нужен результат, безопасный для URL, выберите целевую кодировку Base64URL.