Жёлтый аутентификатор

21.01.25

Администрирование - Пароли

Клиент одноразовых паролей на основе времени (для двухфакторной или любой другой аутентификации) на чистом 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Жёлтый аутентификатор
.cfe 31,64Kb ver:1.1.1.1
2
2 Скачать (3 SM) Купить за 2 450 руб.

Здравствуй, дорогой читатель!

Сегодня я погружу тебя в мир страшных аббревиатур: 2FA, TOTP, HOTP, HMAC, Hash, Base32, Base64, Xor, которые незаметно для нас делают нашу жизнь чуточку удобнее и безопаснее. Сразу не стоит пугаться, если всё это декомпозировать, то получается не так уж и сложно. Но обо всём по порядку.

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

Одним из таких устоявшихся решений является одноразовый код на основе времени (Time-based One-time Password Algorithm, или TOTP). Те же Госуслуги или GitHub позволяют включить двухэтапную проверку cо вторым фактором аутентификации (2ФА или 2FA) посредством кода, который будет у вас генерироваться на некотором устройстве.

Одним из приложений для генерации одноразовых паролей для двухфакторной аутентификации является бесплатный Google Authenticator (это не реклама, просто сам пользуюсь)

 

 

Как-то подумал, а почему бы не сделать аналог на 1С. И сделал вызов самому себе )

Сразу скажу, что пару лет назад уже прикрутил 2FA к своему сайту на самописной CMS на PHP - но там это было в разы проще (хотя я PHP практически не знаю), т.к. в больших языках уже существует куча разного кода под почти все требования.

Итак, TOTP - это HOTP (HMAC-Based One-Time Password Algorithm), только с применением времени. Обычно, код меняется раз в 30 секунд. А HOTP - это алгоритм генерации на основе секрета, который использует для вычисления HMAC (Hash-based Message Authentication Code), а он, в свою очередь, вычисляет код на основе Хеш-функций - это своеобразные цифровые отпечатки одинаковой длины для входных данных любого размера. Короче, там запутывание и математика, благо не пришлось (почти) реализовывать хеш-функции, т.к. они в "стандартной библиотеке" 1с уже присутствуют, но работают только на сервере.

Пришлось написать свой алгоритм HMAC на 1С - он достаточно не сложный, понятно описан на Вики.

Самое мутное, что пришлось самому реализовать - это метод ПолучитьBase32ДвоичныеДанныеИзСтроки(). В эске уже есть ПолучитьBase64ДвоичныеДанныеИзСтроки(), но 64 было много, а 32 в самый раз )

BaseN - это алгоритмы, которые переводят двоичные данные в читабельный текст, алфавит которого состоит из N символов. Плюс в том, что его можно легко передавать, а минус в том, что размер данных увеличивается (чем меньше N, тем больше размер, для base64 прирост на треть, а для base32 прирост на 60%).

Про простые вещи, типа UnixTime, преобразования между системами счисления (2, 10, 16) и простого ИсключающегоИЛИ не буду рассказывать, т.к. это всё детский кодинг.

Итого у нас получается: есть некая секретная строка, хранящаяся на сервере и у вас, на нее натравливается алгоритм, который вычисляет от неё Base32, затем берется номер 30-ти секундного интервала, начиная от первого пришествия от начала отсчета Unix-времени, на основании этого вычисляется HMAC, ну а из него уже простыми манипуляциями получаем тот самый одноразовый токен, который вы вводите в сервисе, а сервис проделывает тот же самый расчет и сравнивает ваш одноразовый пароль с тем, что он насчитал.

 

 

Когда алгоритм получения одноразового кода из секретной строки был готов, дальше стал создавать расширение, которое можно подключить к любой базе (даже пустой).

Расширение подключается без снятия галок секьюрности.

 

 

Разрабатывал на другой конфе, поэтому логотип подсистемы здесь выглядит будто бы не из этого набора )

Если нажать на ссылку в панели навигации, то откроется форма входа, на которой надо установить Мега%Длинный=Супер-Пупер#Пароль. Он будет использоваться для шифрации и дешифрации секретов разных сервисов.

 

 

Да, пришлось реализовать свой примитивный алгоритм шифрования и даже самописный легкий хеш, который работает на клиенте. МастерПароль с клиента никуда НЕ уходит и нигде НЕ хранится, его надо вводить при каждом открытии жёлтого аутентификатора. Т.к. я не криптолог, то я не советую использовать алгоритм шифрования для ваших финансов, а заюзать, например, шифрование на основе криптодвижка, встроенного в платформу. Вроде бы мой алгоритм кажется достаточно надежным. Но если кто-нить сможет математически его раскритиковать, или написать утилиту для взлома, я бы с удовольствием на это поглядел бы )

 
 Алгоритм своего примитивного хеша
 
 Алгоритм своего примитивного шифратора

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

 

 

Слева видим шкалу, которая сбрасывается раз в 30 секунд, соответственно, одноразовые коды тоже "живут" 30 секунд, пока "градусник" убывает, а потом коды протухают и генерятся новые.

Для добавления новой записи жмём соответствующую кнопку:

 

 

Секрет вводится как есть, а при записи алгоритм его пошифрует МастерПаролем и запишет в базу уже "криптостойким". Размер секрета должен быть кратен 8 и содержать только символы из base32-алфавита: английские буквы и цифры от 2 до 7 включительно.

Расширение проверялось на платформе 8.3.23, но будет работать, начиная с 8.3.10+

 
 Совместимо с существующими программами аутентификации

 

Код полностью открыт, можете использовать его в своих разработках, но со ссылкой на автора.

 

На разработку данного решения я потратил 7 вечеров (3 на алгоритм одноразового пароля, 3 на расширение, в том числе на разработку своего криптоалгоритма, и 1 на написание данной публикации).

Если вам понравилось, то не забудьте поддержать автора хотя бы плюсом (+), чтобы я дальше не ленился делать интересные вещи.

Ещё больше дичи в моём профиле или на гитхабе.

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.10.383

аутентификатор двухфакторная аутентификация 2FA TOTP HOTP HMAC Hash Base32 гугл 2ФА клиент

См. также

Пароли Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

Создал простое расширение, которое проставит галку Запомнить пароль. Должно работать на всех версиях БСП, т.к. простое.

2 стартмани

19.11.2024    328    2    slavok123    1    

1

Пароли Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Расширение добавляет возможность настроить обновление пароля пользователем через заданный промежуток времени в днях (1-99 дней). Также добавлен контроль: новый пароль не должен совпадать с предыдущим.

1 стартмани

11.11.2024    504    3    KonorArgent    0    

2

Информационная безопасность Пароли Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Простой пример формирования одноразового секрета (пароля, сообщения и т.п. информации) через указания ключа.

16.07.2024    942    maksa2005    0    

1

Инструменты администратора БД Пароли Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

13.06.2024    1031    16    alexey.kutya    2    

3

Пароли Системный администратор Платформа 1С v8.3 Бесплатно (free)

В очередной раз пришлось поменять пароль пользователя sa в базе данных MS SQL, и поскольку эту процедуру приходится делать нечасто, решил записать последовательность действий для памяти. Коротко. Июнь 2024 г.

03.06.2024    6351    2ncom    9    

15

Информационная безопасность Пароли Платформа 1С v8.3 Бесплатно (free)

Все еще храните пароли в базе? Тогда мы идем к вам! Безопасное и надежное хранение секретов. JWT авторизация. Удобный интерфейс. Демо конфигурация. Бесплатно.

30.05.2024    7044    kamisov    18    

61

Пароли Системный администратор Платформа 1С v8.3 1C:Бухгалтерия Россия Абонемент ($m)

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

1 стартмани

15.05.2024    792    2    Лев    1    

1

Инструменты администратора БД Роли и права Пароли Системный администратор Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Обработка предназначена для переноса пользователей между разными базами 1С. Позволяет выгрузить выбранных (или всех) пользователей базы-источника со всеми настройками, включая разделение данных, в файл. И с помощью этой же обработки загрузить выгруженных пользователей из файла в базу-приёмник. Может быть полезна тем, кто хочет перенести пользователей между базами, у которых включено разделение данных.

1 стартмани

02.05.2024    772    7    METAL    2    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bayselonarrend 2385 21.01.25 14:28 Сейчас в теме
Прикольно, но шмяк шифрование есть в БСП
2. SerVer1C 862 21.01.25 15:00 Сейчас в теме
(1) И это хорошо, что там есть, но расширение независимо от БСП.
dsdred; bayselonarrend; +2 Ответить
3. ZhokhovM 761 21.01.25 19:39 Сейчас в теме
В эске вообще то нет "ПолучитьBase64ДвоичныеДанныеИзСтроки".
4. SerVer1C 862 21.01.25 23:27 Сейчас в теме
(3) Напрямую нет, а через ПолучитьBase64ДвоичныеДанныеИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки()) есть )
ZhokhovM; +1 Ответить
Оставьте свое сообщение