Наверно, многие из разработчиков когда-нибудь сталкивались с необходимостью зашифровать данные в 1С. Однажды и я столкнулся с этой проблемой. В сети предлагается множество способов организации шифрования сторонними методами, я же хотел бы рассмотреть шифрование встроенными методами.
В данной статье рассматривается шифрование строк. Разбираемые алгоритмы применимы к любым значениям, которые возможно преобразовать в строку и обратно. Например, таблицу значений можно преобразовать в строку методом ЗначениеВСтрокуВнутр и методом ЗначениеИзСтрокиВнутр получить обратно таблицу значений.
В 1С есть два встроенных варианта использования шифрования:
1. Использование электронной подписи (асимметричное шифрование) имеет сложный механизм применения - в настоящей статье не рассматривается.
2. Использование запароленного zip-архива (симметричное шифрование) - рассматривается в настоящей статье.
Для анализа использования алгоритма приведу примеры универсальных функций, выполняющих шифрование и дешифровку данных (функции выполняются на сервере):
Функция ПолучитьЗашифрованныеДанные(ДанныеШифрования,КлючШифрования,ИдентификаторДанных = "0") Экспорт
Попытка
Путь = КаталогВременныхФайлов()+"\"+ИдентификаторДанных;
ПутьФайла = Путь+".txt";
ПутьАрхива = Путь+".zip";
ЗаписьТекста = Новый ЗаписьТекста(ПутьФайла);
ЗаписьТекста.Записать(ДанныеШифрования);
ЗаписьТекста.Закрыть();
ЗаписьАрхива = Новый ЗаписьZipФайла(ПутьАрхива,КлючШифрования,,,,МетодШифрованияZIP.AES256);
ЗаписьАрхива.Добавить(ПутьФайла);
ЗаписьАрхива.Записать();
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьАрхива);
ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9));
УдалитьФайлы(ПутьФайла);
УдалитьФайлы(ПутьАрхива);
Возврат ХранилищеДанных;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция ПолучитьРасшифрованныеДанные(ХранилищеДанных,КлючШифрования,ИдентификаторДанных = "0") Экспорт
Попытка
КаталогСохранения = КаталогВременныхФайлов();
Путь = КаталогСохранения+"\"+ИдентификаторДанных;
ПутьАрхива = Путь+".zip";
ХранилищеДанных.Получить().Записать(ПутьАрхива);
ЧтениеАрхива = Новый ЧтениеZipФайла(ПутьАрхива,КлючШифрования);
ЭлементАрхива = ЧтениеАрхива.Элементы[0];
ЧтениеАрхива.Извлечь(ЭлементАрхива,КаталогСохранения);
ЧтениеАрхива.Закрыть();
ПутьФайла = КаталогСохранения+"\"+ЭлементАрхива.Имя;
ЧтениеТекста = Новый ЧтениеТекста(ПутьФайла);
Данные = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ПутьАрхива);
УдалитьФайлы(ПутьФайла);
Возврат Данные;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция ПолучитьЗашифрованныеДанные возвращает хранилище значения с зашифрованными двоичными данными.
Параметры функции:
ДанныеШифрования - Строка для зашифровки;
КлючШифрования - Ключ симметричного шифрования (пароль zip-архива);
ИдентификаторДанных - Строка - Произвольное идентификационное значение (необязательный параметр)
Механизм шифрования заключается в следующей последовательности действий:
- Шифруемая строка записывается в текстовый файл
- Текстовый файл помещается в архив с паролем (метод шифрования можно выбрать, в данном случае используется AES-256)
- Записанный архив в зашифрованном виде переводится в двоичные данные
- Двоичные данные помещаются в хранилище значения, которое возвращается функцией (в дальнейшем, хранилище значения можно поместить в реквизит какого-либо объекта или регистра и хранить в СУБД до появления необходимости в расшифровке)
- Созданные файлы удаляются
Функция ПолучитьРасшифрованныеДанные возвращает расшифрованное строковое значение.
Параметры функции:
ХранилищеДанных -Хранилище значения с зашифрованными данными (значение возвращенное функцией ПолучитьЗашифрованныеДанные);
КлючШифрования - Ключ сииметричного шифрования (пароль zip-архива; такой же, как для функции ПолучитьЗашифрованныеДанные);
ИдентификаторДанных - Строка - Произвольное идентификационное значение (необязательный параметр)
Механизм дешифрования заключается в следующей последовательности действий:
- Из зашифрованного хранилища значения извлекаются двоичные данные
- Двоичные данные записываются в файл (это должен быть зашифрованный zip-архив)
- Из zip-архива извлекается текстовый файл с расшифрованным строковым значением
- Из текстового файла считывается расшифрованное строковое значение, которое возвращается данной функцией
- Созданные файлы удаляются
Изложил свой опыт работы с симметричным шифрованием в 1С.
Надеюсь, будет кому-нибудь полезен.