Возвращает используемый алгоритм хеширования паролей пользователей информационной базы.
Синтаксис
ПолучитьТипАлгоритмаХешированияПаролейПользователей()Полное описание, параметры и ограничения
Глобальный контекст.ПолучитьТипАлгоритмаХешированияПаролейПользователей (Global context.GetUserPasswordHashAlgorithmType)
Глобальный контекст (Global context)
ПолучитьТипАлгоритмаХешированияПаролейПользователей (GetUserPasswordHashAlgorithmType)
Доступен, начиная с версии 8.3.26.
Синтаксис:
ПолучитьТипАлгоритмаХешированияПаролейПользователей()
Возвращаемое значение:
Тип: ТипАлгоритмаХешированияПаролейПользователей.
Описание:
Возвращает используемый алгоритм хеширования паролей пользователей информационной базы.
Доступность:
Сервер, толстый клиент, внешнее соединение.
См. также:
ПользовательИнформационнойБазы, свойство ТипАлгоритмаХешированияПароля
Использование в версии:
Доступен, начиная с версии 8.3.26.
Методическая информация
Практические примеры
Один синтетический пароль, два native-значения и четыре настоящих сравнения
Проверить правильный и иной учебный текст против двух действительно вычисленных платформой сохраняемых значений. Понять роль соли и native-сравнения, не читая пользователей и не меняя политику.
Где и как запускать
Только серверный неглобальный непривилегированный общий модуль своей новой файловой базы 8.5.1.1343; толстый управляемый клиент через серверную часть своей формы. Запуск в 1С не проверен.
Подготовка
Задача: увидеть, почему сохраняемое значение пароля нельзя проверять обычным сравнением строк. Один заранее заданный синтетический текст дважды обрабатывается самой платформой. Затем platform-метод проверяет исходный и заведомо другой текст против каждого результата. Сохраняемые строки остаются только на сервере; форма получает четыре результата и прочитанные режимы.
Вручную создайте НОВУЮ собственную пустую файловую базу, а не копию УТ, КА2, УНФ или БП: C:\1c-labs\OwnSyntheticPassword85_6d1f3995-714b-479a-a680-f28490c84aad\IB. Платформа 8.5.1.1343, Windows, толстый управляемый клиент, русский встроенный язык. Зарегистрируйте точную строку File="C:\1c-labs\OwnSyntheticPassword85_6d1f3995-714b-479a-a680-f28490c84aad\IB";. Другой вид строки соединения остановит пример.
В свойствах конфигурации: Имя = УчебноеСравнениеПаролей85; Версия = 6d1f3995-714b-479a-a680-f28490c84aad; ОсновнойРежимЗапуска = УправляемоеПриложение; РежимСовместимости = НеИспользовать. UUID в поле Версия и пути — точные маркеры этого урока, не идентификатор пользователя и не универсальное доказательство владения. Новизну и принадлежность базы обеспечьте вручную.
Не импортируйте бизнес-данные, расширения, обработчики приложения, внешние источники, фоновые и регламентные задания. Создайте только описанные ниже свои модуль, форму, общую команду, учебный раздел и минимальную роль для открытия своей формы/команды. Полный доступ и привилегированный режим для вычислений не требуются; никакое фактическое отказанное право не обходите. Код не обращается к менеджеру пользователей, не создаёт и не читает учётные записи.
Общие → Общие модули → УчебноеСравнениеПаролей85 → Модуль: вставьте основной блок целиком. Сервер = Да; Глобальный, ВызовСервера, КлиентОбычноеПриложение, КлиентУправляемоеПриложение, ВнешнееСоединение и Привилегированный = Нет; ПовторноеИспользованиеВозвращаемыхЗначений = НеИспользовать. Клиент не вызывает этот общий модуль напрямую: его экспортная функция доступна серверной части своей формы.
Общие → Общие формы → ПроверкаСинтетическогоПароля85: управляемая форма. Создайте реквизит Протокол85 — Строка неограниченной длины; добавьте многострочное поле с ПутьКДанным = Протокол85, ТолькоПросмотр = Да. Создайте команду формы ПроверитьПароль85, её Действие = ПроверитьПароль85; добавьте кнопку с этой командой. Вставьте полный нижний блок модуля формы. Никакие ПриОткрытии или ПриСозданииНаСервере не подключаются: проверка запускается только кнопкой.
Общие → Общие команды → ОткрытьПроверкуПароля85: общая команда без типа параметра команды, без режима использования параметра; вставьте полный отдельный нижний модуль команды. Включите её в собственный учебный раздел и разрешите своей учебной роли. Настоящее событие ОбработкаКоманды только открывает форму, а вычисление выполняет отдельная кнопка.
Текст OwnMemory85!6d1f3995 в основном коде — намеренно синтетический учебный литерал, а не чей-либо пароль. Не назначайте его реальной учётной записи, не заменяйте его своим секретом и не добавляйте поле ввода пароля. Этот пример не читает и не записывает реальные пароли.
Код сначала читает фактический режим проверки сложности. Этот узкий урок принимается только при Ложь. Если фактически Истина — подготовка не подходит, выполнение остановится; не отключайте политику в действующей или чужой базе ради примера. Используемый алгоритм также только читается и явно передаётся двум вычислениям. В ходе ручной проверки не меняйте эти режимы и не запускайте параллельное администрирование.
Вручную обновите только свою новую конфигурацию и проверьте компиляцию всех трёх модулей. Запустите толстый управляемый клиент, откройте свою общую команду, нажмите ПроверитьПароль85. Пока этот урок создавался, база и 1С не запускались; компиляция, фактические режимы и native-результаты ещё не проверены.
Процедура ПроверитьСвойСтенд85()
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSyntheticPassword85_6d1f3995-714b-479a-a680-f28490c84aad\IB"";" Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Откройте только собственную новую файловую учебную базу 8.5.1.1343";
КонецЕсли;
Если Метаданные.ОбщиеМодули.Количество() <> 1
Или Метаданные.ОбщиеФормы.Количество() <> 1
Или Метаданные.ОбщиеКоманды.Количество() <> 1 Тогда
ВызватьИсключение "В стенде нужны только один собственный модуль, одна форма и одна общая команда";
КонецЕсли;
Модуль = Метаданные.ОбщиеМодули.Найти("УчебноеСравнениеПаролей85");
Если Модуль = Неопределено
Или Метаданные.ОбщиеФормы.Найти("ПроверкаСинтетическогоПароля85") = Неопределено
Или Метаданные.ОбщиеКоманды.Найти("ОткрытьПроверкуПароля85") = Неопределено Тогда
ВызватьИсключение "Подготовьте собственные объекты, указанные в инструкции";
КонецЕсли;
Если Не Модуль.Сервер Или Модуль.Глобальный Или Модуль.ВызовСервера
Или Модуль.КлиентОбычноеПриложение Или Модуль.КлиентУправляемоеПриложение
Или Модуль.ВнешнееСоединение Или Модуль.Привилегированный
Или Модуль.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Общий модуль должен быть серверным, неглобальным, непривилегированным и без повторного использования результатов";
КонецЕсли;
КонецПроцедуры
Функция ПолучитьОтчетСравнения85() Экспорт
ПроверитьСвойСтенд85();
ПроверкаСложности = ПолучитьПроверкуСложностиПаролейПользователей();
Если ТипЗнч(ПроверкаСложности) <> Тип("Булево") Тогда
ВызватьИсключение "Платформа вернула неожиданный тип режима проверки сложности";
КонецЕсли;
Если ПроверкаСложности Тогда
ВызватьИсключение "Подготовка не завершена: этот ограниченный урок требует фактически выключенной проверки сложности. Код не меняет политику; в рабочей базе ничего не отключайте";
КонецЕсли;
Алгоритм = ПолучитьТипАлгоритмаХешированияПаролейПользователей();
Если ТипЗнч(Алгоритм) <> Тип("ТипАлгоритмаХешированияПаролейПользователей") Тогда
ВызватьИсключение "Платформа вернула неожиданный тип алгоритма";
КонецЕсли;
Если Алгоритм = ТипАлгоритмаХешированияПаролейПользователей.PBKDF2SHA256 Тогда
АлгоритмКод = "PBKDF2SHA256";
ИначеЕсли Алгоритм = ТипАлгоритмаХешированияПаролейПользователей.SHA1 Тогда
АлгоритмКод = "SHA1";
ИначеЕсли Алгоритм = ТипАлгоритмаХешированияПаролейПользователей.SHA256 Тогда
АлгоритмКод = "SHA256";
ИначеЕсли Алгоритм = ТипАлгоритмаХешированияПаролейПользователей.SHA512 Тогда
АлгоритмКод = "SHA512";
Иначе
ВызватьИсключение "Текущий алгоритм отсутствует в проверенном native-контракте 8.5.1.1343";
КонецЕсли;
УчебныйТекст = "OwnMemory85!6d1f3995";
ИнойУчебныйТекст = УчебныйТекст + "!иной";
Попытка
СохраняемоеПервое = ВычислитьСохраняемоеЗначениеПароляПользователя(УчебныйТекст, Алгоритм);
СохраняемоеВторое = ВычислитьСохраняемоеЗначениеПароляПользователя(УчебныйТекст, Алгоритм);
Исключение
ВызватьИсключение "Учебное вычисление не завершено. Сохраняемые значения и native-текст ошибки не передаются в отчёт; автоматического повтора нет";
КонецПопытки;
Если ТипЗнч(СохраняемоеПервое) <> Тип("Строка")
Или ТипЗнч(СохраняемоеВторое) <> Тип("Строка") Тогда
ВызватьИсключение "Платформа должна вернуть две настоящие строки сохраняемого значения";
КонецЕсли;
Если СохраняемоеПервое = "" Или СохраняемоеВторое = "" Тогда
ВызватьИсключение "Не получены два непустых native-значения: учебная проверка не завершена";
КонецЕсли;
Попытка
ПервыйВерный = ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению(УчебныйТекст, СохраняемоеПервое);
ПервыйИной = ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению(ИнойУчебныйТекст, СохраняемоеПервое);
ВторойВерный = ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению(УчебныйТекст, СохраняемоеВторое);
ВторойИной = ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению(ИнойУчебныйТекст, СохраняемоеВторое);
Исключение
ВызватьИсключение "Native-сравнение не завершено. Сохраняемые значения и native-текст ошибки не передаются в отчёт; автоматического повтора нет";
КонецПопытки;
Если ТипЗнч(ПервыйВерный) <> Тип("Булево") Или ТипЗнч(ПервыйИной) <> Тип("Булево")
Или ТипЗнч(ВторойВерный) <> Тип("Булево") Или ТипЗнч(ВторойИной) <> Тип("Булево") Тогда
ВызватьИсключение "Все четыре native-сравнения должны вернуть Булево";
КонецЕсли;
Если Не ПервыйВерный Или ПервыйИной Или Не ВторойВерный Или ВторойИной Тогда
ВызватьИсключение "Контрольный результат не получен: исходный текст должен совпасть с обоими значениями, а иной текст — не совпасть";
КонецЕсли;
СохраняемыеЗначенияРазличаются = СохраняемоеПервое <> СохраняемоеВторое;
Если Алгоритм <> ТипАлгоритмаХешированияПаролейПользователей.SHA1
И Не СохраняемыеЗначенияРазличаются Тогда
ВызватьИсключение "Для текущего алгоритма native-справка обещает разные сохраняемые значения. Не заменяйте native-вычисление ручной строкой";
КонецЕсли;
ПовторнаяПроверкаСложности = ПолучитьПроверкуСложностиПаролейПользователей();
ПовторныйАлгоритм = ПолучитьТипАлгоритмаХешированияПаролейПользователей();
Если ТипЗнч(ПовторнаяПроверкаСложности) <> Тип("Булево")
Или ТипЗнч(ПовторныйАлгоритм) <> Тип("ТипАлгоритмаХешированияПаролейПользователей") Тогда
ВызватьИсключение "Не удалось повторно подтвердить типы прочитанных режимов";
КонецЕсли;
Если ПовторнаяПроверкаСложности Или ПовторныйАлгоритм <> Алгоритм Тогда
ВызватьИсключение "Режимы стенда изменились: результат не принимается. Код не восстанавливает настройки и не повторяет операцию";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура(
"Алгоритм,ПроверкаСложности,ПервыйВерный,ПервыйИной,ВторойВерный,ВторойИной,СохраняемыеЗначенияРазличаются",
АлгоритмКод, ПроверкаСложности, ПервыйВерный, ПервыйИной, ВторойВерный, ВторойИной, СохраняемыеЗначенияРазличаются);
КонецФункцииПолный модуль своей формы: кнопка, серверный маршрут и скалярный протокол
Общие → Общие формы → ПроверкаСинтетическогоПароля85 → Модуль
Клиентская команда своей управляемой формы и &НаСервереБезКонтекста; через RPC только одна Строка и шесть Булево
&НаКлиенте
Процедура ПроверитьПароль85(Команда)
Протокол85 = "";
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда
ВызватьИсключение "Используйте настоящую кнопку своей учебной формы";
КонецЕсли;
Если Команда.Имя <> "ПроверитьПароль85" Тогда
ВызватьИсключение "Нужна собственная команда ПроверитьПароль85";
КонецЕсли;
Попытка
Пакет = ПолучитьОтчетНаСервере85();
Если ТипЗнч(Пакет) <> Тип("ФиксированнаяСтруктура") Тогда
ВызватьИсключение "Сервер должен вернуть только фиксированный скалярный пакет";
КонецЕсли;
Если Пакет.Количество() <> 7
Или Не Пакет.Свойство("Алгоритм", АлгоритмТекст)
Или Не Пакет.Свойство("ПроверкаСложности", ПроверкаСложности)
Или Не Пакет.Свойство("ПервыйВерный", ПервыйВерный)
Или Не Пакет.Свойство("ПервыйИной", ПервыйИной)
Или Не Пакет.Свойство("ВторойВерный", ВторойВерный)
Или Не Пакет.Свойство("ВторойИной", ВторойИной)
Или Не Пакет.Свойство("СохраняемыеЗначенияРазличаются", СохраняемыеЗначенияРазличаются) Тогда
ВызватьИсключение "Не совпал точный состав учебного пакета";
КонецЕсли;
Если ТипЗнч(АлгоритмТекст) <> Тип("Строка")
Или ТипЗнч(ПроверкаСложности) <> Тип("Булево")
Или ТипЗнч(ПервыйВерный) <> Тип("Булево") Или ТипЗнч(ПервыйИной) <> Тип("Булево")
Или ТипЗнч(ВторойВерный) <> Тип("Булево") Или ТипЗнч(ВторойИной) <> Тип("Булево")
Или ТипЗнч(СохраняемыеЗначенияРазличаются) <> Тип("Булево") Тогда
ВызватьИсключение "В пакет допускаются только одна строка и шесть Булево";
КонецЕсли;
Если АлгоритмТекст = "" Или ПроверкаСложности
Или Не ПервыйВерный Или ПервыйИной Или Не ВторойВерный Или ВторойИной Тогда
ВызватьИсключение "Полный положительный и отрицательный контроль не получен";
КонецЕсли;
Протокол85 = "Алгоритм: " + АлгоритмТекст + Символы.ПС
+ "Проверка сложности: " + Строка(ПроверкаСложности) + Символы.ПС
+ "Первое сохраняемое значение: исходный текст — " + Строка(ПервыйВерный)
+ ", иной текст — " + Строка(ПервыйИной) + Символы.ПС
+ "Второе сохраняемое значение: исходный текст — " + Строка(ВторойВерный)
+ ", иной текст — " + Строка(ВторойИной) + Символы.ПС
+ "Сохраняемые значения различаются: " + Строка(СохраняемыеЗначенияРазличаются) + Символы.ПС
+ "Сравнивались реальные результаты платформы, а не вручную созданные хеши. Это не механизм входа в систему.";
Исключение
Протокол85 = "Проверка НЕ завершена. Успех не подтверждён. Проверьте подготовку собственной новой базы и свойства модулей; при включённой проверке сложности этот урок не запускается. Настройки не меняйте, автоматического повтора нет.";
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьОтчетНаСервере85()
Возврат УчебноеСравнениеПаролей85.ПолучитьОтчетСравнения85();
КонецФункцииПолный модуль собственной общей команды: открыть форму без автоматической проверки
Общие → Общие команды → ОткрытьПроверкуПароля85 → Модуль
Настоящее клиентское событие своей общей команды в толстом управляемом приложении
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если ПараметрКоманды <> Неопределено
Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
ВызватьИсключение "Используйте свою общую команду без параметра";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.ПроверкаСинтетическогоПароля85");
#Иначе
ВызватьИсключение "Этот урок предназначен только для толстого управляемого клиента";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Сервер проверяет точные платформу, строку File, имя и UUID-маркер версии своей конфигурации, режимы запуска/совместимости, наличие собственных объектов и серверные флаги модуля. Это ограничение учебного стенда, не полноценная авторизация и не проверка владельца по данным пользователя.
ПолучитьПроверкуСложностиПаролейПользователей возвращает настоящее Булево. При Истина — остановка без изменения режима. Это важно: native-описание положительного результата сравнения учитывает установленную политику; неизвестные требования сложности здесь не угадываются.
Прочитать настоящий ТипАлгоритмаХешированияПаролейПользователей, проверить его тип и один из четырёх документированных вариантов. Передать именно прочитанное значение, а не придуманный номер или название, в оба вызова ВычислитьСохраняемоеЗначениеПароляПользователя.
Получить две непустые строки от native-производителя. Не создавать сохраняемое значение вручную, не разбирать его внутренний формат и не пытаться получить его через Новый. Документация целевого метода прямо разрешает такую строку в параметре ЗначениеДляПроверки.
Выполнить четыре настоящих сравнения: исходный текст с первым и вторым сохраняемыми значениями; иной текст с первым и вторым. Проверить реальные типы Булево и ожидания Истина, Ложь, Истина, Ложь. Любое отклонение или исключение означает незавершённую проверку, а не успешную демонстрацию.
Различие двух сохраняемых строк — отдельное наблюдение. Для PBKDF2SHA256, SHA256 и SHA512 native-справка обещает разные значения при повторном вычислении одного текста; для SHA1 это требование не применяется. Даже разные строки должны обе принять исходный текст через целевой метод.
Снова прочитать режим сложности и алгоритм. Если типы не совпали, сложность стала Истина или алгоритм изменился — не возвращать успех. Код ничего не восстанавливает и не повторяет автоматически.
Сервер явно сопоставляет реальному enum один из строковых кодов PBKDF2SHA256, SHA1, SHA256 или SHA512 и возвращает только ФиксированнаяСтруктура из этого кода и шести Булево. Enum не передаётся клиенту; Строка(enum) не принимается за гарантированное native-имя. Клиент проверяет точные семь ключей, типы и контрольные значения, после чего показывает читаемый протокол. Исходный текст и обе сохраняемые строки в пакет и протокол не включены.
Как проверить результат
Ожидаемый будущий положительный результат: для первого значения исходный текст → Истина, иной → Ложь; для второго также Истина/Ложь. Режим сложности фактически Ложь, алгоритм указан из настоящего чтения. Это ожидаемый ручной результат, не выполненный прогон.
Для любого текущего алгоритма кроме SHA1 строка наблюдения «Сохраняемые значения различаются» должна быть Истина. Для SHA1 не требуйте Истина и не переключайте алгоритм ради красивого протокола. Сам SHA1 не предлагается как рекомендуемый алгоритм.
Открытие формы ничего не вычисляет. Перед каждым запросом старый протокол очищается. При любой ошибке кнопка показывает «Проверка НЕ завершена», а не оставляет предыдущий успешный отчёт. Native-текст ошибки с потенциальными внутренними значениями не копируется в протокол.
Неверный File, версия платформы, имя/маркер версии конфигурации или свойства общего модуля останавливают код. Включённая проверка сложности также останавливает его до вычисления. Пользователи и политики не читаются через объекты менеджера пользователей и не изменяются.
Статические проверки обязаны подтвердить два native-производителя, четыре потребителя, точные обязательные параметры, серверную доступность, scalar-only RPC и отсутствие записи, сериализации, сети, пользовательского пароля и комментариев в коде. Ручные компиляция и запуск в 1С пока не проверены.
Ожидаемый результат
Ожидаются два реальных положительных и два отрицательных Булево-сравнения в читаемом протоколе. Сохраняемые значения и исходный текст остаются в серверной памяти; настройки и учётные записи не меняются. Это не механизм входа в систему; native-прогон не выполнен.
На что обратить внимание
Сохраняемое значение не является паролем в открытом виде и не обязано быть одинаковым при одинаковом входном тексте. Native-производитель с солью может дать две разные строки; обычное сравнение сохраняемых строк не заменяет ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению.
Второй параметр целевого метода также допускает ПользовательИнформационнойБазы, но этот путь намеренно не используется. Никаких lookup, создания пользователя, чтения СохраняемоеЗначениеПароля реальной учётной записи или записи его свойства здесь нет.
Это ограниченный учебный memory-пример, не библиотека аутентификации, не инструкция хранения паролей и не предложение ослабить политику. Не использовать синтетический литерал как реальный пароль и не переносить код в рабочую конфигурацию.
Чтение режима и повторное чтение в конце не блокируют конкурентное администрирование и не доказывают отсутствие промежуточного изменения. Подготовка требует собственного спокойного стенда без параллельного изменения режимов; при обнаруженном изменении — STOP.
Сохраняемые строки и исходный текст не возвращаются клиенту и не логируются учебным кодом; внутренний формат не разбирается. Это не обещание об устройстве внутренних журналов самой платформы, памяти процесса или администраторской отладки.
Неглобальный модуль без ВызовСервера нельзя вызвать из клиентского обработчика напрямую. Реальный маршрут: своя клиентская кнопка → серверная функция своей формы → серверный общий модуль → фиксированный скалярный пакет → проверенный клиентский протокол.
Копия рабочей базы с переименованной конфигурацией и похожим UUID не становится новой собственной лабораторией. Путь и имена — предохранители от случайного запуска, не доказательство происхождения или прав. Новую пустую среду подготовьте вручную.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Сравнить три действия политики входа и настройку алгоритма без аутентификации
Проверяются PBKDF2SHA256, флаг проверки раскрытия и три значения действия при несоответствии пароля требованиям. Это только административная настройка с восстановлением: ни вход, ни смена пароля, ни внешняя проверка не вызываются.
Где и как запускать
Полный модуль управляемой формы; серверные административные настройки собственного пустого стенда, никакой аутентификации, смены паролей и внешних вызовов.
Подготовка
Создайте с нуля отдельную пустую конфигурацию УчебнаяПарольнаяПолитика85 на платформе8.5.1.1343; управляемое приложение, без разделителей данных, расширений, обменов и подписок. Не переименовывайте рабочую базу под этот пример.
Это административные настройки всей учебной информационной базы, не значения в локальной структуре. Только один заранее созданный учебный администратор с правом Администрирование; ни одного рабочего пользователя или рабочего пароля.
Используйте отдельную новую файловую базу и единственный сеанс Предприятия. На время опыта исключите другие сеансы, повторную аутентификацию, фоновые входы и изменение паролей. Предварительно проверьте это вручную, а не полагайтесь только на имя конфигурации.
Обработки → ОпытПарольнойПолитики85 → управляемая основная форма. Добавьте реквизит ПодтверждаюПустойСтенд типа Булево, исходно Ложь, и покажите его флажком. Для каждого урока используйте отдельную обработку либо целиком замените модуль формы.
Добавьте команду с именем указанной клиентской процедуры, назначьте её действие и кнопку. Основной код — полный модуль формы; обе процедуры/функции уже показаны и не вставляются внутрь другого обработчика.
Нажмите F7 и обновите только новый стенд. runtimeVerifiedScenarios=0: здесь примеры не запускались, пользователей и пароли не меняли; выполнены только статические проверки.
Перед своим ручным запуском изучите весь блок восстановления. Исходные значения читаются до первой записи; после опыта восстанавливаются именно они, а не справочные значения по умолчанию.
Установите флажок только после подготовки стенда. Клиент передаёт подтверждение, сервер повторно проверяет его. Это защита от случайного запуска, не универсальная авторизация для production.
Не вводите и не выводите пароли. Код не создаёт пользователей, не вызывает проверку раскрытия конкретного пароля, не делает входов и не проверяет реальную реакцию диалогов аутентификации.
Если восстановление не подтвердилось, не повторяйте опыт и не входите другим пользователем: администратор должен вручную сверить только настройки отдельного учебного стенда. Принудительное завершение процесса не гарантирует выполнение восстановления.
Команда ПроверитьНастройкиАутентификации85. Только один уже открытый сеанс учебного администратора с правом Администрирование; новые входы и изменения пароля запрещены до конца восстановления.
Не запускайте параллельно другой клиент или аутентифицируемое соединение. Изменение алгоритма влияет на последующие входы/смены паролей; возвращение настройки не отменяет уже случившуюся миграцию.
&НаКлиенте
Процедура ПроверитьНастройкиАутентификации85(Команда)
Если Не ПодтверждаюПустойСтенд Тогда
ВызватьИсключение "Подтвердите работу только в своём новом пустом стенде";
КонецЕсли;
Сообщить(ПроверитьСвоюПолитикуВхода(ПодтверждаюПустойСтенд));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПроверитьСвоюПолитикуВхода(Подтверждение)
Если ТипЗнч(Подтверждение) <> Тип("Булево") Тогда
ВызватьИсключение "Нужно явное подтверждение нового пустого стенда";
КонецЕсли;
Если Не Подтверждение Тогда
ВызватьИсключение "Только новый пустой стенд УчебнаяПарольнаяПолитика85 с отдельным согласием";
КонецЕсли;
ИсходныйАлгоритм = ПолучитьТипАлгоритмаХешированияПаролейПользователей();
ИсходноеДействие = ПолучитьДействиеПриНесоответствииПаролейПользователейТребованиямПриАутентификации();
ИсходнаяПроверкаРаскрытия = ПолучитьПроверкуРаскрытияПаролейПользователей();
УчебнаяПроверкаРаскрытия = Не ИсходнаяПроверкаРаскрытия;
ОшибкаОпыта = "";
Попытка
УстановитьТипАлгоритмаХешированияПаролейПользователей(ТипАлгоритмаХешированияПаролейПользователей.PBKDF2SHA256);
УстановитьПроверкуРаскрытияПаролейПользователей(УчебнаяПроверкаРаскрытия);
Если ПолучитьТипАлгоритмаХешированияПаролейПользователей() <> ТипАлгоритмаХешированияПаролейПользователей.PBKDF2SHA256
Или ПолучитьПроверкуРаскрытияПаролейПользователей() <> УчебнаяПроверкаРаскрытия Тогда
ВызватьИсключение "Алгоритм и переключённый флаг не подтвердились";
КонецЕсли;
Варианты = Новый Массив;
Варианты.Добавить(ДействиеПриНесоответствииПароляТребованиямПриАутентификации.Нет);
Варианты.Добавить(ДействиеПриНесоответствииПароляТребованиямПриАутентификации.ПредложитьСменуПароля);
Варианты.Добавить(ДействиеПриНесоответствииПароляТребованиямПриАутентификации.ПотребоватьСменуПароля);
Для Каждого Действие Из Варианты Цикл
УстановитьДействиеПриНесоответствииПаролейПользователейТребованиямПриАутентификации(Действие);
Если ПолучитьДействиеПриНесоответствииПаролейПользователейТребованиямПриАутентификации() <> Действие Тогда
ВызватьИсключение "Выбранное действие политики входа не подтвердилось";
КонецЕсли;
КонецЦикла;
Исключение
ОшибкаОпыта = ОписаниеОшибки();
КонецПопытки;
Попытка
УстановитьДействиеПриНесоответствииПаролейПользователейТребованиямПриАутентификации(ИсходноеДействие);
Исключение
ОшибкаОпыта = ОшибкаОпыта + " Не восстановлено действие: " + ОписаниеОшибки();
КонецПопытки;
Попытка
УстановитьТипАлгоритмаХешированияПаролейПользователей(ИсходныйАлгоритм);
Исключение
ОшибкаОпыта = ОшибкаОпыта + " Не восстановлен алгоритм: " + ОписаниеОшибки();
КонецПопытки;
Попытка
УстановитьПроверкуРаскрытияПаролейПользователей(ИсходнаяПроверкаРаскрытия);
Исключение
ОшибкаОпыта = ОшибкаОпыта + " Не восстановлена проверка раскрытия: " + ОписаниеОшибки();
КонецПопытки;
Попытка
Если ПолучитьТипАлгоритмаХешированияПаролейПользователей() <> ИсходныйАлгоритм
Или ПолучитьДействиеПриНесоответствииПаролейПользователейТребованиямПриАутентификации() <> ИсходноеДействие
Или ПолучитьПроверкуРаскрытияПаролейПользователей() <> ИсходнаяПроверкаРаскрытия Тогда
ВызватьИсключение "Исходные настройки политики входа ещё не восстановлены";
КонецЕсли;
Исключение
ОшибкаОпыта = ОшибкаОпыта + " Проверка восстановления: " + ОписаниеОшибки();
КонецПопытки;
Если ОшибкаОпыта <> "" Тогда
ВызватьИсключение ОшибкаОпыта;
КонецЕсли;
Возврат "PBKDF2SHA256, флаг раскрытия и три действия проверены только чтением настроек и восстановлены. Аутентификация и смена пароля не выполнялись.";
КонецФункцииРазбор по шагам
До записи читаются исходный алгоритм, действие при несоответствии и флаг проверки раскрытия; это реальные значения своей базы, а не жёстко заданный откат.
Ставится PBKDF2SHA256 и переключается булев флаг раскрытия. Чтение подтверждает именно новый алгоритм и новое состояние флага.
Массив содержит три реальные readonly-константы действия: Нет, ПредложитьСменуПароля, ПотребоватьСменуПароля. Они не конструируются и не получают значения присваиванием.
Для каждого варианта выполняются установка и чтение. По установленной справке Нет записывает событие нарушения, Предложить показывает пропускаемый диалог, Потребовать — непропускаемый; сами диалоги здесь не запускаются.
Первым возвращается исходное действие, затем алгоритм и флаг раскрытия. Попытки независимы; окончательная проверка сверяет весь исходный снимок.
Код не вызывает Аутентификация, смену пароля или ПроверитьРаскрытиеПароля. Успех подтверждает настройки, а не внешнюю службу проверки и не фактическую миграцию хешей.
Как проверить результат
ПолучитьТипАлгоритмаХешированияПаролейПользователей подтверждает PBKDF2SHA256 до восстановления.
Флаг раскрытия меняется на противоположный и возвращается к первоначальному.
Все три варианта действия проходят setter/getter-проверку без входа пользователя.
Последнее чтение подтверждает исходный алгоритм, действие и флаг. Пользовательские хеши этот код не читает и не выводит.
Ожидаемый результат
Алгоритм, флаг и три действия проверены чтением настроек; исходная политика восстановлена без входов и смены паролей.
На что обратить внимание
Настройки действуют на всю информационную базу. Изменение записывается вне локальных переменных; не используйте код в рабочей базе или фоновом задании.
Восстановление после обработанного исключения не гарантирует восстановление при падении процесса, отключении питания или потере соединения. Поэтому нужен отдельный пустой стенд, а не production.
Каждая попытка восстановления независима, ошибки не замалчиваются. Даже успешное повторное чтение не превращает незавершённую миграцию пользовательских данных в откат.
Значения этого опыта иллюстрируют API и проверки, а не рекомендуемую политику безопасности организации. Не переносите их как готовый стандарт.
Проверка getter-методом доказывает только текущее значение настройки. Она не доказывает проверку конкретного пароля, историю ранее использованных паролей или реальный сценарий входа.
В справочнике runtimeVerifiedScenarios=0. Перед самостоятельным использованием нужны F7 и контролируемый ручной опыт в собственном стенде; фактический запуск здесь не выполнялся.
По справке новый алгоритм применяется к хранимому значению пароля при следующей аутентификации или изменении пароля. Возврат прежней настройки не равен откату миграции уже изменённых пользовательских хешей.
Нет не означает полного отсутствия реакции: при выявленном нарушении платформа записывает событие в журнал регистрации.
ПотребоватьСменуПароля может вызвать исключение, если пользователю запрещена смена пароля. Не используйте этот флаг для неизвестных пользователей без отдельного согласованного процесса.
Включение флага проверки раскрытия не доказывает доступность внешней службы и не проверяет конкретный пароль. Этот урок не выполняет такие обращения и не демонстрирует их успешность.
Алгоритмы новее SHA-1 требуют платформы8.3.26 и выше; урок ограничен8.5.1.1343. Не используйте этот опыт как план миграции смешанного парка старых клиентов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.