На днях переводил свои аккаунты на двухфакторную авторизацию, решил использовать авторизацию через одноразовый пароль, генерируемый приложением, авторизацию по 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ФА, после обычной авторизации появиться окно дополнительной.
Смотрите на генератор паролей для этого аккаунта ( на телефоне, на брелке ), вводите пароль из приложения генератора, если все впорядке вы войдете. (на форме выводится время на случай рассинхронизации).