В процессе разработки часто возникает задача защиты конфиденциальной информации в базе данных. Это могут быть пароли пользователей, секретные ключи API, данные платежных карт или, как в нашем случае, промокоды. Основная сложность заключается в том, чтобы найти баланс между надежностью алгоритма и удобством его реализации в среде 1С, особенно если мы хотим избежать зависимости от внешних онлайн-сервисов.
Разберем основные подходы к реализации симметричного шифрования и альтернативных методов защиты данных, которые доступны разработчику 1С "из коробки" или с минимальными доработками.
Прежде чем приступать к шифрованию, проанализируем ситуацию: нужно ли нам когда-либо восстанавливать исходный текст промокода из зашифрованного? Если задача стоит только в проверке того, что введенный пользователем код совпадает с тем, что хранится в базе, то шифрование не требуется. В этом случае правильнее и безопаснее использовать хеширование.
Хеш-функция преобразует строку в уникальный набор символов фиксированной длины. Особенность в том, что восстановить исходную строку из хеша практически невозможно. Рассмотрим, как это реализовать с помощью встроенного объекта ХешированиеДанных.
Для повышения безопасности рекомендуется использовать "соль" — секретную строку, которая добавляется к промокоду перед хешированием. Это защитит базу от подбора кодов по таблицам соответствия (радужным таблицам).
// Пример хеширования промокода с солью
Функция ПолучитьХешПромокода(Знач Промокод) Экспорт
Соль = "СекретныйКлюч_2024_@!#";
Хеширование = Новый ХешированиеДанных(АлгоритмХеширования.SHA256);
Хеширование.Добавить(Соль + Промокод);
Возврат НРег(СтрЗаменить(Строка(Хеширование.ХешСумма), " ", ""));
КонецФункции
Проанализируем этот подход: при хранении хеша в базе данных даже при полной утечке информации злоумышленник не сможет узнать сами промокоды. При проверке кода, введенного клиентом, мы просто вычисляем хеш от введенной строки с той же "солью" и сравниваем результат с данными в базе.
Если же нам действительно необходимо симметричное шифрование (когда 1С должна уметь расшифровать данные, чтобы передать их на сайт или другое приложение), воспользуемся объектом МенеджерКриптографии. Этот объект работает с установленными в операционной системе криптопровайдерами (CSP), такими как Microsoft Enhanced Cryptographic Provider или КриптоПро.
Рассмотрим пример того, как подготовить менеджер для работы:
// Инициализация менеджера криптографии
Менеджер = Новый МенеджерКриптографии("", "", 1); // Использование стандартного провайдера
Менеджер.АлгоритмЗашифрования = "AES-256"; // Если поддерживается провайдером
Важное замечание: Платформенный МенеджерКриптографии в основном ориентирован на работу с сертификатами и асимметричное шифрование. Для реализации классического симметричного алгоритма "по ключу" (паролю) без использования сертификатов в чистой платформе 1С стандартных методов может быть недостаточно. В этом случае мы переходим к следующим вариантам.
Если ваш сервер 1С работает под управлением ОС Windows, мы можем задействовать мощную библиотеку System.Security.Cryptography из состава .NET Framework. Это позволит использовать полноценный алгоритм AES (Rijndael) с заданным ключом и вектором инициализации (IV).
Разберем по шагам алгоритм взаимодействия:
// Упрощенная логика вызова через COM
КриптоАлгоритм = Новый COMОбъект("System.Security.Cryptography.RijndaelManaged");
// Настройка параметров ключа и режима шифрования...
// Далее выполняется трансформация данных
Этот метод считается одним из самых надежных, так как использует индустриальные стандарты шифрования, которые легко реализовать на стороне сайта (на PHP, Python или Node.js), обеспечив полную совместимость алгоритмов.
Выясним, где хранить сами ключи шифрования. В платформе 1С предусмотрен специальный механизм — Безопасное хранилище данных. Оно предназначено для хранения конфиденциальной информации (паролей, токенов) в защищенном виде, к которому нет прямого доступа через консоль запросов или просмотр таблиц базы данных.
Посмотрим, как записать и прочитать ключ шифрования:
// Запись ключа в безопасное хранилище
БезопасноеХранилищеДанных.Записать("КлючШифрованияПромокодов", "МойСуперСекретныйПароль123");
// Чтение ключа (доступно только в привилегированном коде)
Ключ = БезопасноеХранилищеДанных.Прочитать("КлючШифрованияПромокодов");
Однако помните, что безопасное хранилище не предназначено для хранения самих промокодов в большом количестве. Оптимальная схема: храним общий секретный ключ в безопасном хранилище, а зашифрованные этим ключом промокоды — в обычном регистре сведений.
Проанализируем ситуацию, когда требования к безопасности не слишком высоки (например, защита от случайного просмотра данных сотрудниками). В этом случае можно реализовать простейший алгоритм исключающего ИЛИ (XOR). Это полностью автономный способ, работающий на любой версии платформы и любой ОС.
Начиная с версии 8.3.10, в 1С появились побитовые операции, что значительно упрощает задачу.
// Простейший пример XOR-преобразования
Функция XORПреобразование(СтрокаДанных, Ключ)
Результат = "";
Для и = 1 По СтрДлина(СтрокаДанных) Цикл
КодСимвола = КодСимвола(СтрокаДанных, и);
КодКлюча = КодСимвола(Ключ, (и-1) % СтрДлина(Ключ) + 1);
НовыйКод = ПобитовоеИсключительноеИли(КодСимвола, КодКлюча);
Результат = Результат + Символ(НовыйКод);
КонецЦикла;
Возврат Результат;
КонецФункции
Внимание: Данный метод не является криптостойким. Он лишь скрывает текст от человеческого глаза. Если безопасность критична, используйте методы с применением алгоритма AES.
Для высокопроизводительного и стойкого шифрования (особенно в Linux-среде) рекомендуется использовать внешние компоненты. Существует множество готовых бесплатных разработок, реализующих OpenSSL-совместимое шифрование. Преимущество в том, что компонента подключается одной строкой УстановитьВнешнююКомпоненту() и предоставляет методы для шифрования строк и файлов прямо в оперативной памяти.
Подведем итоги нашего исследования:
ХешированиеДанных (SHA-256) с добавлением секретной "соли".Выбор конкретного метода зависит от архитектуры вашей системы и квалификации смежных специалистов, но для большинства задач по защите промокодов связки "Хеширование + Безопасное хранилище" оказывается более чем достаточно.