Разберем задачу, когда требуется ограничить доступ к конфиденциальным данным (например, суммам или численным значениям в табличной части документа) таким образом, чтобы просмотреть их мог только обладатель секретной кодовой фразы (пароля). При этом данные не должны быть доступны ни администраторам базы, ни разработчикам в явном виде.
Рассмотрим пошагово, как устроен алгоритм побитового шифрования, с какими подводными камнями можно столкнуться при его реализации в 1С и какие штатные механизмы платформы помогают решить эту задачу наиболее надежно.
Для реализации простого симметричного шифрования часто применяется логическая операция «Исключающее ИЛИ» (XOR). Главная особенность этого метода заключается в том, что повторное применение операции XOR с тем же самым ключом восстанавливает исходный текст.
Проанализируем принцип работы алгоритма на примере двоичных кодов отдельных символов:
Рассмотрим пример шифрования символа. Пусть исходный символ — R (двоичный код 01010010), а ключ — символ D (двоичный код 01000100):
Побитовая операция XOR:
01010010 (буква R)
01000100 (ключ D)
Результат: 00010110 (зашифрованный символ)
Для расшифровки выполняем аналогичное действие над шифротекстом и ключом D:
00010110 (зашифрованный символ)
01000100 (ключ D)
Результат: 01010010 (исходный символ R)
При попытке реализовать алгоритм XOR над обычными строками средствами 1С возникает критическая ошибка. Если символ исходной строки совпадает с соответствующим символом ключа, их XOR-преобразование дает нулевой байт — символ с кодом 0 (Символ(0)).
Критически важно: платформа 1С при обработке строковых типов воспринимает Символ(0) как маркер конца строки. В результате зашифрованное значение обрезается на первом же совпавшем символе, а последующая расшифровка полностью портите данные.
Чтобы избежать этой проблемы, шифрование следует выполнять не над строками, а над объектом ДвоичныеДанные, с последующим кодированием результата в формат Base64 через функцию Base64Строка().
Чтобы не изобретать велосипед и избежать проблем с представлением символов, разберем штатный и надежный способ шифрования по паролю с помощью встроенного в 1С объекта ЗаписьZipФайла.
Объекты работы с ZIP-архивами в 1С поддерживают стойкое шифрование по алгоритму AES-256 без необходимости настройки сертификатов и криптопровайдеров.
Рассмотрим алгоритм шифрования данных с помощью ZIP-архива:
ЗаписьZipФайла, устанавливая переданную пользователем кодовую фразу в качестве пароля и выбирая шифрование AES-256.ДвоичныеДанные.Base64Строка() для безопасного хранения в реквизите базы данных.Рассмотрим пример кода 1С для зашифровки значения:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку(ЗашифровываемоеЗначение);
ЗаписьТекста.Закрыть();
ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip");
ЗаписьZip = Новый ЗаписьZipФайла(ИмяФайлаАрхива, ПарольПользователя, "", МетодСжатияZip.Сжатие, УровеньСжатияZip.Оптимальный, МетодШифрованияZip.AES256);
ЗаписьZip.Добавить(ИмяВременногоФайла, РежимСохраненияПутейZIP.НеСохранятьПути);
ЗаписьZip.Записать();
ДвоичныеДанныеАрхива = Новый ДвоичныеДанные(ИмяФайлаАрхива);
РезультатBase64 = Base64Строка(ДвоичныеДанныеАрхива);
УдалитьФайлы(ИмяВременногоФайла);
УдалитьФайлы(ИмяФайлаАрхива);
Для расшифровки выполняем обратную последовательность действий:
ДвоичныеДанные через Base64Значение() и сохраняем во временный ZIP-файл.ЧтениеZipФайла, передавая введенную пользователем кодовую фразу.Пример кода расшифровки:
ДвоичныеДанныеАрхива = Base64Значение(РезультатBase64);
ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip");
ДвоичныеДанныеАрхива.Записать(ИмяФайлаАрхива);
ПутьКаталогаРаспаковки = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ПутьКаталогаРаспаковки);
ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайлаАрхива, ПарольПользователя);
ЧтениеZip.ИзвлечьВсе(ПутьКаталогаРаспаковки, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
ЧтениеZip.Закрыть();
ИмяФайлаРезультата = НайтиФайлы(ПутьКаталогаРаспаковки, "*.*")[0].ПолноеИмя;
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаРезультата, КодировкаТекста.UTF8);
РасшифрованноеЗначение = ЧтениеТекста.ПрочитанныйТекст();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИмяФайлаАрхива);
УдалитьФайлы(ПутьКаталогаРаспаковки);
При реализации закрытого доступа к данным в 1С обратите внимание на следующие важные моменты: