Рассмотрим подробнее довольно частую ситуацию: при настройке обмена данными между 1С:Предприятие и сторонним веб-сайтом (или внешним REST API) в документации требуется подписывать запросы с помощью алгоритма SHA256 или HMAC-SHA256. Разберем по шагам, есть ли между ними разница, как реализовать вычисление подписи в различных версиях платформы 1С и почему результаты, вычисленные в 1С и на стороне PHP-сервера, могут не совпадать.
Проанализируем ситуацию с теоретической точки зрения. Многие разработчики путают эти два понятия, однако между ними есть существенная архитектурная разница:
Выясним причину, по которой HMAC считается более надежным для API-интеграций. Под капотом алгоритм HMAC модифицирует секретный ключ с помощью логической операции XOR (побитовое исключающее ИЛИ) и специальных констант — внутреннего и внешнего дополнений (Inner PAD и Outer PAD). Хеширование при этом применяется дважды: сначала хешируются данные вместе с внутренним ключом, а затем результат этого хеширования объединяется с внешним ключом и хешируется повторно. Это гарантирует, что перехвативший пакет злоумышленник не сможет просто изменить данные запроса и пересчитать хеш, так как он не знает секретного ключа.
Посмотрим на пример реализации этой задачи в 1С. В более старых версиях платформы (например, 8.3.15) встроенного платформенного объекта для моментального расчета HMAC не существовало — разработчикам был доступен только классический объект ХешированиеДанных.
Если вы работаете на одной из таких версий, не обязательно искать внешние компоненты (DLL). Математический алгоритм HMAC-SHA256 можно полностью реализовать средствами встроенного языка 1С, используя многократное хеширование через ХешированиеДанных. Часто подобный функционал уже содержится в Библиотеке стандартных подсистем (БСП) или открытых библиотеках для HTTP-интеграций (например, в модулях Коннектора HTTP). Там обычно используется готовая функция:
// Пример сигнатуры экспортной функции из открытых библиотек
Функция HMAC(Ключ, Данные, Алгоритм) Экспорт
// Внутренняя реализация двойного хеширования с XOR и PAD-константами
// ...
КонецФункции
В современных решениях и смежных технологиях 1С поддержка HMAC внедряется на базовом уровне. Проанализируем эти нововведения:
ВычислительHmac, который берет на себя всю работу с криптопровайдером.ХешированиеДанных добавлена поддержка производного алгоритма PBKDF2-HMAC-SHA256.Разберем одну из самых распространенных ошибок при интеграции. Допустим, вы успешно вычислили HMAC-SHA256 в 1С, но сервер (написанный, например, на PHP) отклоняет ваш запрос, ссылаясь на неверную подпись. Причина чаще всего кроется не в самом алгоритме, а в формате представления данных. Для интерактивной проверки и отладки таких запросов к серверу подойдёт инструмент для тестирования REST API на платформе 1С.
В 1С результатом работы алгоритма хеширования всегда является объект ДвоичныеДанные. Чтобы передать его в HTTP-запросе (в заголовках или теле), двоичные данные нужно преобразовать в текст. Сторона, принимающая запрос (сайт), обычно ожидает строку либо в формате Base64, либо в формате Hex-строки (шестнадцатеричное представление).
Как отмечают специалисты по веб-разработке, стандартный вызов функции hash_hmac в PHP возвращает шестнадцатеричную строку (в нижнем регистре), тогда как другие методы могут возвращать сырой бинарный файл. Если в 1С вы преобразуете полученные ДвоичныеДанные в Base64, а сервер ожидает Hex (или наоборот) — строки подписей будут абсолютно разными, хотя исходные байты идентичны.
Посмотрим на пример правильного преобразования результата HMAC в шестнадцатеричную строку (Hex) в нижнем регистре, как того требуют большинство API:
// Допустим, функция ПодписатьСообщениеHMAC возвращает ДвоичныеДанные
ДвоичныеДанныеПодписи = ПодписатьСообщениеHMAC(Ключ, СтрокаДляПодписи);
// Преобразуем двоичные данные в Hex-строку и переводим в нижний регистр
СтрокаПодписиHex = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(ДвоичныеДанныеПодписи));
Если же документация к API требует именно Base64, используйте метод Base64Строка(), но помните, что он может добавлять символы переноса строк. Лучше использовать объект КодировкаТекста или функцию платформы, явно запрещающую переносы, если это критично для формирования заголовков HTTP-запроса. Для выполнения и проверки подобных преобразований подойдёт обработка для кодирования и декодирования Base64 через потоки.
Таким образом, мы выяснили, что SHA256 и SHA256 HMAC — это принципиально разные по уровню защиты инструменты. При их использовании в 1С всегда обращайте внимание на версию платформы (чтобы выбрать оптимальный способ расчета) и строго следуйте документации API в вопросах финального кодирования результата (Hex или Base64).