Как получить исходное значение строки по ее хешу SHA-1 в 1С?

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

При интеграции с внешними системами или разработке механизмов авторизации разработчики часто сталкиваются с необходимостью проверки или восстановления данных, переданных в виде хеш-суммы. Разберем детально, возможно ли восстановить исходную строку из хеша SHA-1 средствами платформы 1С:Предприятие, с какими ограничениями придется столкнуться и какие альтернативные подходы существуют.

Криптографическая природа SHA-1: хеширование или шифрование?

Выясним фундаментальную причину, по которой прямое декодирование невозможно. SHA-1 (Secure Hash Algorithm 1) — это алгоритм криптографического одностороннего хеширования, а не шифрования. Разница между ними принципиальна:

  1. Шифрование является обратимой операцией. При наличии ключа шифрования исходный текст всегда можно расшифровать обратно.
  2. Хеширование — это математическое преобразование произвольного массива данных в строку фиксированной длины (для SHA-1 это 160 бит, или 40 шестнадцатеричных символов). Это действие необратимо: восстановить исходные байты по полученной контрольной сумме математическим путем невозможно.

В платформе 1С:Предприятие для расчета хеша используется встроенный объект ХешированиеДанных. Посмотрим на типовой пример получения SHA-1 от строки:


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

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

Способ 1. Подбор по словарю или перебором (брутфорс) средствами 1С

Единственный способ узнать, какая строка сформировала конкретный хеш, — вычислить хеши для множества потенциальных строк-кандидатов и сравнить результаты с искомым значением.

Рассмотрим реализацию поиска через таблицу значений или соответствие:

  1. Формируем пространство вариантов: если известна примерная длина и состав символов (например, только 4 строчные русские буквы или только цифры PIN-кода), генерируем эти комбинации.
  2. Для каждой комбинации вычисляем хеш SHA-1.
  3. Сравниваем полученный хеш с эталонным.

Проанализируем ограничения данного метода в 1С:

Встроенный язык 1С является высокоуровневым и интерпретируемым. При длине строки в 4 русских символа в нижнем алфавите количество вариантов составляет около 1,18 млн операций, что 1С обработает за несколько десятков секунд. Однако при увеличении длины строки или расширении алфавита (буквы разного регистра, цифры, спецсимволы) пространство вариантов возрастает до астрономических величин. Выполнять такие вычисления в однопоточном сеансе 1С неэффективно, так как это вызовет зависание сеанса и перегрузку процессора сервера.

Способ 2. Использование внешних утилит и баз данных (Rainbow Tables)

Если восстановить строку критически необходимо, ресурсоемкую задачу перебора следует вынести за пределы платформы 1С:

  1. Радужные таблицы (Rainbow Tables) и Key-Value базы: представляют собой заранее сгенерированные гигантские таблицы соответствий «Строка – Хеш». Поиск в такой базе выполняется практически мгновенно.
  2. Специализированные утилиты восстановления паролей: программы, использующие вычислительные мощности видеокарт (GPU), способны перебирать миллиарды комбинаций SHA-1 в секунду.

Интеграцию с консольными утилитами из 1С можно реализовать через вызов внешней команды:


Команда = "hashcat -m 100 -a 3 " + ИскомыйХеш + " ?d?d?d?d?d?d --outfile=result.txt";
ЗапуститьПриложение(Команда, , Истина);

Способ 3. Запрос к внешним онлайн-базам хешей через HTTP

Если хешированная строка не содержит конфиденциальных персональных данных или коммерческой тайны, можно отправить запрос к открытым базам данных хешей через HTTPСоединение и HTTPЗапрос:


Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 10, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/api/lookup?hash=" + ИскомыйХеш);
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ИсходнаяСтрока = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;

Важные технические факторы при сравнении хешей

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

  1. Кодировка текста: строка, закодированная в UTF-8, Windows-1251 (ANSI) или UTF-16LE, дает совершенно разные значения SHA-1. Убедитесь, что при хешировании используется та же кодировка.
  2. Наличие BOM (Byte Order Mark): невидимые служебные байты в начале строки меняют итоговую хеш-сумму.
  3. Соль (Salt) и HMAC: если система-источник добавляла к строке секретную подмешиваемую строку (соль) перед вычислением хеша, стандартный поиск по словарям не даст результата без знания точного алгоритма объединения и значения соли.

Архитектурные рекомендации

Проанализируем правильные сценарии использования криптографии в 1С:

  1. Для аутентификации (пароли, пин-коды, токены): расшифровывать хеш не требуется. При авторизации пользователя вы просто вычисляете SHA-1 от введенной им строки и сравниваете его с хешем, сохраненным в базе. Совпадение хешей подтверждает правильность ввода.
  2. Для безопасного хранения с возможностью прочтения: если данные обязательно потребуется восстановить в будущем, используйте симметричное или асимметричное шифрование. В платформе 1С для этого предназначен объект МенеджерКриптографии, позволяющий зашифровать строку по ГОСТ или RSA/AES и при необходимости расшифровать ее с помощью сертификата и закрытого ключа.
← На главную