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