Как в 1С рассчитать составной хэш MD5 по шаблону?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С со сторонними веб-сервисами и REST API часто возникает необходимость передавать подпись или хэш авторизации. В веб-разработке (например, в PHP) распространен шаблон вычисления хэша вида: MD5(login + MD5(password) + SALT). Разберем подробно, как реализовать подобную логику средствами платформы 1С:Предприятие 8.3.

Базовый механизм хеширования в 1С

Для вычисления хэш-сумм в платформе 1С предусмотрен специальный объект ХешированиеДанных. Он поддерживает различные алгоритмы, включая ХешФункция.MD5, ХешФункция.SHA1, ХешФункция.SHA256 и другие.

Рассмотрим стандартный синтаксис работы с объектом ХешированиеДанных:


ОбъектХеширования = Новый ХешированиеДанных(ХешФункция.MD5);
ОбъектХеширования.Добавить("ТекстДляХеширования");
РезультатДвоичныеДанные = ОбъектХеширования.ХешСумма;

Обратим внимание, что свойство ХешСумма возвращает значение типа ДвоичныеДанные, а не готовую текстовую hex-строку. Для большинства веб-сервисов этот результат необходимо переводить в шестнадцатеричное представление.

Пошаговая реализация составного хэша

Проанализируем структуру требуемого алгоритма MD5(login + MD5(password) + SALT). Расчет выполняется в два этапа:

  1. Вычисляется MD5-хэш от пароля пользователя и переводится в шестнадцатеричную строку.
  2. Склеиваются логин, полученный хэш пароля и соль, после чего от итоговой строки берется повторный MD5-хэш.

Рассмотрим готовый пример функции на языке 1С, реализующий данную логику:


&НаСервере
Функция РассчитатьХэшАвторизации(Логин, Пароль, Соль) Экспорт
    
    // Шаг 1. Получаем хэш пароля
    ХешПароляОбъект = Новый ХешированиеДанных(ХешФункция.MD5);
    ХешПароляОбъект.Добавить(Пароль);
    
    // Преобразуем двоичные данные в шестнадцатеричную строку в нижнем регистре
    СтрокаХешПароля = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешПароляОбъект.ХешСумма));
    
    // Шаг 2. Формируем составную строку: Логин + MD5(Пароль) + Соль
    ИтоговаяСтрока = Логин + СтрокаХешПароля + Соль;
    
    // Шаг 3. Вычисляем итоговый хэш
    ИтоговыйХешОбъект = Новый ХешированиеДанных(ХешФункция.MD5);
    ИтоговыйХешОбъект.Добавить(ИтоговаяСтрока);
    
    ИтоговыйХеш = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(ИтоговыйХешОбъект.ХешСумма));
    
    Возврат ИтоговыйХеш;
    
КонецФункции

Важные тонкости и возможные ошибки

Выясним, с какими подводными камнями можно столкнуться при реализации этого алгоритма в реальных проектах:

  1. Регистр шестнадцатеричной строки: В большинстве веб-сервисов (включая функции PHP) MD5 возвращается в нижнем регистре (символы a-f). В 1С метод ПолучитьHexСтрокуИзДвоичныхДанных() формирует символы в верхнем регистре (A-F). Поэтому обязательно применяем функцию НРег().
  2. Работа с кодировкой UTF-8: Если логин, пароль или соль содержат нелатинские символы (например, кириллицу), прямое передавание строки в метод Добавить() может дать неверный хэш, так как внутри 1С строки хранятся в кодировке UTF-16. Чтобы гарантировать совпадение с веб-сервером, переводим строку в двоичные данные UTF-8:
    
    ДвоичныеДанныеСтр = ПолучитьДвоичныеДанныеИзСтроки(ИтоговаяСтрока, КодировкаТекста.UTF8);
    ХешОбъект.Добавить(ДвоичныеДанныеСтр);
    
  3. Совместимость со старыми платформами 1С: Функция ПолучитьHexСтрокуИзДвоичныхДанных() доступна начиная с версии платформы 8.3.10. В более старых релизах для получения hex-строки использовали строковое преобразование с удалением пробелов: НРег(СтрЗаменить(Строка(ХешСумма), " ", "")).
  4. Контекст выполнения: Объект ХешированиеДанных доступен только на сервере, в толстом клиенте или внешнем соединении. На тонком клиенте вызывать его напрямую нельзя — расчет необходимо выносить в серверную процедуру или функцию с директивой &НаСервере.
← На главную