Вопрос или проблема
Я отправил электронное письмо в режиме простого текста в Gmail со следующим содержанием:
Mail
empty
эквивалентное байтовое представление будет:
Mail\r\n\r\nempty
Но когда я вычисляю закодированный в 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-подписи. Ошибки могут возникать на каждом шагу этого процесса, особенно если неправильно подготовлены данные, или применяются неверные команды преобразования.
Пример
На конкретном примере, рассмотрим следующие этапы:
-
Подготовка тела сообщения:
В Gmail сообщение в плейн-тексте вида "Mail\n\nempty" фактически преобразуется в байтовую последовательность, соответствующую строке "Mail\r\n\r\nempty\r\n". Вы должны учесть это при создании хеша. -
Хеширование:
После подготовки строки необходимо правильно ее хешировать. Командаsha256sum
выводит хеш в виде шестнадцатеричной строки, но для дальнейших шагов вам нужен хеш в сыром виде. -
Восстановление сырого хеша:
Использование командыxxd -r -p
позволяет преобразовать шестнадцатеричное представление обратно в сырую форму байтов хеша. -
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.