При администрировании и разработке в системе «1С:Предприятие» периодически возникают ситуации, когда необходимо войти в информационную базу под определенным пользователем (например, для расследования ошибки или проверки прав доступа), но его пароль неизвестен. Сбрасывать пароль крайне нежелательно, так как пользователь заметит изменения, а восстановить исходный пароль администратор не сможет. Для упрощения регулярного технического обслуживания нескольких систем удобно использовать программу для пакетного архивирования и обновления баз 1С.
В этой статье мы подробно разберем, как именно устроено хэширование паролей в платформе «1С:Предприятие», почему невозможно напрямую восстановить исходный текстовый пароль из хэша SHA-1, и рассмотрим легальный и безопасный программный способ временной авторизации под любым пользователем без безвозвратного удаления его пароля.
Рассмотрим строку кода, которая часто вызывает вопросы у начинающих разработчиков:
Хэш = СтрЗаменить(Base64Значение(Лев(СохраняемоеЗначение, Найти(СохраняемоеЗначение, ",") - 1)), " ", "");
Давайте разберем по шагам, что здесь происходит и откуда берется запятая:
СохраняемоеЗначениеПароля: У объекта платформы ПользовательИнформационнойБазы есть свойство СохраняемоеЗначениеПароля. Исторически оно представляет собой текстовую строку, состоящую из двух закодированных в Base64 частей, разделенных запятой (например, "W6ph5Mm5Pz8...,ESu3kTBHkd3...").Лев() и поиска запятой Найти() вырезает именно эту левую часть.ВРег()). Это было сделано для возможности регистронезависимого поиска, однако существенно снижало общую безопасность системы, облегчая злоумышленникам перебор паролей.Base64Значение() декодирует левую текстовую часть обратно в двоичные данные (массив байтов хэша SHA-1).СтрЗаменить() удаляет пробелы, которые могут автоматически добавляться при текстовом представлении двоичных данных в некоторых версиях платформы.Таким образом, результатом выполнения данной операции является чистый хэш SHA-1 (массив байтов или его шестнадцатеричное представление), который используется для идентификации пользователя.
Часто разработчики путают обратимое кодирование информации и необратимое хэширование. Разберем принципиальную разницу между ними:
Base64Значение() и Base64Строка().Сайты, предлагающие услуги по «расшифровке хэшей SHA-1», на самом деле не занимаются обратным математическим преобразованием. Они работают по принципу радужных таблиц (Rainbow Tables) или гигантских баз данных. В этих базах хранятся заранее вычисленные пары: «исходная строка — ее хэш-значение». Сайт просто выполняет поиск присланного вами хэша в своей базе. Если хэш совпадает, система выдает сохраненный пароль. Если пароль был сложным или уникальным, база данных выдаст ошибку поиска.
Если перед вами стоит задача войти в информационную базу под учетной записью конкретного сотрудника без изменения его пароля в его понимании, вам не нужно пытаться расшифровать хэш SHA-1. Достаточно обладать административными правами в базе данных и использовать механизм временной подмены хэша. Для контроля за качеством данных и быстрого поиска расхождений в учете можно применить программу для автоматической сверки бухгалтерских и налоговых проводок.
Проанализируем алгоритм этого процесса, который при необходимости регулярного повторения можно поручить программному роботу на базе платформы для создания программных роботов One RPA:
СохраняемоеЗначениеПароля целевого пользователя и сохраняем его в текстовый файл, константу или внешнюю переменную.СохраняемоеЗначениеПароля.Рассмотрим подробный программный пример реализации данного метода. Создадим процедуру, которая временно подменяет пароль и возвращает его на место:
// Процедура для демонстрации механизма подмены хэша пароля
Процедура ВременноПодменитьПарольПользователя(ИмяПользователя, НовыйВременныйПароль) Экспорт
// 1. Находим пользователя в информационной базе по имени
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если ПользовательИБ = Неопределено Тогда
ВызватьИсключение "Пользователь с именем " + ИмяПользователя + " не найден в системе!";
КонецЕсли;
// 2. Сохраняем оригинальный хэш пароля во внешнее хранилище
// В реальной практике этот хэш можно записать во временный файл или константу
ОригинальныйХэшПароля = ПользовательИБ.СохраняемоеЗначениеПароля;
ЗаписьТекста = Новый ЗаписьТекста("C:\Temp\original_hash_" + ИмяПользователя + ".txt");
ЗаписьТекста.ЗаписатьСтроку(ОригинальныйХэшПароля);
ЗаписьТекста.Закрыть();
// 3. Устанавливаем новый временный пароль
ПользовательИБ.Пароль = НовыйВременныйПароль;
ПользовательИБ.Записать();
Сообщить("Пароль пользователя " + ИмяПользователя + " временно изменен. Оригинальный хэш сохранен.");
КонецПроцедуры
// Процедура восстановления оригинального пароля пользователя
Процедура ВосстановитьОригинальныйПарольПользователя(ИмяПользователя) Экспорт
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если ПользовательИБ = Неопределено Тогда
ВызватьИсключение "Пользователь с именем " + ИмяПользователя + " не найден в системе!";
КонецЕсли;
// Читаем ранее сохраненный оригинальный хэш из файла
ФайлХэша = Новый Файл("C:\Temp\original_hash_" + ИмяПользователя + ".txt");
Если Не ФайлХэша.Существует() Тогда
ВызватьИсключение "Файл с сохраненным хэшем пароля не обнаружен!";
КонецЕсли;
ЧтениеТекста = Новый ЧтениеТекста(ФайлХэша.ПолноеИмя);
ОригинальныйХэшПароля = ЧтениеТекста.ПрочитатьСтроку();
ЧтениеТекста.Закрыть();
// 4. Записываем оригинальный хэш напрямую в свойство платформы
ПользовательИБ.СохраняемоеЗначениеПароля = ОригинальныйХэшПароля;
ПользовательИБ.Записать();
// Удаляем временный файл для безопасности
УдалитьФайлы(ФайлХэша.ПолноеИмя);
Сообщить("Оригинальный пароль пользователя " + ИмяПользователя + " успешно восстановлен.");
КонецПроцедуры
Важное предупреждение: Данный метод работает исключительно под учетной записью с административными правами доступа к объектам метаданных и списку пользователей информационной базы. Обычный пользователь не имеет прав на чтение и запись свойств других учетных записей.
Описанная выше схема с использованием хэша SHA-1 без соли считалась небезопасной и устаревшей. Начиная с версии платформы 1С:Предприятие 8.3.26, фирма «1С» кардинально изменила политику безопасности и обновила криптографические механизмы:
SHA-256, SHA-512, а также наиболее устойчивый к аппаратному брутфорсу (перебору на видеокартах) алгоритм PBKDF2-HMAC-SHA256."12345", их хэши в базе данных будут абсолютно разными.СохраняемоеЗначениеПароля и использование устаревших функций БСП, таких как Пользователи.СохраняемоеЗначениеСтрокиПароля(), теперь не рекомендуется. Платформа предоставляет новые глобальные контекстные функции:
ВычислитьСохраняемоеЗначениеПароляПользователя() — для генерации безопасного хэша по актуальным правилам безопасности.ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению() — для безопасного сопоставления введенного текста пароля с хэшем без раскрытия самого алгоритма шифрования.Подводя итог, отметим: пытаться расшифровать хэши SHA-1 в современных реалиях бессмысленно и неэффективно. Программная подмена хэша СохраняемоеЗначениеПароля по-прежнему остается единственным рабочим способом временного перехвата сессии пользователя для проведения отладки администратором системы. Для автоматизации этого процесса можно использовать обработку для временной подмены и восстановления пароля пользователя.