Как вычислить хеш HMAC-SHA1 с секретным ключом в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции 1С:Предприятия 7.7 с внешними сервисами, платежными шлюзами и веб-API часто требуется подписывать запросы с использованием алгоритма HMAC-SHA1 (или HMAC-MD5) на основе секретного ключа (аналог функции hash_hmac в PHP). В самой платформе 1С 7.7 отсутствуют встроенные средства криптографии, а стандартная библиотека CAPICOM.HashedData позволяет вычислять только простые хеши без использования секретного ключа. Рассмотрим подробнее, как решить эту задачу различными способами.

Выясним причину сложности: алгоритм HMAC (Keyed-Hash Message Authentication Code) требует выполнения двух проходов хеширования со специальной обработкой ключа. Для реализации такого расчета в 1С 7.7 необходимо использовать внешние COM-объекты или системные библиотеки.

Способ 1. Использование классов .NET Framework через COM-обертку

Разберем самый производительный и гибкий вариант — обращение к стандартным классам пространства имен System.Security.Cryptography платформы .NET с помощью универсального COM-коннектора (например, NetObjectToIDispatch45).

Посмотрим на пример функции, выполняющей расчет хеша HMAC с использованием кодировки UTF-8:


Функция ВычислитьHMAC(Ключ, ИсходнаяСтрока)
    Перем Врап, Кодировка, КлючБайты, СтрокаБайты;
    Перем hmacmd5, hmacsha1, ХешСообщенияMD5, ХешСообщенияSHA1;
    Перем BitConverter, РезультатMD5, РезультатSHA1;
    
    Врап = СоздатьОбъект("NetObjectToIDispatch45");
    Врап.УстЭтоСемерка();
    
    // Получаем класс кодировки UTF-8 (для латиницы можно использовать ASCII)
    Кодировка = Врап.ПолучитьТип("System.Text.Encoding").UTF8;
    
    // Преобразуем ключ и сообщение в массивы байтов
    КлючБайты = Кодировка.GetBytes(Ключ);
    СтрокаБайты = Кодировка.GetBytes(ИсходнаяСтрока);
    
    // Создаем криптографические объекты с переданным ключом
    hmacmd5 = Врап.СоздатьОбъект("System.Security.Cryptography.HMACMD5", КлючБайты);
    hmacsha1 = Врап.СоздатьОбъект("System.Security.Cryptography.HMACSHA1", КлючБайты);
    
    // Вычисляем хеши
    ХешСообщенияMD5 = hmacmd5.ComputeHash(СтрокаБайты);
    ХешСообщенияSHA1 = hmacsha1.ComputeHash(СтрокаБайты);
    
    // Преобразуем байты в шестнадцатеричную строку (HEX)
    BitConverter = Врап.ПолучитьТип("System.BitConverter");
    РезультатMD5 = СтрЗаменить(BitConverter.ToString(ХешСообщенияMD5), "-", "");
    РезультатSHA1 = СтрЗаменить(BitConverter.ToString(ХешСообщенияSHA1), "-", "");
    
    Сообщить("HMAC-MD5: " + РезультатMD5);
    Сообщить("HMAC-SHA1: " + РезультатSHA1);
    
    Возврат РезультатSHA1;
КонецФункции

Разберем по шагам логику работы этого метода:

  1. Инициализируется .NET-коннектор и задается режим совместимости с 1С 7.7.
  2. Получается ссылка на класс System.Text.Encoding, с помощью которого строки перекодируются в байтовые массивы.
  3. Инициализируются криптографические провайдеры System.Security.Cryptography.HMACSHA1 и System.Security.Cryptography.HMACMD5, принимающие в конструктор массив байт секретного ключа.
  4. Метод ComputeHash() выполняет вычисление хеша от байтов исходной строки.
  5. Класс System.BitConverter форматирует полученный байтовый массив в HEX-строку без дефисов.

Способ 2. Использование MSScriptControl и JavaScript

Если на сервере или рабочей станции нет возможности зарегистрировать специализированную внешнюю компоненту, рассмотрим альтернативный вариант — вычисление через стандартный объект MSScriptControl.ScriptControl.

Проанализируем этот подход:

  1. Создается объект СоздатьОбъект("MSScriptControl.ScriptControl").
  2. В свойство Language устанавливается значение "JScript".
  3. В скриптовый движок с помощью метода AddCode() загружается реализация алгоритма HMAC-SHA1 на JavaScript (например, компактная библиотека CryptoJS или исходный код реализации RFC 2104).
  4. Вызов функции расчета производится с помощью метода Run("ИмяФункции", Ключ, ИсходнаяСтрока).

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

Способ 3. Вызов PowerShell через WScript.Shell

В современных операционных системах Windows всегда доступен PowerShell, который имеет прямой доступ ко всей библиотеке классов .NET Framework. Разберем реализацию через вызов командной строки:

  1. Формируется PowerShell-команда, которая создает объект System.Security.Cryptography.HMACSHA1, вычисляет хеш и конвертирует его в Base64 или HEX.
  2. Вызов выполняется через объект WScript.Shell с помощью метода Exec().
  3. Результат считывается напрямую из потока StdOut.

Важные технические нюансы при расчете HMAC

При работе с криптографическими алгоритмами в среде 1С 7.7 необходимо учитывать следующие ключевые особенности:

  1. Кодировка исходных строк: Платформа 1С 7.7 хранит строковые данные в кодировке Windows-1251 (ANSI). Внешние веб-сервисы практически всегда ожидают вычисление HMAC по байтам в кодировке UTF-8. Обязательно проверяйте правильность перекодирования ключа и тела сообщения перед расчетом.
  2. Формат вывода: Разные сервисы требуют разное представление результата. Чаще всего требуется шестнадцатеричная строка (HEX) в нижнем или верхнем регистре, либо строка в формате Base64 (например, метод System.Convert.ToBase64String()).
← На главную