Рано или поздно перед разработчиком встает задача дополнительной защиты учетных записей пользователей (особенно для веб-клиентов или баз, смотрящих наружу). Стандартный подход с отправкой SMS требует постоянных затрат на шлюзы, а отправка кодов на Email не всегда оперативна. Самый надежный и бесплатный мировой стандарт — TOTP (Time-Based One-Time Password), используемый в Google Authenticator.
В данной публикации представлено полностью автономное, безопасное и кроссплатформенное решение, написанное целиком на встроенном языке 1С. Оно не зависит от операционной системы сервера, не выполняет вызовы командной строки ОС и не отправляет секретные ключи на внешние веб-сайты для генерации QR-кодов. Все вычисления происходят прямо в памяти 1С.
Как это устроено: Основные вехи алгоритма
Реализация алгоритма внутри прикрепленной обработки разбита на три логических шага:
-
Криптостойкая генерация ключей: Создание случайных секретов в формате Base32 средствами встроенного
ГенератораСлучайныхЧиселплатформы и эффективной побитовой логики (без использования тяжелых строковых манипуляций). -
Чистый расчет HMAC-SHA1: Математический расчет хэша на встроенном языке 1С. Для преобразования хэш-строк в байты задействованы объекты
ПотокВПамятииЗаписьДанных, а сама логика HMAC построена на платформенных функцияхПобитовоеИ(),ПобитовоеИЛИ()иПобитовоеИсключительноеИЛИ(). -
Защита от рассинхронизации (Дрейф времени): Мобильный телефон пользователя и сервер 1С могут иметь небольшое расхождение в часах. Метод проверки в обработке учитывает временной дрейф и валидирует не только текущий 30-секундный интервал, но и соседние ($\pm 30$ секунд), сводя ложные отказы к нулю.
-
Стабильная генерация QR-кода: Метод интеграции со стандартной компонентой 1С
QRCodeExtension(из макетов БСП) переписан под безопасный вызов функцииGenerateQRCode(...). Это полностью решает проблему критических вылетов сеанса 1С (APPCRASH), которые часто происходят при попытке напрямую установить свойстваШиринаилиУровеньКоррекцииОшибоку NativeAPI-компонент.
Архитектура интеграции в вашу систему
В прикрепленном файле обработки вы найдете готовые экспортные функции, которые можно перенести в любой общий модуль. Интеграция в логику конфигурации выглядит следующим образом:
-
При привязке 2FA в профиле: Вызывается функция генерации ключа Base32, результат сохраняется в карточке пользователя (например, в скрытом реквизите справочника Пользователи). На основании этого ключа генерируется табличный документ с QR-кодом для сканирования смартфоном.
-
При авторизации в системе: После ввода основного пароля пользователю показывается дополнительное поле для 6 цифр из приложения. Введенный код передается в функцию валидации вместе с сохраненным секретом из базы данных. Если функция возвращает
Истина— сессия открывается.
Полный программный код со всеми вспомогательными математическими функциями кодирования, потоковой работы с бинарными данными и безопасного вызова внешней компоненты подробно закомментирован и доступен для скачивания в составе внешней обработки.
Инструкция по внедрению 2FA (TOTP) в систему
1. Подготовка
Перенесите функции из обработки в отдельный серверный модуль (например, БезопасностьСервер). Убедитесь, что модуль имеет флаг «Сервер» и «ВызовСервера».
2. Хранение секретов
В справочник Пользователи (или ПользователиИнформационнойБазы) добавьте строковый реквизит СекретTOTP (длина 32-64 символа).
Важно: Данные в этом реквизите должны быть доступны только для чтения администраторам или самому пользователю.
3. Настройка профиля пользователя
Создайте форму, в которой пользователь может включить 2FA:
-
Вызовите функцию
СгенерироватьСекретныйКлючBase32(). -
Сохраните результат в реквизит
СекретTOTPпользователя. -
Сгенерируйте QR-код через
ПолучитьQRКодДляАутентификатора(...)и выведите его на форму в поле «Табличный документ».
4. Интеграция в процесс авторизации
После успешной проверки основного пароля 1С, добавьте проверку кода:
Фрагмент кода
// Проверка кода второго фактора при входе
// Параметры:
// СекретTOTP - Строка
// ВведенныйКод - Строка
// Возврат: Булево
Функция ПроверитьКодДоступа(СекретTOTP, ВведенныйКод) Экспорт
Если БезопасностьСервер.ПроверитьКод2FA(Секрет, ВведенныйКод) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Требования к среде
-
Платформа: 1С:Предприятие 8.3 8.3.11.2867 и выше (с поддержкой встроенных побитовых операций). Кроссплатформенно (исправно работает на Windows- и Linux-серверах).
-
Компонента: Внутри обработки уже присутствует двоичный макет
КомпонентаПечатиQRКодасо стандартной библиотекой печати штрихкодов от 1С.
Вступайте в нашу телеграмм-группу Инфостарт