gifts2017

Симметричное шифрование в 1С

Опубликовал Александр Анисин (alex271) в раздел Программирование - Защита и шифрование

Настоящая статья посвящена реализации в 1С симметричного шифрования встроенными механизмами

Наверно, многие из разработчиков когда-нибудь сталкивались с необходимостью зашифровать данные в 1С. Однажды и я столкнулся с этой проблемой. В сети предлагается множество способов организации шифрования сторонними методами, я же хотел бы рассмотреть шифрование встроенными методами.

В данной статье рассматривается шифрование строк. Разбираемые алгоритмы применимы к любым значениям, которые возможно преобразовать в строку и обратно. Например, таблицу значений можно преобразовать в строку методом ЗначениеВСтрокуВнутр и методом ЗначениеИзСтрокиВнутр получить обратно таблицу значений.

В 1С есть два встроенных варианта использования шифрования:

1. Использование электронной подписи (асимметричное шифрование) имеет сложный механизм применения - в настоящей статье не рассматривается.

2. Использование запароленного zip-архива (симметричное шифрование) - рассматривается в настоящей статье.

Для анализа использования алгоритма приведу примеры универсальных функций, выполняющих шифрование и дешифровку данных (функции выполняются на сервере):

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

КонецФункции

Функция ПолучитьРасшифрованныеДанные(ХранилищеДанных,КлючШифрования,ИдентификаторДанных = "0") Экспорт
	
	Попытка
		КаталогСохранения = КаталогВременныхФайлов();
		Путь = КаталогСохранения+"\"+ИдентификаторДанных;
		ПутьАрхива = Путь+".zip";
		ХранилищеДанных.Получить().Записать(ПутьАрхива);
		ЧтениеАрхива = Новый ЧтениеZipФайла(ПутьАрхива,КлючШифрования);
		ЭлементАрхива = ЧтениеАрхива.Элементы[0];
		ЧтениеАрхива.Извлечь(ЭлементАрхива,КаталогСохранения);
		ЧтениеАрхива.Закрыть();
		ПутьФайла = КаталогСохранения+"\"+ЭлементАрхива.Имя;
		ЧтениеТекста = Новый ЧтениеТекста(ПутьФайла);
		Данные = ЧтениеТекста.Прочитать();
		ЧтениеТекста.Закрыть();
		УдалитьФайлы(ПутьАрхива);
		УдалитьФайлы(ПутьФайла);
		Возврат Данные;
		
	Исключение
		Возврат Неопределено;
	КонецПопытки; 

КонецФункции
 

Функция ПолучитьЗашифрованныеДанные возвращает хранилище значения с зашифрованными двоичными данными.

Параметры функции:

ДанныеШифрования - Строка для зашифровки;

КлючШифрования - Ключ симметричного шифрования (пароль zip-архива);

ИдентификаторДанных - Строка - Произвольное идентификационное значение (необязательный параметр)

Механизм шифрования заключается в следующей последовательности действий:

  1. Шифруемая строка записывается в текстовый файл
  2. Текстовый файл помещается в архив с паролем (метод шифрования можно выбрать, в данном случае используется AES-256)
  3. Записанный архив в зашифрованном виде переводится в двоичные данные
  4. Двоичные данные помещаются в хранилище значения, которое возвращается функцией (в дальнейшем, хранилище значения можно поместить в реквизит какого-либо объекта или регистра и хранить в СУБД до появления необходимости в расшифровке)
  5. Созданные файлы удаляются

Функция ПолучитьРасшифрованныеДанные возвращает расшифрованное строковое значение.

Параметры функции:

ХранилищеДанных -Хранилище значения с зашифрованными данными (значение возвращенное функцией ПолучитьЗашифрованныеДанные);

КлючШифрования - Ключ сииметричного шифрования (пароль zip-архива; такой же, как для функции ПолучитьЗашифрованныеДанные);

ИдентификаторДанных - Строка - Произвольное идентификационное значение (необязательный параметр)

Механизм дешифрования заключается в следующей последовательности действий:

  1. Из зашифрованного хранилища значения извлекаются двоичные данные
  2. Двоичные данные записываются в файл (это должен быть зашифрованный zip-архив)
  3. Из zip-архива извлекается текстовый файл с расшифрованным строковым значением
  4. Из текстового файла считывается расшифрованное строковое значение, которое возвращается данной функцией
  5. Созданные файлы удаляются

Изложил свой опыт работы с симметричным шифрованием в 1С.

Надеюсь, будет кому-нибудь полезен.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Иван Иванов (lex27119) 02.06.15 16:02
Нужная статья.
Когда-то мне нужно было сделать шифрование в 1С, голову сломал.
2. Андрей Карпов (karpik666) 02.06.15 19:14
3. Роман Васюта (VaranRX) 03.06.15 11:34
Если ключ шифрования в конфе то обходится первым же декомпилятором
4. Александр Анисин (alex271) 03.06.15 11:44
(3) VaranRX,
А с чего Вы взяли, что ключ шифрования должен быть в конфигурации или в информационной базе.
Тут есть несколько вариантов реализации:
Например, перед шифрованием (дешифрованием) его можно запросить у пользователя и никуда не сохранять.
А если шифрование (дешифрование) будет происходить в конфигурации постоянно, то ключ можно поместить в параметр сеанса, как вариант.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа