При разработке интеграций или систем защиты часто возникает необходимость вычислить хеш-сумму данных с помощью алгоритма SHA-256. Нередко разработчики сталкиваются с тем, что результат, полученный внутри 1С, кардинально отличается от результата, который выдают популярные онлайн-сервисы. Давайте разберемся, почему это происходит и как правильно подготовить данные для хеширования.
Основная причина расхождения заключается в том, как платформа 1С воспринимает входные данные. Если мы передаем обычную строку в метод Добавить(), платформа неявно преобразует эту строку в последовательность байтов, чаще всего используя кодировку UTF-8. Онлайн-сервисы же могут работать в разных режимах:
В 1С объект ХешированиеДанных работает строго с типом ДвоичныеДанные или строковыми представлениями, которые автоматически кодируются. Если вы хотите получить идентичный результат, вы должны передать в функцию Добавить() именно ту последовательность байтов, которую ожидает алгоритм.
Для того чтобы хеширование происходило предсказуемо, нам необходимо преобразовать исходные данные в объект ДвоичныеДанные. Рассмотрим несколько сценариев.
Если вам нужно захэшировать строку в определенной кодировке, воспользуйтесь методом ПолучитьДвоичныеДанныеИзСтроки(). Это самый простой и надежный способ избежать проблем с неявными преобразованиями.
Рассмотрим пример кода:
// Исходная строка
ИсходнаяСтрока = "0101";
// Преобразуем строку в двоичные данные с явным указанием кодировки
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ИсходнаяСтрока, КодировкаТекста.UTF8);
// Создаем объект для хеширования
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(ДвоичныеДанные);
// Получаем результат
РезультатХеша = Хеширование.ХешСумма;
Если данные у вас динамические или их объем велик, удобнее использовать поток в памяти. Этот подход позволяет аккуратно сформировать последовательность байтов перед подачей в объект ХешированиеДанных.
Рассмотрим реализацию через ПотокВПамяти:
// Создаем поток в памяти
Поток = Новый ПотокВПамяти();
// Записываем данные через запись текста
ЗаписьТекста = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8);
ЗаписьТекста.Записать("0101");
ЗаписьТекста.Закрыть();
// Получаем двоичные данные из потока
ДанныеДляХеша = Поток.ЗакрытьИПолучитьДвоичныеДанные();
// Хешируем
Хешер = Новый ХешированиеДанных(ХешФункция.SHA256);
Хешер.Добавить(ДанныеДляХеша);
ХешСумма = Хешер.ХешСумма;
Чтобы избежать ошибок при сравнении хешей, проанализируем следующие моменты:
КодировкаТекста.UTF8 или КодировкаТекста.ANSI. Если онлайн-сервис использует другую кодировку, хеш не совпадет.LF или CRLF) в конце введенного текста. Проверьте настройки вашего сервиса — если он «съедает» лишние пробелы или добавляет переносы, результат будет другим.Добавить(), если вы хотите точного совпадения с байтовым хешем. Работайте исключительно через преобразование в ДвоичныеДанные.Теперь, когда мы выяснили причину расхождений и разобрали методы правильной подготовки данных, вы можете уверенно реализовывать любые механизмы подписи или проверки целостности данных в 1С. Всегда контролируйте, в каком виде данные попадают в объект ХешированиеДанных, и вы добьетесь идеального совпадения результатов.