Анатомия onion-адреса v3: что на самом деле закодировано в 56 символах
Любой onion-адрес v3 выглядит как шум с клавиатуры: 56 строчных букв и цифр, заканчивающихся буквой d. Последний символ — не совпадение, как и всё остальное в строке. Каждый из 56 символов вычисляется по короткому рецепту из спецификации rendezvous проекта Tor, которая превращает открытый ключ сервиса ровно в тот адрес, который примет Tor Browser.
Что на самом деле кодируют 56 символов
Раздел кодирования спецификации rendezvous определяет onion-адрес как base32-кодирование ровно 35 байтов, за которыми следует суффикс .onion:- Байты 1–32: открытый ключ идентичности ed25519 сервиса — ключ, закрытая половина которого подписывает всё, что сервис публикует.
- Байты 33–34: контрольная сумма — первые два байта SHA3-256 от константной строки ".onion checksum", открытого ключа и байта версии.
- Байт 35: поле версии, зафиксированное на 0x03 для адресов третьего поколения.
Контрольная сумма, которая ловит опечатки
Два байта контрольной суммы существуют потому, что у onion-имён нет ни реестра, ни WHOIS, ни автодополнения в браузере, которые поймали бы ошибку. Идея заимствована у Bitcoin, чьи адреса Base58Check добавляют похожий суффикс на основе хеша; когда разработчики Tor предложили формат в начале 2017 года, они изложили арифметику в предложении в списке рассылки:"В случае опечатки в адресе мы имеем вероятность 1/65536 не обнаружить ошибку."Один неверно набранный символ меняет вход хеширования, поэтому пересчитанная контрольная сумма почти никогда не совпадает, и клиент Tor отклоняет строку как недействительную ещё до попытки соединения. Просачивается лишь примерно одна ошибка из 65 536, а опечатка, прошедшая контрольную сумму, указывает на случайный 32-байтовый ключ, которому почти наверняка не принадлежит ни один сервис. Цена этого остаточного риска — два байта; альтернативой были бы молчаливые соединения с тем, во что декодируется неверно набранный адрес.
Адрес — это и есть ключ: центр сертификации не нужен
В обычном вебе браузер доверяет тому, что имя принадлежит ключу, потому что так говорит центр сертификации. Onion-адреса встраивают эту гарантию в само имя. 56 символов — это открытый ключ сервиса, поэтому адресу не нужен реестр, и её нельзя выдать дважды — два сервиса не могут поделить один адрес, потому что каждый адрес — это отдельный ключ. Документация Tor по onion-сервисам описывает, как это работает при подключении: сервис публикует дескриптор, подписанный закрытой половиной ключа, закодированного в его адресе, а клиент проверяет подпись ещё до построения цепочки, подтверждая, что дескриптор "мог быть создан только этим onion-сервисом и никем другим". Именно это разработчики Tor называют самоаутентификацией. Обзор сервисов v3 от Tor Project 2021 года приписывает тому же дизайну и приватностные достоинства формата: каталоговые реле обрабатывают лишь ослеплённую производную ключа идентичности, поэтому точки введения так и не узнают открытый ключ, который записан в адресе. Аутентификация, иначе говоря, не добавляется третьей стороной; она присутствует в каждом символе.Что означает утечка закрытого ключа
Сосредоточив идентичность в одном ключе, вы сосредотачиваете риск в одном файле. Тот, кто получит закрытый ключ сервиса, сможет подписывать действительные дескрипторы, отвечать на введения и полностью имитировать сервис — и ничто в адресе не покажется подозрительным, потому что атакующий использует подлинный ключ. Контрольная сумма сойдётся, подпись проверится; имитация невидима для всех клиентских проверок, какие предлагает формат."Если ваши ключи утекут, другие люди смогут имитировать ваш onion-сервис — он будет считаться скомпрометированным, бесполезным и опасным для посещения."В отличие от скомпрометированного пароля, здесь нечего менять: адрес нельзя сменить, не отказавшись от него. Руководство по настройке Tor считает файл private_key единственным секретом, который имеет значение, предупреждает операторов о необходимости держать его в тайне и советует сделать безопасную резервную копию, если сервис должен пережить своё оборудование. Для тех, кто наблюдает за onion-сервисами извне, практический урок таков: структурно безупречный адрес доказывает лишь, что строка цела, — он ничего не говорит о том, кто держит ключи сегодня.
Как проверить контрольную сумму вручную
Вся проверка умещается в несколько строк на любом скриптовом языке с поддержкой SHA-3, и шаги прямо следуют из спецификации:- Отбросьте суффикс .onion и убедитесь, что осталось 56 символов base32.
- Декодируйте их в 35 байтов: первые 32 — открытый ключ, следующие два — контрольная сумма, последний — байт версии.
- Подайте на вход SHA3-256 константную строку ".onion checksum", затем 32 байта ключа, затем байт версии.
- Сравните первые два байта дайджеста с байтами контрольной суммы. Совпадение означает, что строка скопирована верно.










