Вашему вниманию предлагается подсистема шифрования данных в 1С.
В поставляемой конфигурации реализован механизм симметричного шифрования, описанный в статье //infostart.ru/public/363830/
Подсистема может использоваться как для интеграции в другие конфигурации, так и в качестве самостоятельного решения для хранения паролей (реализовано как пример использования инструмента, которым сам стал пользоваться).
В поставку входит конфигурация, содержащая в себе:
- Функциональность шифрования данных и ограничения доступа к системе (см. далее);
- Функциональность для хранения паролей доступа (см. далее);
- Библиотеку универсальных функций и процедур (//infostart.ru/public/319157/);
- Универсальный механизм обработки событий записи объектов (//infostart.ru/public/321709/);
- Библиотеку универсальной обработки асинхронных вызовов (//infostart.ru/public/363216/)
Описание подсистемы
I. Ключ шифрования
В конфигурации предусмотрена константа "Контейнер ключа шифрования" с типом Хранилище значения. Если при входе в систему хранилище является пустым, то шифрование считается выключенным. В этом случае конфигурация ведет себя как стандартное решение для хранения информации, тогда ключ шифрования не запрашивается.
С помощью обработки "Изменение ключа шифрования" можно установить значение ключа шифрования, который будет применяться для шифрования информации и ограничения доступа в систему (при изменении ключа производятся последовательно дешифровка информации по старому ключу и зашифровка информации по новому ключу). Также введенным ключом шифруется строка пустого УИД, помещаемая в зашифрованном виде в константу "Контейнер ключа шифрования".
После включения шифрования посредством установки ключа при входе в систему помимо стандартной авторизации, необходимо указать ключ шифрования (один на информационную базу). Если с помощью введенного ключа не удастся расшифровать контейнер, сеанс завершится. если ключ указан правильно, его значение помещается в параметр сеанса и используется для шифрования и расшифровки конфиденциальной информации.
Ключ шифрования не хранится ни в информационной базе, ни в конфигурации, поэтому извлечь из информационной базы зашифрованную информацию без подбора ключа практически невозможно.
II. Организация новых объектов шифрования в подсистеме
Для организации шифрования произвольной информации необходимо сделать следующее:
- Определиться с составом объектов ссылочного типа, информация в которых подлежит шифрованию (в приводимом решении используется два справочника "Ресурсы" и "Стандарты доступа"). Выбранные объекты указать в качестве составных типов для определяемого типа "Объект шифрования".
- В модуль объекта каждого из объектов шифрования добавить следующие экспортные процедуры и функции (без параметров):
- Функция ПроверитьЗаполнениеШифруемыхРеквизитов (возвращает Истина, если реквизиты объекта заполнены информацией, подлежащей шифрованию, в противном случае Ложь);
- Функция ПодготовитьИнформациюДляШифрования (возвращает строку, подлежащую шифрованию; если нужно зашифровать табличную часть или множество других реквизитов, всю информацию можно поместить в произвольную универсальную коллекцию и воспользоваться функцией ЗначениеВСтрокуВнутр);
- Процедура ОчиститьШифруемыеРеквизиты (удаляет из объекта информацию, подлежащую шифрованию);
- Процедура ВосстановитьЗашифрованныеРеквизиты (расшифровывает и восстанавливает в объекте ранее зашифрованную информацию);
- Добавить в подписки на события "Перед записью объекта шифрования" и "При записи объекта шифрования" объекты шифрования в качестве источника.
- Настроить демонстрацию пользователю зашифрованной информации в формах объектов шифрования
III. Механизм шифрования
Механизм шифрования, как уже было написано выше, работает, если установлен ключ шифрования. Механизм шифрования информации в подсистеме представляет собой следующую последовательность действий:
- Перед записью объекта шифрования, если в дополнительных свойствах объекта не установлен флаг "Не шифровать", проверяется наличие информации для зашифровки (Функция ПроверитьЗаполнениеШифруемыхРеквизитов).
- Если шифруемые реквизиты заполнены, производится формирование строки, которая будет зашифрована (Функция ПодготовитьИнформациюДляШифрования)
- Информация для шифрования помещается в дополнительные свойства объекта, а реквизиты шифрования очищаются (Процедура ОчиститьШифруемыеРеквизиты), т.о. шифруемая информация в объекте больше не хранится.
- При записи, если не произошел какой-либо отказ, вышеописанные изменения фиксируются, информация шифруется с помощью ключа шифрования симметричным алгоритмом (см. подробно //infostart.ru/public/363830/) и помещается в Хранилище значения, которое записывается в регистр сведений "Данные шифрования".
- При проведении дешифровки (Процедура ВосстановитьЗашифрованныеРеквизиты) значения реквизитов шифрования восстанавливаются.
Для удобства использования в конфигурации предусмотрены две общие команды "Зашифровать информацию по всем объектам" и "Расшифровать информацию по всем объектам".
IV. Описание решения Keystore для хранения паролей
Основой решения является справочник "Ресурсы" (форма элемента представлена на скриншоте).
При заполнении информации в справочнике можно выделить следующие блоки:
- Общая информация (наименование, код, интернет-ссылка для web-ресурсов);
- Нормативно-справочная информация (аналитические разрезы учета ресурсов по соответствующим справочникам):
- Владелец (провайдер) ресурса (лицо, обеспечивающее доступ к ресурсу);
- Вид (произвольная классификация видов ресурсов - например: домен, личный кабинет, рабочее место, электронная почта и т.п.);
- Объект (для ресурсов, жестко привязанных к некоторому физическому объекту, например, зданию, помещению, земельному участку и т.п.)
- Авторизация:
- логин (учетная запись) - можно указать в форме строки или ссылки на справочник "Учетные записи" (справочник создан для ресурсов, использующих одинаковые логины)
- пароль (можно указать в форме строки или ссылки на справочник "Стандарты доступа", описание см. ниже)
- Число вариантов (для периодически изменяемых паролей размер исторической памяти)
- Справочно: Даты получения и прекращения доступа к ресурсу
- Идентификаторы: табличное поле на отдельной закладке, в котором можно хранить значения различной идентификационной информации, связанной с соответствующим ресурсом (не являющейся логином), например, номер договора, код клиента и т.п.
Поле "Пароль" является шифруемым реквизитом справочника. На форме элемента предусмотрена кнопка открытия значения, при нажатии на которую, если значение заполнено (не зашифровано), то оно и открывается, в противном случае открывается расшифрованное значение, хранящееся в регистре сведений "Данные шифрования".
Справочник "Стандарты доступа" содержит табличную часть со списком паролей, который может применяться, например в ситуациях, когда нужно периодически менять пароль, тогда доступ к ресурсу учитывается посредством ссылки на данный справочник, в котором можно задать список используемых паролей). Табличная часть является шифруемой. Демонстрация расшифрованных значений осуществляется по специальной кнопке на форме элемента справочника.
Надеюсь, кому-нибудь пригодится.
Принимаются пожелания по доработке.