Как зашифровать данные и числа по кодовой фразе в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Разберем задачу, когда требуется ограничить доступ к конфиденциальным данным (например, суммам или численным значениям в табличной части документа) таким образом, чтобы просмотреть их мог только обладатель секретной кодовой фразы (пароля). При этом данные не должны быть доступны ни администраторам базы, ни разработчикам в явном виде.

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

Алгоритм побитового шифрования XOR

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

Проанализируем принцип работы алгоритма на примере двоичных кодов отдельных символов:

  1. 1 XOR 0 = 1
  2. 0 XOR 0 = 0
  3. 1 XOR 1 = 0
  4. 0 XOR 1 = 1

Рассмотрим пример шифрования символа. Пусть исходный символ — R (двоичный код 01010010), а ключ — символ D (двоичный код 01000100):

Побитовая операция XOR:

01010010 (буква R)
01000100 (ключ D)
Результат: 00010110 (зашифрованный символ)

Для расшифровки выполняем аналогичное действие над шифротекстом и ключом D:

00010110 (зашифрованный символ)
01000100 (ключ D)
Результат: 01010010 (исходный символ R)

Главная проблема побитового XOR в 1С: нуль-символ

При попытке реализовать алгоритм XOR над обычными строками средствами 1С возникает критическая ошибка. Если символ исходной строки совпадает с соответствующим символом ключа, их XOR-преобразование дает нулевой байт — символ с кодом 0 (Символ(0)).

Критически важно: платформа 1С при обработке строковых типов воспринимает Символ(0) как маркер конца строки. В результате зашифрованное значение обрезается на первом же совпавшем символе, а последующая расшифровка полностью портите данные.

Чтобы избежать этой проблемы, шифрование следует выполнять не над строками, а над объектом ДвоичныеДанные, с последующим кодированием результата в формат Base64 через функцию Base64Строка().

Альтернативное решение: использование объектов ZIP и AES-256

Чтобы не изобретать велосипед и избежать проблем с представлением символов, разберем штатный и надежный способ шифрования по паролю с помощью встроенного в 1С объекта ЗаписьZipФайла.

Объекты работы с ZIP-архивами в 1С поддерживают стойкое шифрование по алгоритму AES-256 без необходимости настройки сертификатов и криптопровайдеров.

Рассмотрим алгоритм шифрования данных с помощью ZIP-архива:

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

Рассмотрим пример кода 1С для зашифровки значения:


ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку(ЗашифровываемоеЗначение);
ЗаписьТекста.Закрыть();

ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip");
ЗаписьZip = Новый ЗаписьZipФайла(ИмяФайлаАрхива, ПарольПользователя, "", МетодСжатияZip.Сжатие, УровеньСжатияZip.Оптимальный, МетодШифрованияZip.AES256);
ЗаписьZip.Добавить(ИмяВременногоФайла, РежимСохраненияПутейZIP.НеСохранятьПути);
ЗаписьZip.Записать();

ДвоичныеДанныеАрхива = Новый ДвоичныеДанные(ИмяФайлаАрхива);
РезультатBase64 = Base64Строка(ДвоичныеДанныеАрхива);

УдалитьФайлы(ИмяВременногоФайла);
УдалитьФайлы(ИмяФайлаАрхива);

Для расшифровки выполняем обратную последовательность действий:

  1. Декодируем Base64-строку в ДвоичныеДанные через Base64Значение() и сохраняем во временный ZIP-файл.
  2. Распаковываем архив с помощью ЧтениеZipФайла, передавая введенную пользователем кодовую фразу.
  3. Считываем расшифрованный текст из извлеченного файла.

Пример кода расшифровки:


ДвоичныеДанныеАрхива = Base64Значение(РезультатBase64);
ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip");
ДвоичныеДанныеАрхива.Записать(ИмяФайлаАрхива);

ПутьКаталогаРаспаковки = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ПутьКаталогаРаспаковки);

ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайлаАрхива, ПарольПользователя);
ЧтениеZip.ИзвлечьВсе(ПутьКаталогаРаспаковки, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
ЧтениеZip.Закрыть();

ИмяФайлаРезультата = НайтиФайлы(ПутьКаталогаРаспаковки, "*.*")[0].ПолноеИмя;
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаРезультата, КодировкаТекста.UTF8);
РасшифрованноеЗначение = ЧтениеТекста.ПрочитанныйТекст();
ЧтениеТекста.Закрыть();

УдалитьФайлы(ИмяФайлаАрхива);
УдалитьФайлы(ПутьКаталогаРаспаковки);

Рекомендации по безопасности при хранении зашифрованных данных

При реализации закрытого доступа к данным в 1С обратите внимание на следующие важные моменты:

  1. Хранение ключа: Пароль (кодовая фраза) ни в коем случае не должен сохраняться в реквизитах базы данных, параметрах сеанса или константах.
  2. Очистка оперативной памяти: Расшифрованные значения должны отображаться в форме только на время просмотра. При закрытии формы реквизиты должны обнуляться, а временные файлы — немедленно удаляться.
  3. Отчетность: Помните, что зашифрованные поля невозможно напрямую агрегировать в отчетах системы компоновки данных (СКД). Построение отчетов по зашифрованным полям потребует обязательного предварительного ввода пароля и расшифровки данных «на лету».
← На главную