При интеграции 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-объекты или системные библиотеки.
Разберем самый производительный и гибкий вариант — обращение к стандартным классам пространства имен 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;
КонецФункции
Разберем по шагам логику работы этого метода:
System.Text.Encoding, с помощью которого строки перекодируются в байтовые массивы.System.Security.Cryptography.HMACSHA1 и System.Security.Cryptography.HMACMD5, принимающие в конструктор массив байт секретного ключа.ComputeHash() выполняет вычисление хеша от байтов исходной строки.System.BitConverter форматирует полученный байтовый массив в HEX-строку без дефисов.Если на сервере или рабочей станции нет возможности зарегистрировать специализированную внешнюю компоненту, рассмотрим альтернативный вариант — вычисление через стандартный объект MSScriptControl.ScriptControl.
Проанализируем этот подход:
СоздатьОбъект("MSScriptControl.ScriptControl").Language устанавливается значение "JScript".AddCode() загружается реализация алгоритма HMAC-SHA1 на JavaScript (например, компактная библиотека CryptoJS или исходный код реализации RFC 2104).Run("ИмяФункции", Ключ, ИсходнаяСтрока).Преимущество данного способа заключается в том, что расчет происходит непосредственно в адресном пространстве процесса без создания временных файлов и без установки дополнительных внешних DLL.
В современных операционных системах Windows всегда доступен PowerShell, который имеет прямой доступ ко всей библиотеке классов .NET Framework. Разберем реализацию через вызов командной строки:
System.Security.Cryptography.HMACSHA1, вычисляет хеш и конвертирует его в Base64 или HEX.WScript.Shell с помощью метода Exec().StdOut.При работе с криптографическими алгоритмами в среде 1С 7.7 необходимо учитывать следующие ключевые особенности:
System.Convert.ToBase64String()).