Двухфакторная аутентификация в 1С

16.02.16

Разработка - Защита ПО и шифрование

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Двухфакторная аутентификация.epf
.epf 13,73Kb
152
152 Скачать (1 SM) Купить за 1 850 руб.
БСП Демо
.dt 74,13Mb
80
80 Скачать (1 SM) Купить за 1 850 руб.

На днях переводил свои аккаунты на двухфакторную авторизацию, решил использовать авторизацию через одноразовый пароль, генерируемый приложением,   авторизацию по SMS  оставил на крайний случай, не хотелось зависеть от оператора связи. Полистал интернет,  а тема-то, оказывается, в полном разгаре: практически все сервисы используют 2ФА. 

Вот неполный перечень ресурсов с 2ФА  https://twofactorauth.org/.

Идея очень неплохая, когда к первому фактору "Знание" (знание пароля), добавляется еще один фактор "Владение": владение телефоном, приложением, генерирующим одноразовые пароли, специальным аппаратным токеном, генерирующим пароли, и т.д.

Посмотрел, как обстоят дела в 1С , честно поискал и  не нашел. Решил исправить этот недочет. 

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

Основные функции, которые потребовались:

Функция HMAC( Знач Ключ, Сообщение ) Экспорт
Функция ПолучитьТОТП ( Ключ, ДлинаПароля ) Экспорт

HMAC (сокращение от англ. hash-based message authentication code, код аутентификации (проверки подлинности) сообщений, использующий хеш-функции)— в информатике (криптографии), один из механизмов проверки целостности информации, позволяющий гарантировать то, что данные, передаваемые или хранящиеся в ненадёжной среде, не были изменены посторонними лицами (см. человек посередине). Механизм HMAC использует MAC, описан в RFC 2104, в стандартах организаций ANSI, IETF, ISO и NIST. MAC — стандарт, описывающий способ обмена данными и способ проверки целостности передаваемых данных с использованием секретного ключа. Два клиента, использующие MAC, как правило, разделяют общий секретный ключ. MAC — надстройка над MAC; механизм обмена данными с использованием секретного ключа (как в MAC) и хеш-функций. В зависимости от используемой хеш-функции выделяют HMAC-MD5, HMAC-SHA1, HMAC-RIPEMD128,

TOTP (Time-based One Time Password Algorithm, RFC 6238.) — OATH-алгоритм создания одноразовых паролей для защищенной аутентификации, являющийся улучшением HOTP (HMAC-Based One-Time Password Algorithm). Является алгоритмом односторонней аутентификации — сервер удостоверяется в подлинности клиента. Главное отличие TOTP от HOTP это генерация пароля на основе времени, то есть время является параметром. При этом обычно используется не точное указание времени, а текущий интервал с установленными заранее границами (например, 30 секунд).

Кодирование и декодирование строк  в Base32 (base64 есть в 1С, но она не подходит)

Функция СтрокаВСтроку32( знач вхСтрока ) Экспорт
Функция Строка32ВСтроку( Знач вхСтрока ) Экспорт

Для битовых операций использовал часть отсюда //infostart.ru/public/99739/, часть дописал.

Все в одной  обработке, с  подключением к конфигурации не заморачивался, тут уже смотрите по месту. Принцип внедрения такой:  в справочнике  Пользователи добавляется реквизит Ключ, тип строка, и пара команд. Защита ревизита Ключ ролями, дополнительным шифрованием - это уже на совести (паранойе) разработчика. Одной командой вызывается форма генерации Секретного ключа,  второй очищается. На обработку в составе конфигурации тоже раздать права,  например, в роль БазовыеПрава. 

&НаКлиенте
Процедура ОтключитьДвухфакторнуюАвторизацию(Команда)
	Объект.Ключ = "";
КонецПроцедуры

&НаКлиенте
Процедура ПодключитьДвухФакторнуюАвторизацию(Команда)

    ОткрытьФорму("Обработка.ДвухфакторнаяАутентификация.Форма.ФормаСоздания",,,,,,
	Новый ОписаниеОповещения("ОбработкаКомандыЗавершения2ФАвторизации", ЭтаФорма ),
	РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс );

КонецПроцедуры
&НаКлиенте
Процедура ОбработкаКомандыЗавершения2ФАвторизации( Результат, ДополнительныеПараметры ) Экспорт
	Если ЗначениеЗаполнено(Результат) тогда
		Объект.Ключ =Результат;
	КонецЕсли;	
КонецПроцедуры

Далее например ПриНачалеРаботыСистемы или в ОбщегоНазначенияКлиентПереопределяемые.ПриНачалеРаботыСистемы 

Вызов формы проверки, если Ключ на пользователе пустой, то 2ФА по нему не включена, иначе ждем ввода одноразового пароля. Сразу проговорю, это все только демонстрация, как лучше это подойдет к конкретной конфе, смотрите по месту, с этой целью сделал демо на демоконфигурации БСП 2.3.2.45.

Процедура ПриНачалеРаботыСистемы()
	
	// СтандартныеПодсистемы
	СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы();
	// Конец СтандартныеПодсистемы
	
	ОткрытьФорму("Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки",,,,,,	,
		РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс );
	

КонецПроцедуры

БСП 2.3.2.45 ,  отчасти  выбрал, т.к. там уже есть поддержка QRкода. Можно, конечно, без считывания обойтись,  но в смартфон вводить достаточно длинный ключ немного утомительно.

Теперь как передать секретный ключ,  вы  уже поняли, нужно отсканировать в одном из приложений генераторов паролей на андроиде или ios. Приложений полно, Google Authenticator,  Яндекс.Ключ,  FreeOTP Authenticator. В последнем, кстати, масса настроек и есть возможность сменить, например, функцию хеширования базового алгоритма  с SHA1 на другую (обработку тоже придется подправить в паре строк).  Как только приложение начнет возвращать одноразовые пароли, его нужно подтвердить в форме, и если он будет принят, записать элемент справочника. Время на сервере и устройстве с генератором паролей должно быть синхронизировано! Можно слегка ослабить алгоритм и проверять пароль от прошлого, текущего раунда генерации, или просто увеличить период раунда с 30 секунд по умолчанию. 

Скажете, не у всех бухгалтеров и менеджеров смартфоны и айфоны? Пожалуйста, есть и для старых телефонов (гугл в помощь что-то вроде GoogleAuthenticatorJ2ME_1.2.0.jar и есть в виде аппартных токенов  типа https://ru.wikipedia.org/wiki/SecurID.

Все основано на https://ru.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

Опишу подробнее порядок работы. (Тем кто включал 2ФА в почтовых и других аккаунтах можно не читать.)

1. Создание

1.1. Включаем Двухфакторную на пользователе командой 1С.

Генерируем  секретный ключ.

Создание секретного ключа  

1.2. Устанавливаем на телефон одно из приложений Google Authenticator,  FreeOTP Authenticator итп

запускаем его  и сканируем приложением штрихкод, или вводим секретный ключ  вручную.

Приложение начинает генерировать одноразовые пароли именно для вашего ключа.

 Генератор создает одноразовые пароли по вашему ключу а если вы занесли ключ в брелок то увидите чтото вроде Брелок создает одноразовые пароли

Если вы верно введете пароль в форму 1.1 то форма закроется осталось только сохранить элемент справочника Пользователи.

Время на устройстве и 1С желательно синхронизировать.

Все .

2. Вы входите в 1С пользователем с настроеной и подключеной 2ФА, после обычной авторизации появиться окно дополнительной.

окно для ввода одноразового пароля при 2ФА

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

Двухфакторная аутентификация

См. также

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

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

1 стартмани

09.02.2023    2725    11    aximo    5    

2

Защита ПО и шифрование Программист Абонемент ($m)

Для установки защиты pdf документа, полученного в 1С, написано консольное приложение на c#., использующее одну зависимость pdfSharp.dll. В результате работы приложения ограничены операции над документом и записаны метаданные. С помощью аргументов командной строки можно управлять работой приложения.

2 стартмани

30.01.2023    2143    2    olevlasam    3    

3

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Универсальный синтаксический анализатор ASN.1, который может декодировать любую допустимую структуру ASN.1 DER или BER, независимо от того, закодирована ли она в кодировке Base64 (распознаются необработанные base64, защита PEM и begin-base64) или в шестнадцатеричном кодировании.

1 стартмани

04.12.2022    3584    16    keyn5565`    0    

14

Защита ПО и шифрование Программист Платформа 1С v8.3 Абонемент ($m)

Демонстрация возможностей шифрования строки на основе мастер-пароля в 1С Предприятие 8.3.19. AES без zip файла, RSA, PKDF2. (c использованием библиотеки С# через com).

2 стартмани

31.08.2022    4470    9    vit59    2    

6

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка, позволяющая запутывать и шифровать байт-код, поставлять модули без исходных текстов и т.д. Работает только в файловом варианте с версии платформы 8.3.22.1368 из-за конструктора ГенераторСлучайныхЧисел, поскольку алгоритм был изменён.

10 стартмани

16.06.2022    12756    106    ZhokhovM    12    

45

Защита ПО и шифрование Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Как уберечь конструкторскую документацию от воровства конкурентами? Недавно столкнулся с этой проблемой. Заказчик серьёзно обеспокоен утечкой информации о конструкторских разработках в адрес конкурентов, за счет подкупа исполнителей, занимающихся производством по конструкторской документации, операторов технологического оборудования и обрабатывающих центров по изготовлению деталей и сборочных единиц.

2 стартмани

09.03.2022    6145    3    ge_ni    9    

2

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Система построена на веб платформе, все управление происходит на сайте в личном кабинете пользователя.

1 стартмани

27.12.2021    5107    2    idm80    12    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. tkv44 17.02.16 09:59 Сейчас в теме
Интересная тема. Спасибо автору за исследование.
В 1С нет подобного, т.к. отсутствует необходимость. Двухфакторная аутентификация нужна там, где проходной двор. А бухгалтеры обычно сидят во внутренней ЛВС, в отдельном кабинете с усиленной дверью (ибо касса тоже рядом). Внедрив подобное, можно заработать много очков в минус карме от тех же бухгалтеров, кому нужен лишний геморрой при входе в программу.
2. Zhilyakovdr 147 17.02.16 10:39 Сейчас в теме
(1) tkv44, Тема действительно интересная, а применять двухфакторную аутентификацию можно например при работе через веб клиент и предоставлении доступа сторонним лицам.
YADeM; adhocprog; +2 Ответить
3. Юрий-К 113 18.02.16 07:30 Сейчас в теме
(1) tkv44, (2) Zhilyakovdr,
Спасибо за оценку, на выходных, возможно, в конце статьи размещу пару-тройку скриншотов , чтобы прояснить как заводить секретный ключ в телефон( один человек подсказал),
сильно подозреваю, что тем кто не пробовал двухфакторную аутентификацию через приложение тяжело понять с ходу преимущества.
Меня это "очень сильное колдунство" просто заворожило )).
А вообще вы правы для веб интерфейса это самое то. Если открыт доступ снаружи без дополнительных мер защиты. Защита паролем слаба, угонят пароль на раз, особенно если заходят из "опасных" мест. Также очевидно, что можно использовать этот принцип не на начальной авторизации, а уже внутри программы для доступа например к проведению определенных документов итд.
Вообще функцией HMAC( Знач Ключ, Сообщение ) как раз таки и можно формировать подписи любых данных тк это "..один из механизмов проверки целостности информации, позволяющий гарантировать то, что данные, передаваемые или хранящиеся в ненадёжной среде, не были изменены посторонними лицами..." она же выполняет отчасти некоторое исправление против слабых(коротких) ключей и слабых(коротких) сообщений. Хотя для этих целей в 1С есть более продвинутый объект МенеджерКриптографии.
4. Craig 275 18.02.16 14:17 Сейчас в теме
(0) тема интересная (в декабре была подобная задачка, пока ее временно отложил), опишите пожалуйста как выглядит процесс. Вот пользователь подошел к компьютеру, включил компьютер, ввел пароль от windows, дальше запускает 1с и что происходит далее? так же интересует вопрос возможно ли навесить определенное ограничение на доступ? К примеру, у пользователя нет прав на проведение документа, а тут пришел админ с волшебной флешкой и провел документ через рабочее место пользователя.
5. I_G_O_R 69 23.03.16 21:34 Сейчас в теме
Я правильно понимаю, что когда открывается форма "Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки" пользователь фактически залогинен и ему осталось закрыть это окно, чтобы можно было продолжить работать?
6. Юрий-К 113 28.03.16 07:05 Сейчас в теме
(5) I_G_O_R,
Если он его закроет закроется 1С. Он должен либо ввести корректный одноразовый пароль который все время меняется либо не зайдет.
7. I_G_O_R 69 29.03.16 01:47 Сейчас в теме
(6) Форму можно закрыть без последствий, или даже вообще не открывать, в браузере можно выполнить свой javascript, ну или подменить javascript. Для взломщика это не будет проблемой, значит толку от такой защиты нет совсем. Чтобы защита реально работала, нужно использовать РЛС в зависимости от параметра сеанса, а значение параметра сеанса должно зависеть от ввода кода.
8. Юрий-К 113 04.04.16 08:46 Сейчас в теме
(7) I_G_O_R,
Во первых здесь рассматривается механизм работы с одноразовыми паролями, связка 1С - генераторы паролей. как вы в дальнейшем это используете ограничено только вашей фантазией.
можете даже
...использовать РЛС в зависимости от параметра сеанса, а значение параметра сеанса должно зависеть от ввода кода


во вторых Вы сможете обойти примитивнейшее?
ОткрытьФорму("Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки",,,,,,    ,        РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс ); 

и событие
&НаКлиенте
Процедура ПриЗакрытии()
	Если не АвторизацияПройдена тогда
		ЗавершитьРаботуСистемы (Ложь);
	КонецЕсли;
КонецПроцедуры
? Самому интересно посмотреть, про SSL не забудьте. )).

и еще напомню это вторая часть авторизации первую стандартную никто не отменял.
9. утюгчеловек 40 29.04.16 10:35 Сейчас в теме
(8)

во вторых Вы сможете обойти примитивнейшее? ...


Разумеется. Не трогаем форму 2ФА, жмем F1 - открываем справку. Жмем "перейти по ссылке", набираем что-то типа "e1cib/list/Справочник.Справочник1". Работаем со справочником.
Взял отсюда: http://forum.infostart.ru/forum87/topic150805/.

Это говорит только о том, что решение должно быть чуточку сложнее. Но в целом - мне лично понравилось. Жму звезду.
10. Юрий-К 113 17.05.16 08:20 Сейчас в теме
(9) утюгчеловек,
Это говорит только о том, что решение должно быть чуточку сложнее. Но в целом - мне лично понравилось. Жму звезду.


это говорит что у меня и у 1С разные понимания ключа
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
, думаю что рано или поздно 1С исправит этот недочет.
За звезду спасибо!

26. user1350020 19 14.10.24 09:29 Сейчас в теме
(9) Как-нибудь обход через горячие клавиши удалось побороть?
11. grandexpert 26 21.02.17 15:54 Сейчас в теме
Добрый день. Приобрел обработку, дт-шник, лайкнул... но что-то не получается ввести правильный код.

Порядок действий сделал такой:
1. Открыл под Админом в базе обработку. Создал секретный ключ.
2. Скачал Google Authenticator. Сканировал им QR код из обработки.
3. Ввожу пароль из приложения в 1С. Ругается что неверный пароль.
4. Время одинаковое между компом и телефоном. По крайней мере по минутам точно.

В чем может быть причина?
12. Юрий-К 113 02.03.17 12:58 Сейчас в теме
(11) Добрый день,
1. Чтобы не было вопросов к синхронизации времени поставьте на смартфоне "синхронизировать время по сети",
"использовать 24-часовой формат" , и "использовать часовой пояс сети" , тоже самое на ПК. и попробуйте снова создать 2фа.

2. Используйте на смартфоне генератор паролей Freeotp
https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp

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

и пишите в ЛС.
13. gonyav 24 27.10.17 09:38 Сейчас в теме
Функция МассивВДвоичныеДанные без COM для 8.3.6 и выше:

Функция МассивВДвоичныеДанные( КлючМассив ) Экспорт
    ИмяФайла = ПолучитьИмяВременногоФайла( "bak" );
    МассивКоличество = КлючМассив.Количество()-1;
    Запись = Новый ЗаписьДанных(ИмяФайла);
    
    Для Индекс=0 По МассивКоличество  Цикл
        Запись.ЗаписатьБайт(КлючМассив[Индекс]);
    КонецЦикла;
    Запись.Закрыть();
    ДвДанные = Новый ДвоичныеДанные ( ИмяФайла );
    УдалитьФайлы( ИмяФайла);
    Возврат ДвДанные;    
КонецФункции
Показать
15. Юрий-К 113 28.10.17 11:04 Сейчас в теме
(13) Да, спасибо, давно делал, кажется в момент публикации эти объекты уже появились, переделывать было некогда, будет время обновлю обязательно!
24. VitaliyCeban 466 25.01.22 16:18 Сейчас в теме
(13) Функция без временных файлов, для 8.3.9 и новее:
Функция МассивВДвоичныеДанные(КлючМассив)
	
	Поток = Новый ПотокВПамяти;
	Запись = Новый ЗаписьДанных(Поток);
	Для Каждого Элемент Из КлючМассив Цикл
		Запись.ЗаписатьБайт(Элемент);
	КонецЦикла;
	Запись.Закрыть();
	Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
	Возврат Данные;  
	
КонецФункции
Показать
14. gonyav 24 27.10.17 10:06 Сейчас в теме
Генерация QR-кода на сервере linux без БСП:

&НаСервере

Процедура СоздатьQRКодНаСервере()
    ВремФайл = ПолучитьИмяВременногоФайла("png");    
// apt-get install qrencode
    СтрокаВыполнения = "qrencode -o " + ВремФайл + " -t PNG ""otpauth://totp/" + НРег(Транслитерация(Объект.Наименование)) + "@domain.ru?secret=" + Объект.СекретныйКлюч + """";
    ЗапуститьПриложение( СтрокаВыполнения,, Истина);    
    КартинкаСервер = Новый Картинка(ВремФайл);
    АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(КартинкаСервер, Новый УникальныйИдентификатор);    
    Картинка = АдресВоВременномХранилище; //qr-код на форме
    УдалитьФайлы(ВремФайл);
КонецПроцедуры
Показать
16. elephant_x 145 20.09.19 13:57 Сейчас в теме
Подскажите пожалуйста как сделать что бы пароль был 4-х значный и интервал на вводне 30 секунд, а например 60.

Что-то не пойму.
17. Юрий-К 113 22.09.19 18:50 Сейчас в теме
(16) все в коде есть, смотрите внимательней. Какой одноразовый пароль на мобильном устройстве создает генератор оп? в 1С под него подстраивайтесь.
21. StainDN 39 09.08.21 15:15 Сейчас в теме
(17) У меня тоже проблема и изменением интервала. В коде нашел, но когда меняю, то коды на телефоне и в 1с перестают совпадать.
18. newtraveller 24 27.01.20 11:15 Сейчас в теме
Использовал код обработки. В процессе внедрения нашел и подправил один баг: Раунд определялся не совсем корректно из текущего времени, из за этого через раз проходила аутентификация. Подправил в коде определение текущего раунда: Вместо
...Окр((Дата(... 

поставил
 ...Цел((Дата(...

после этого аутентификация стабильно заработала, было много тестов с точностью до секунд.
dammit666; user620967_5a1711; le0nard; cefey-kurgan; +4 Ответить
19. klokov 27.03.20 12:16 Сейчас в теме
Здравствуйте. Мы используем ваш механизм.Подскажите, можно ли в вашем механизме обойтись без COM (Функция МассивВДвоичныеДанные) ? Дело в том что мы хотим перевести сервер приложений на Linux.
20. klokov 27.03.20 12:18 Сейчас в теме
Извините увидел ответ на свой вопрос в обсуждении
22. StormPilgrim 9 09.12.21 11:16 Сейчас в теме
Добрый день!

Не рассматривали ли вы, вариант доработки вашего решения, до актуальных методов, которые реализовала 1С в своих более свежих релизах платформы? Насколько комфортно можно переложить ваш вариант на вариант реализации функционала платформы? Вот к примеру нашел анонс добавления двухфакторной аутентификации, уже на стороне самой платформы: https://wonderland.v8.1c.ru/blog/dvukhfaktornaya-autentifikatsiya/
23. VitaliyCeban 466 25.01.22 15:36 Сейчас в теме
Обработка выдает корректный TOTP только первые 15 секунд периода, из за ошибки в алгоритме расчета.
Для исправления следует в методе ПроверитьОдноразовыйПароль, в строке
РазницаВРаундах = Окр( РазницаВСекундах / 30  ) ;

заменить Окр на Цел.
user620967_5a1711; +1 Ответить
25. user1826702 29.01.24 14:22 Сейчас в теме
ОткрытьФорму("Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки",,,,,, ,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс );

- нет формы проверки
Оставьте свое сообщение