Ручной расчет тела DKIM не совпадает с тем, что проверяет Gmail.

Вопрос или проблема

Я отправил электронное письмо в режиме простого текста в Gmail со следующим содержанием:

Mail

empty

эквивалентное байтовое представление будет:
Mail\r\n\r\nempty

Gmail

Но когда я вычисляю закодированный в base64 sha256, он не такой же.

> echo -e "Mail\r\n\r\nempty\r\n" | sha256sum | awk '{print $1}' | base64

NDlmNjdmYWJjYmE4N2Y5MmZjMjExNTQ3NDA5MjI1ZTQzNzg4MDZmY2UwMzliM2U3NTFiYzkxYWJlMWJjOTIwNAo=

В вашей команде вы кодируете в base64 строковую форму SHA-256 хэша, напечатанную sha256sum, в виде шестнадцатеричной кодировки, а не необработанного значения SHA-256. Это несоответствие также объясняет, почему длина полученного значения в base64 была совершенно неправильной.
Кроме того, вызов echo добавлял дополнительный LF в свой вывод (без -n, указанного).

Например, что-то подобное должно быть лучше:

echo -en "Mail\r\n\r\nempty\r\n" | sha256sum | awk '{print $1}' | xxd -r -p  | base64

(Это предполагает, что строка, выводимая через echo, была канонизирована в соответствии с заданным параметром c)

Ответ или решение

Для решения проблемы, связанной с расхождением результатов ручного вычисления DKIM и проверки Gmail, важно понять несколько ключевых аспектов работы DKIM и преобразования данных. DKIM (DomainKeys Identified Mail) – это механизм аутентификации электронной почты, который позволяет получателям удостоверяться в том, что сообщение было отправлено с разрешенного источника. Суть DKIM заключается в том, что почтовые сервера отправителя создают цифровую подпись, привязанную к заголовкам и телу сообщения, а серверы-получатели могут использовать эту подпись для проверки подлинности и целостности письма.

Теория

Основная задача при hash и подписи DKIM заключается в применении хеш-функции (в данном случае SHA-256) к телу сообщения, затем в выборке байтов хеша для получения его сырой формы и, наконец, в конвертации этой формы в base64-строку, которая и передается в DKIM-подписи. Ошибки могут возникать на каждом шагу этого процесса, особенно если неправильно подготовлены данные, или применяются неверные команды преобразования.

Пример

На конкретном примере, рассмотрим следующие этапы:

  1. Подготовка тела сообщения:
    В Gmail сообщение в плейн-тексте вида "Mail\n\nempty" фактически преобразуется в байтовую последовательность, соответствующую строке "Mail\r\n\r\nempty\r\n". Вы должны учесть это при создании хеша.

  2. Хеширование:
    После подготовки строки необходимо правильно ее хешировать. Команда sha256sum выводит хеш в виде шестнадцатеричной строки, но для дальнейших шагов вам нужен хеш в сыром виде.

  3. Восстановление сырого хеша:
    Использование команды xxd -r -p позволяет преобразовать шестнадцатеричное представление обратно в сырую форму байтов хеша.

  4. Base64 кодирование:
    Заключительный этап – это кодирование сырой формы хеша в base64 строку, использующуюся в DKIM.

Применение

Эти этапы можно использовать для исправления ситуации. Пример исправленной команды для корректного формирования hash и DKIM может выглядеть следующим образом:

echo -en "Mail\r\n\r\nempty\r\n" | sha256sum | awk '{print $1}' | xxd -r -p | base64

В этой команде критически важно наличие флага -en у команды echo, чтобы передавать точное число новых строк и символов в строку, которая используется для вычисления хеша.

Во взаимодействии с DKIM важно также учитывать, что алгоритм хеша часто конфигурируется с параллельными параметрами, как c=relaxed/simple или c=relaxed/relaxed, которые применяются к процессу каноникализации; это может включать удаление лишних пробелов или преобразование всех заголовков в единую производную форму. Поэтому, даже если вы правильно сформируете тело запроса, конфигурации разного рода канонических преобразований в зависимости от настроек сервера могут также влиять на окончательное хеширование.

Заключая, следует отметить: если вы столкнулись с ошибками при работе с DKIM вручную, важно шаг за шагом пересмотреть весь процесс подготовки данных, среди которых канонизация, хеширование и трансформации сырого хеша. Только полное понимание и следование всем необходимым этапам и формализациям обеспечит достижение успешной и точной проверки аналогичной той, что применяется на серверах, таких как Gmail.

Оцените материал
Добавить комментарий

Капча загружается...