При разработке прикладных решений часто возникает необходимость подписи документа или подтверждения операции пользователем прямо внутри текущего сеанса. Например, когда несколько сотрудников работают за одним компьютером и требуется подтвердить личность менеджера перед записью важного документа. В связи с этим возникает вопрос: как программно получить и проверить пароль пользователя информационной базы (ИБ)?
Рассмотрим детально, как устроена система защиты паролей в платформе 1С:Предприятие, почему исходный пароль прочитать невозможно и какими способами можно реализовать проверку введенной строки.
В целях безопасности реквизит Пароль объекта ПользовательИнформационнойБазы доступен только для записи. Платформа 1С в принципе не хранит пароли пользователей в открытом виде. Вместо этого в базе данных (а именно в свойстве СохраняемоеЗначениеПароля) хранится специальный криптографический отпечаток — хэш пароля.
Таким образом, попытаться прочитать открытый текстовый пароль через код не получится. Единственное решение — вычислить хэш-сумму введенной пользователем строки и сравнить ее со значением СохраняемоеЗначениеПароля, либо воспользоваться готовыми библиотечными функциями.
Если ваша конфигурация разработана на основе Библиотеки Стандартных Подсистем (БСП), вам не требуется вручную писать алгоритмы расчета хэша. В БСП уже присутствует готовая экспортная функция, позволяющая проверить соответствие введенного текста паролю пользователя ИБ.
Разберем пример вызова функции СохраняемоеЗначениеСтрокиПароля из общего модуля БСП:
// Переменные для проверки
ВведенныйПароль = "MySecretPass123";
ИдентификаторПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
ПарольСовпадает = Ложь;
// Вызов типовой функции
СохраняемоеЗначение = ПользователиСлужебный.СохраняемоеЗначениеСтрокиПароля(
ВведенныйПароль,
ИдентификаторПользователя,
ПарольСовпадает
);
Если ПарольСовпадает Тогда
Сообщить("Пароль введен верно! Продолжаем выполнение операции.");
Иначе
ВызватьИсключение "Введен неверный пароль!";
КонецЕсли;
Функция самостоятельно вычисляет сопоставимое значение для переданной строки и сравнивает его с реальным хэшем пользователя ИБ, возвращая результат в булевый параметр Совпадает.
Если необходимо реализовать проверку вручную или проанализировать механизм хэширования данных, рассмотрим доступные средства платформы. Для получения хэш-суммы произвольной строки в 1С применяется объект ХешированиеДанных.
Посмотрим на пример получения хэша строки с использованием алгоритма SHA256:
// Вычисление хэша произвольной строки
Хешер = Новый ХешированиеДанных(ХэшФункция.SHA256);
Хешер.Добавить("ВведеннаяСтрокаПароля");
СтрокаХэша = XMLСтрока(Хешер.ХэшСумма);
Сообщить("Сгенерированный хэш: " + СтрокаХэша);
Важно учесть, что платформа 1С для свойства СохраняемоеЗначениеПароля исторически использует комбинацию хэшей алгоритма SHA-1 (включая вариант строки в верхнем регистре). Поэтому прямое сравнение результата SHA256 с системным свойством не даст совпадения. Если требуется точное совпадение с системным хэшем платформы, рекомендуется использовать вышеописанную функцию БСП или встроенные методы платформы современных версий.
Разберем ситуации, когда проверка пароля ИБ оказывается не самым удобным решением для бизнес-процесса:
ТекущийПользователь.