Вычисляет сохраняемое значение пароля, предназначенное для использования в качестве значения свойства СохраняемоеЗначениеПароля, алгоритмом заданного типа. Для всех типов алгоритмов, кроме SHA1, при каждом вызове метода с одним и тем же паролем будут выдаваться различные сохраняемые значения пароля.
Синтаксис
ВычислитьСохраняемоеЗначениеПароляПользователя(<Пароль>, <ТипАлгоритмаХешированияПароля>)Полное описание, параметры и ограничения
Глобальный контекст.ВычислитьСохраняемоеЗначениеПароляПользователя (Global context.EvaluateStoredUserPasswordValue)
Глобальный контекст (Global context)
ВычислитьСохраняемоеЗначениеПароляПользователя (EvaluateStoredUserPasswordValue)
Доступен, начиная с версии 8.3.26.
Синтаксис:
ВычислитьСохраняемоеЗначениеПароляПользователя(<Пароль>, <ТипАлгоритмаХешированияПароля>)
Параметры:
<Пароль> (обязательный)
Тип: Строка.
Пароль, для которого вычисляется сохраняемое значение.
<ТипАлгоритмаХешированияПароля> (необязательный)
Тип: ТипАлгоритмаХешированияПаролейПользователей, Неопределено.
Тип алгоритма хеширования для получения сохраняемого значения пароля.
Если Неопределено, то используется текущий тип алгоритма хеширования паролей информационной базы, доступный с помощью метода ПолучитьТипАлгоритмаХешированияПаролейПользователей.
Значение по умолчанию: Неопределено.
Возвращаемое значение:
Тип: Строка.
Описание:
Вычисляет сохраняемое значение пароля, предназначенное для использования в качестве значения свойства СохраняемоеЗначениеПароля, алгоритмом заданного типа. Для всех типов алгоритмов, кроме SHA1, при каждом вызове метода с одним и тем же паролем будут выдаваться различные сохраняемые значения пароля.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
См. также:
ПользовательИнформационнойБазы, свойство СохраняемоеЗначениеПароля
Глобальный контекст
Использование в версии:
Доступен, начиная с версии 8.3.26.
Описание изменено в версии 8.3.27.
Методическая информация
Практические примеры
Один синтетический пароль, два 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 не становится новой собственной лабораторией. Путь и имена — предохранители от случайного запуска, не доказательство происхождения или прав. Новую пустую среду подготовьте вручную.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Отличить сохраняемое значение пароля от самого пароля
Для публичной учебной фразы вычисляем две сохраняемые строки текущим алгоритмом базы, но ничего не записываем в свойства пользователей.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Серверная процедура отдельной учебной базы. Не используйте настоящие пароли, ключи API или токены.
Примеры не создают пользователей, не меняют их пароли и не включают внешний сервис проверки раскрытия.
Значения паролей и сохраняемых строк не выводятся в сообщения, журнал или файл.
УчебнаяФраза = "Public-Training-Only-2026!";
Алгоритм = ПолучитьТипАлгоритмаХешированияПаролейПользователей();
ПерваяСтрока = ВычислитьСохраняемоеЗначениеПароляПользователя(УчебнаяФраза, Алгоритм);
ВтораяСтрока = ВычислитьСохраняемоеЗначениеПароляПользователя(УчебнаяФраза, Алгоритм);
Сообщить("Тип алгоритма текущей базы: " + Строка(Алгоритм));
Сообщить(Не ПустаяСтрока(ПерваяСтрока));
Сообщить(Не ПустаяСтрока(ВтораяСтрока));
ОжидаетсяСовпадение = Алгоритм = ТипАлгоритмаХешированияПаролейПользователей.SHA1;
Сообщить((ПерваяСтрока = ВтораяСтрока) = ОжидаетсяСовпадение);
ПерваяСтрока = "";
ВтораяСтрока = "";
УчебнаяФраза = "";Разбор по шагам
ПолучитьТипАлгоритмаХешированияПаролейПользователей только читает используемый тип алгоритма.
Оба вычисления используют одну заранее известную учебную фразу и явно один и тот же текущий алгоритм.
Результат — строка для механизма хранения пароля платформы, не восстановленный пароль.
По описанию API SHA1 даёт одинаковую строку для одинаковой фразы; остальные поддерживаемые типы дают разные сохраняемые строки при повторном вычислении.
Сравнение двух сохраняемых строк не является универсальным способом проверки пароля пользователя.
Свойство СохраняемоеЗначениеПароля и метод Записать пользователя здесь не вызываются.
Как проверить результат
Обе сохраняемые строки непустые; сами строки и учебная фраза не выводятся.
Проверка ожидаемого совпадения Истина согласно текущему алгоритму.
Тип алгоритма, учётные записи и пароли базы остаются прежними.
Ожидаемый результат
Разделены исходная фраза, сохраняемая строка и тип алгоритма без изменения аутентификации.
На что обратить внимание
Ветка SHA1 описывает поведение существующего API, не рекомендацию выбирать этот алгоритм для новой системы.
Сохраняемая строка — чувствительные данные; не публикуйте реальные значения в журнале или HTML.
Функция не является проверкой входа пользователя, обратимым шифрованием или генератором токена доступа.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.