Без загрузки, 100% локально, без аккаунта

Статья

Кодируйте и декодируйте данные приватно

Разработчики каждый день вставляют токены, полезную нагрузку и учётные данные на страницы кодирования и декодирования. Самые удобные из них работают на сервере, а значит, ваши данные покидают устройство ради задачи, которая этого никогда не требовала. Эти четыре инструмента работают целиком в браузере, поэтому данные остаются у вас.

Base64: выглядит запутанно, но это не секрет

Base64 является кодированием, а не шифрованием. Оно превращает двоичные данные в текст, способный пережить копирование и вставку или прохождение через системы, которые работают только с простыми символами. Любой, кто видит строку Base64, может в один шаг декодировать её обратно в оригинал, поэтому строка с ключом API, закрытым сертификатом или телом письма полностью читаема для того, кто её держит. Опасность в том, что это значение часто прячется в файлах конфигурации, data URL или заголовках аутентификации и выглядит непонятно, что подталкивает вставить его в первый попавшийся онлайн-декодер. Этот декодер получает необработанный секрет. Инструмент, декодирующий Base64 локально, показывает вам исходные байты, и значение при этом никогда не попадает на сервер.

Hello! кодируется в SGVsbG8h и декодируется обратно, показывая, что Base64 может обратить кто угодно без ключа.

Кодирование URL: строки запроса несут больше, чем вы думаете

Процентное кодирование позволяет безопасно поместить в URL пробелы, диакритику и зарезервированные символы. Текст, который вы кодируете или декодируете, часто является настоящей строкой запроса из приложения, а такие строки несут идентификаторы сессии, поисковые запросы, адреса электронной почты, цели перенаправления и иногда подписанные параметры. Вставка полного URL в удалённый кодировщик передаёт всё это третьей стороне разом, а строки запроса представляют собой именно тот вид значений, который попадает в серверные журналы. Кодировать и декодировать в браузере означает, что URL обрабатывается в памяти на вашем собственном устройстве и никогда не передаётся, пока вы с ним работаете.

JWT: полезная нагрузка подписана, а не скрыта

JSON Web Token состоит из трёх разделов Base64url, соединённых точками: заголовка, полезной нагрузки и подписи. Подпись доказывает, что токен не был изменён, но никак не скрывает полезную нагрузку, которая декодируется в читаемый JSON с идентификаторами пользователя, ролями, временем истечения и любыми пользовательскими утверждениями, добавленными издателем. Действующий токен является ещё и живыми учётными данными: пока он не истёк, любой, кто его держит, может действовать от имени пользователя. Вставка рабочего токена в онлайн-декодер отправляет активные учётные данные на сервер, который вы не контролируете. Декодер, разбирающий токен в вашем браузере, показывает тот же заголовок и полезную нагрузку, и токен при этом никогда не покидает страницу.

Три части JWT: читаемый заголовок, читаемый payload и подпись, которая доказывает целостность, ничего не скрывая.

Хеширование: ввод важнее, чем итоговый хеш

Хеш-функция превращает любой ввод в хеш фиксированной длины, и обратить хеш в исходный ввод нельзя. Это свойство делает хеширование полезным для проверки целостности файла или сравнения значений без хранения оригинала. Подвох на стороне ввода: чтобы вычислить хеш пароля, документа или секрета конфигурации, нужно передать инструменту настоящее значение. Если инструмент работает на сервере, конфиденциальный ввод отправляется туда, хотя возвращается лишь безобидный хеш. Вычисление хеша локально оставляет ввод на вашем устройстве, поэтому вы получаете нужный хеш, не раскрывая то, что хешировали.

Кодирование Base64: отображение байтов и заполнение

Base64 переводит 8-битные байты в 6-битные символы, группируя три входных байта (24 бита) в четыре 6-битных значения. Каждое 6-битное значение соответствует символу алфавита Base64 (A-Z, a-z, 0-9, +, /). Поскольку процесс требует, чтобы объём входных данных был кратен 24 битам, короткие данные дополняются: один оставшийся байт порождает два символа заполнения (==), два оставшихся байта (=). Вариант Base64url, используемый в JSON Web Token (JWT), заменяет + на - и / на _, чтобы строка была безопасна для URL, и полностью убирает символы заполнения =, так как они могут вызывать ошибки в строгих парсерах URI. Понимание этого различия важно при отладке обработки токенов: JWT, выглядящий повреждённым, может просто быть закодирован в Base64url, а не в стандартном Base64.

Подписи JWT: HS256, RS256 и подмена алгоритма

Безопасность JSON Web Token целиком зависит от его подписи, третьего сегмента, разделённого точками. При HS256 (HMAC-SHA256) сервер подписывает закодированный в Base64url заголовок и полезную нагрузку с помощью секретного ключа. Хэш-функция SHA-256 обеспечивает устойчивость к коллизиям: вычислительно невозможно создать изменённую полезную нагрузку с тем же значением подписи без знания секретного ключа. При RS256 сервер подписывает данные с помощью приватного ключа RSA, а для проверки использует публичный ключ. Известная уязвимость под названием «подмена алгоритма» возникает, когда серверная библиотека не проверяет строго ожидаемый тип алгоритма. Злоумышленник может изменить поле alg в заголовке токена с RS256 на HS256 и подписать токен, используя публичный ключ сервера как HMAC-секрет, поскольку публичные ключи нередко доступны публично. Декодирование заголовка JWT локально в браузере позволяет проверить, какой алгоритм реально указан, не передавая активный токен в сторонние системы журналирования.

Инструменты из этой статьи

Частые вопросы

Является ли Base64 или кодирование URL формой защиты?

Нет. Оба представляют собой обратимые кодирования, созданные для безопасной передачи данных, а не для их защиты. Любой, кто прочитает закодированную строку, мгновенно декодирует её без ключа и пароля. Если значение нужно держать в секрете, зашифруйте его подходящим алгоритмом и управляйте ключом отдельно. Считайте любое значение в Base64 или с процентным кодированием так, словно оно написано открытым текстом.

Почему важно, где я декодирую токен или хеширую пароль?

Потому что конфиденциальной частью является ввод. Действующий JWT представляет собой живые учётные данные, а пароль, который вы хешируете, есть настоящий секрет. Серверный инструмент получает этот необработанный ввод ещё до того, как вернёт результат, а значит, копия может попасть в журнал или сохраниться там, где вы её не увидите. Инструмент, работающий в вашем браузере, выполняет ту же операцию в памяти вашего собственного устройства, поэтому токен или пароль никуда не отправляются.