Каталог решений - Скажи пароль или как работать со свойством СохраняемоеЗначениеПароля объекта типа ПользовательИнформационнойБазы

Скажи пароль или как работать со свойством СохраняемоеЗначениеПароля объекта типа ПользовательИнформационнойБазы

Скажи пароль или как работать со свойством СохраняемоеЗначениеПароля объекта типа ПользовательИнформационнойБазы

В наличии

Ряд статей уже затрагивали тему проверки текущего пароля пользователя и работу со свойством "СохраняемоеЗначениеПароля", но конкретики по данному вопросу мало. Данная короткая статья призвана исправить этот пробел.

Категория:

Описание

Америку открывать никому не собираюсь, но как это ни странно, после получаса блуждания по просторам интернета я так и не нашёл конкретного описания, как можно сравнить введённый пароль с паролем текущего пользователя без его модификации (как это, например, реализовано в публикации 102655).

На деле всё оказалось довольно просто. В справке к свойству СохраняемоеЗначениеПароля объекта типа ПользовательИнформационнойБазы написано:

Содержит хранимые значения пароля (хеш-функции) и хранимые значения пароля в верхнем регистре (хеш-функции) разделенные запятой.

Только не указано, какие конкретно для этого используются хэш-функции. Для значения пароля «Привет» свойство содержит строку «KAWujn4S8YITX5L7kIQ7sQgNO+g=,c9a04UjoS/W0iLeU7GUa9/Ltd1E=».

Немного покопавшись в «сети», можно найти такую формулировку «sha-1, обёрнутый в base64». Складывая всё вместе, выводим следующий алгоритм:

Функция ПолучитьХешПароля(Пароль) Экспорт
	
	Хеш = Новый ХешированиеДанных(ХешФункция.SHA1);
	Хеш.Добавить(Пароль);
	Возврат Base64Строка(Хеш.ХешСумма);
	
КонецФункции

Проверяем на нашем пароле «Привет» и убеждаемся, что получившееся значение действительно совпадает с левой частью из сохраненного хеша.

Дальше с помощью функции получаем текущее значение свойства СохраняемоеЗначениеПароля, не забывая установить привилегированный режим (т.к. «доступно только пользователю с административными правами»), декомпозируем его на регистрозависимую (слева от запятой) и регистронезависимую (справа) части и сравниваем полученные значения.

Функция ПроверитьТекущийПарольПользователя(Пароль, РегистроНезависимый=Истина) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	ХешТекущегоПароля = ПользователиИнформационнойБазы.ТекущийПользователь().СохраняемоеЗначениеПароля;
	УстановитьПривилегированныйРежим(Ложь);

	Если ХешТекущегоПароля = Пароль Тогда Возврат Истина КонецЕсли; // Пароль совпадает с СохраняемоеЗначениеПароля только в случае пустого значения
	
	ПозицияРазделителя = Найти(ХешТекущегоПароля, ",");
	Результат = Ложь;
	Если РегистроНезависимый Тогда
		Результат = ПолучитьХешПароля(ВРег(Пароль)) = Прав(ХешТекущегоПароля, СтрДлина(ХешТекущегоПароля) - ПозицияРазделителя);
	Иначе
		Результат = ПолучитьХешПароля(Пароль) = Лев(ХешТекущегоПароля, ПозицияРазделителя - 1);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Вуаля! Ну, и на последок приведу еще функцию, формирующую значение свойства СохраняемоеЗначениеПароля из введенного пароля.

Функция ПолучитьСохраняемоеЗначение(Пароль) Экспорт
	
	Возврат ?(ЗначениеЗаполнено(Пароль),ПолучитьХешПароля(Пароль) + "," + ПолучитьХешПароля(ВРег(Пароль),"");
	
КонецФункции
has been added to your cart:
Оформление заказа