Почему хеш-сумма SHA-256 в 1С отличается от данных онлайн-калькуляторов?

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

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

Разберем причины возникновения ошибки

Основная причина расхождения заключается в том, как платформа 1С воспринимает входные данные. Если мы передаем обычную строку в метод Добавить(), платформа неявно преобразует эту строку в последовательность байтов, чаще всего используя кодировку UTF-8. Онлайн-сервисы же могут работать в разных режимах:

  1. Режим «Текст» (Text): Калькулятор берет каждый символ строки и переводит его в байты в соответствии с кодировкой (UTF-8, ASCII и т.д.).
  2. Режим «Бинарный/Hex» (Binary/Hex): Калькулятор ожидает чистые байты. Если вы вводите «0101», он может трактовать это как строку из четырех символов или как последовательность битов, что приводит к разным результатам.

В 1С объект ХешированиеДанных работает строго с типом ДвоичныеДанные или строковыми представлениями, которые автоматически кодируются. Если вы хотите получить идентичный результат, вы должны передать в функцию Добавить() именно ту последовательность байтов, которую ожидает алгоритм.

Разберем по шагам правильную подготовку данных

Для того чтобы хеширование происходило предсказуемо, нам необходимо преобразовать исходные данные в объект ДвоичныеДанные. Рассмотрим несколько сценариев.

Сценарий 1: Хеширование строки как последовательности байтов

Если вам нужно захэшировать строку в определенной кодировке, воспользуйтесь методом ПолучитьДвоичныеДанныеИзСтроки(). Это самый простой и надежный способ избежать проблем с неявными преобразованиями.

Рассмотрим пример кода:


// Исходная строка
ИсходнаяСтрока = "0101";

// Преобразуем строку в двоичные данные с явным указанием кодировки
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ИсходнаяСтрока, КодировкаТекста.UTF8);

// Создаем объект для хеширования
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(ДвоичныеДанные);

// Получаем результат
РезультатХеша = Хеширование.ХешСумма;

Сценарий 2: Работа с потоками данных

Если данные у вас динамические или их объем велик, удобнее использовать поток в памяти. Этот подход позволяет аккуратно сформировать последовательность байтов перед подачей в объект ХешированиеДанных.

Рассмотрим реализацию через ПотокВПамяти:


// Создаем поток в памяти
Поток = Новый ПотокВПамяти();

// Записываем данные через запись текста
ЗаписьТекста = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8);
ЗаписьТекста.Записать("0101");
ЗаписьТекста.Закрыть();

// Получаем двоичные данные из потока
ДанныеДляХеша = Поток.ЗакрытьИПолучитьДвоичныеДанные();

// Хешируем
Хешер = Новый ХешированиеДанных(ХешФункция.SHA256);
Хешер.Добавить(ДанныеДляХеша);
ХешСумма = Хешер.ХешСумма;

Важные рекомендации для разработчика

Чтобы избежать ошибок при сравнении хешей, проанализируем следующие моменты:

Теперь, когда мы выяснили причину расхождений и разобрали методы правильной подготовки данных, вы можете уверенно реализовывать любые механизмы подписи или проверки целостности данных в 1С. Всегда контролируйте, в каком виде данные попадают в объект ХешированиеДанных, и вы добьетесь идеального совпадения результатов.

← На главную