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