Kuleshova Natalia Viktorovna, candidate of technical sciences, docent, [email protected]. Russia, Tula, Tula State University,
Burtsev Daniil Sergeevich, student, daniel [email protected]. Russia, Tula, Tula State University
УДК 004
DOI: 10.24412/2071-6168-2023-12-497-498
СПОСОБ РЕАЛИЗАЦИИ ДВУХФАКТОРНОЙ АУТЕНТИФИКАЦИИ НА БЛОКЧЕЙН-ПЛАТФОРМЕ
А.А. Жданов, Д.К. Шульга, И.О. Елфимов, В.А. Селищев
Рассматриваются процесс выполнения двухфакторной аутентификации, а также вопросы защиты информации при аутентификации пользователя в системе. Изложен анализ функциональной архитектуры двухфакторной аутентификации с использованием блокчейн-технологии и излщжены основные этапы алгоритма реализации данной системы.
Ключевые слова: токен, двухфакторная аутентификация, алгоритм, блокчейн, шифрование.
Алгоритм реализации двухфакторной аутентификации с использованием блокчейн-платформы.
Электронные кошельки широко используются в современном мире для хранения и перевода криптовалют, что делает их привлекательными для злоумышленников, которые могут использовать различные методы с целью компрометации систем безопасности электронных кошельков и получения доступа к финансовым ресурсам пользователей. В связи с этим обеспечение конфиденциальности данных в системах двухфакторной аутентификации является критически важным аспектом, который должен быть учтен при разработке и реализации подобных систем.
В большинстве случаев безопасность системы зависит от безопасности реализации со стороны провайдера. Один из методов защиты, в котором может принять участие пользователь, - применение системы двухфакторной аутентификации (2FA) для своей учетной записи. Однако современные 2FA имеют ряд недостатков и ограничений [1].
Как и в любой другой вариации двухфакторной аутентификации, метод 2FA прежде всего предполагает два уровня защиты: первый - что знает только пользователь, второй - что имеет только пользователь.
Процесс выполнения двухфакторной аутентификации предполагает реализацию следующих этапов:
1. Регистрация пользователя: пользователь регистрируется в системе, указывая свой номер телефона или адрес электронной почты, далее пользователь создает учетную запись, используя логин и пароль.
2. Проверка учетной записи: после создания учетной записи пользователь вводит свой логин и пароль для проверки правильности ввода. Данные проверяются на сервере.
3. Генерация кода для аутентификации: при успешной проверке правильности ввода пользователь генерирует код для аутентификации. Для этого может быть использована блокчейн-технология, которая создает уникальный хэш-код на основе данных пользователя и других факторов. Сервер генерирует токен, используя алгоритм шифрования, например, HMAC-SHA256, и передает его клиенту.
4. Подтверждение аутентификации: пользователь отправляет полученный код для аутентификации на сервер, который проверяет его на достоверность, используя те же факторы, что и при генерации кода. Клиент приложения создает транзакцию на блокчейн, используя токен как один из параметров и отправляет ее на узел блокчей-на.
5. Доступ к учетной записи: если код подтвержден, пользователь получает доступ к своей учетной записи. В противном случае пользователь должен повторить процесс аутентификации. Узел блокчейна проверяет токен и, если он действительный, добавляет транзакцию в блокчейн. После добавления транзакции в блокчейн сервер подтверждает аутентификацию клиента и позволяет ему получить доступ к приложению.
Важным моментом при использовании блокчейн-технологии в двухфакторной аутентификации является сохранение хэш-кода пользовательских данных в распределенном реестре блокчейна, что обеспечивает высокую степень защиты пользовательских данных, поскольку они сохраняются в распределенном реестре, который не может быть подвергнут атакам с единой точки отказа.
В случае, если токен был использован или истек срок его действия, сервер блокчейна отклоняет транзакцию и уведомляет пользователя о неудачной попытке аутентификации.
В процессе аутентификации пользователь должен создать учетную запись, зарегистрировав адрес электронной почты и пароль, эти данные будут проверены перед сохранением в блокчейн. Электронная почта проверяется на соответствие формату: если она недействительна, то отображается сообщение об ошибке, если действительна, возможно продолжить проверку пароля.
Зарегистрированный пароль должен состоять не менее чем из восьми символов, содержать заглавные буквы, символы и цифры. Если пароль не соответствует этим условиям, то появится сообщение об ошибке. Если он действителен, проверяется еще раз, существует ли электронная почта, которую необходимо зарегистрировать, в блокчейне. Если адрес электронной почты уже зарегистрирован в блокчейне, пользователь должен зарегистрироваться с другим адресом электронной почты, и учетная запись будет успешно создана.
Процесс входа в систему с двухфакторной аутентификацией изображен на рис. 1.
Пользователь вводит адрес электронной почты и пароль, затем dApp проверяет зарегистрирован ли введенный адрес электронной почты в блокчейне.
Если пользователь еще не зарегистрирован, появится сообщение об ошибке, и наоборот, если электронная почта была зарегистрирована, dApp создаст сеанс и сгенерирует токен, после чего страница переместится на страницу проверки 2FA, на которой пользователь должен нажать кнопку аутентификации, чтобы выполнить двухфактор-ную аутентификацию. После этого токен, сгенерированный dApp, будет сохранен в блокчейне. Децентрализованное приложение проверит, совпадает ли токен, хранящийся в блокчейне, со сгенерированным токеном сеанса. Если они не совпадают, появится сообщение об ошибке, в обратном случае доступ пользователю будет предоставлен.
497
User DApp Ethereum uockcham
Рис. 1. Диаграмма регистрации
Пользователь получает доступ к распределенному приложению (dApp), которое имеет web3.js, смарт-контракт регистрации и смарт-контракт 2FA, в то время как dApp подключен к блокчейну Ethereum. Диаграмма действий при входе в систему представлена на рис. 2.
User DApp Ethereum btockcham
Рис. 2. Диаграмма действий при входе в систему
Распределенное приложение (dApp) — компонент, который используется для создания приложения на основе блокчейна Ethereum. DApp состоит из набора смарт-контрактов, необходимых для построения системы. Первый смарт-контракт называется «смарт-контракт регистрации», который используется для регистрации или создания учетной записи, а второй смарт-контракт называется «смарт-контракт tufa», который используется для выполнения всех проверок, связанных с двухфакторной аутентификацией.
С целью создания смарт-контракта используется язык программирования Solidity. Для работы со смарт-контрактами используется веб-библиотека web3js, которая интегрирована в dApp и Ethereum [2].
Прежде чем транзакции будут записаны в блоки на каждом узле, подключенном к сети блокчейна Ethereum, подписанные транзакции должны быть перемещены из web3js в сеть блокчейна (рис. 3). Затем подписанные транзакции будут перенаправлены в сеть блокчейна с использованием нотации объектов JavaScript (JSON).
Ethereum
_.— ^
Рис. 3. Транзакция между Web3js и блокчейном Ethereum
В приложениях на основе блокчейна Ethereum существует нотация объекта, которая имеет функцию, подобную JSON, называемую JSON-RPC, используемую для распространения данных или информации от внешнего интерфейса к внутреннему или наоборот.
Анализ функциональной архитектуры двухфакторной аутентификации с использованием блок-чейн-технологии. Программный код для генерации токена с использованием алгоритма шифрования HMAC-SHA256 на языке Python представлен на рис. 4.
InpOPt tlBJC Isport htihUb lap or t tin»
dtf q«n«ritt_tak*n(&tcr*t_t<tY):
currtm.tint ■ Ut(tlM.tlMO)
в Преобразование вренени t e-интервала interval.tint * current.tine П 5Г а Преобродовомое секретного нлечо ж байтовое строну secret_h#y_bytes = se:r«t "«у, 'utf-й')
t Преобразование интервала времени ш байтовую строку lftl*rvtl_tl**_brt*£ 3 Interval.tlmrTto.bytos(8, trvEtordtri'tjiq1)
hnic.vjlut ' hnac .nsirisecret.kiv.bytes, lnt*rvjl_tln#_byt*s, haihlib.ihi256).dlgtstO
t Получение значения динаническою токена из HtiAC-значении offset ■ huc.V(lHE-l) £ BiOl
dynanle.token ■ (("ip»c v*lLt(of'*eT) £ 0*7f} « 24 [
(nuc.vllUt[om«t • 1] ( Qxtf) « It t (hMc.nluttoifHt » 1] t Buff) « S I (ri»c.vi\u>[Dfrttt t !) t a«ff))
* tapttaTupaeanue динамического токена ш i J-i'.-k.1 над token в str(dvnanic_token % 19»»ь:./f ill(6) в возвращение токена return token
Рис. 4. Генерация токена с использованием алгоритма шифрования HMAC-SHA256
В данном примере токен генерируется на основе текущего времени и секретного ключа, используя алгоритм HMAC-SHA256. Полученное значение токена должно быть отправлено клиенту для использования в качестве одного из факторов аутентификации [3].
В качестве примера представлен код на языке Python, который демонстрирует действия клиента по созданию транзакции на блокчейне, использующие токен как один из параметров, и отправку ее на узел блокчейна рис. 5.
В данном примере используется библиотека web3 для подключения к узлу блокчейна Ethereum, создания и отправки транзакции на блокчейн. Токен генерируется с использованием функции generate_token из предыдущего примера, а затем добавляется в параметры транзакции с помощью поля data. Далее транзакция подписывается с помощью приватного ключа пользователя и отправляется на блокчейн. Приватный ключ используется для создания цифровой подписи, которая связывает транзакцию с конкретным адресом пользователя.
При получении транзакции узел блокчейна проверяет подлинность токена, используя алгоритм проверки, который был создан при его генерации на сервере (рис. 6).
Если токен является действительным, то узел проверяет подпись транзакции с помощью публичного ключа, соответствующего приватному ключу пользователя. Если подпись действительна, тогда транзакция добавляется в пул неподтвержденных транзакций, где она ждет подтверждения в новом блоке. Пример программного кода на Python для проверки подписи транзакции в блокчейне представлен на рис. 7.
В данном примере используется библиотека Web3 для работы с блокчейном Ethereum. Функция getTransaction получает транзакцию по ее хешу.
Параметры транзакции, такие как получатель, количество токенов, переданные с помощью токена, используются для создания сообщения message. С помощью функции recover_message и публичного ключа, который связан с адресом отправителя, подпись транзакции проверяется на действительность. Если подпись действительна, то функция sendRawTransaction отправляет транзакцию в блокчейн для добавления в новый блок [3].
8 Пирометры для подключения к узлу 6 л о*чеОнр £thereця rpc.url S 'https://iiftlnriet.lnfura.io/vJ/PRQJECT_Iir »еЬЗ s ЯеЬЗСНеЬЗ.HTTPProvider(rpc_url))
в Адрес ков/ельца ornpotuтеля
s cnder .address = '0)ile2bJc4d5e6f7e8b9c0dle2f3e4b5c6d7e8f9e0b'
в Приватный ключ коиглько отправителя
sender_prlvate_kev ■ 45f5d5c5b5a59585756555453525150«f4e4d4c4b«a49âa4?«6454443<24i40'
s Адрес коаепько получателе
recipient.aûdress s '8*alb2c3die5f6g7h8i9)Qkll2a3n4o5p6q7r8s9t0u'
8 Суяно дпя отправки s met (1 CÎH - 1QA18 ) a*ount_in_wei = 1008006000009860600
8 Получение теиуаего блока для вычисления з мочения g cri price current.block « neb3,eth.getBlock{"latest') gas.price * int(current_blockt'gasPrice'J * 1.2) e Получение последнего попев для кояелька отправителя \ast_nonce = неЬЗ.eth.get TransactîonCountÎsencîer.address) 8 Создание словаря с параметрами транзакции transact ion.paraaeters = { 'nonce': tast.nonce, 'gasPrlee*: gas.price, gas': 21808,
'to': recipient_address, 'value': aaount.ln.ttel, 'data':
}
Puc. 5. Генерация токена и отправка на узел блокчейна
я Генерация токена дпя добавления в параметры транзакции token a generate.tokenCSECftET.KEY)
s Добавление токена а параметры транзакции transaction_paraeseters[ "data' J = token
Я Создание объекте транзакции
transaction = яеьЗ*eth,account.signTransaction(transaction_paraneters, private_key=sender„private_ke¥)
я Отправка транзакции на узеп блокчейна
transactian.hash s *eb3.eth.sendRawTransaction(transaction.гаяTransact ion)
s Ошидание подтверждения транзакции
receipt = яеЬЗ,eth.waitForTransactionReceiptitransaction.hash)
s Вывод информации о транзакции
prlnt('Transaction hash:", transaction.hash.hex()) print('Cas used:', receipt['gasUsed'])
Puc. 6. Генерация токена для добавления в параметры транзакции
laport web3
«3 s еео йео JCeeD J. HTTPProvlderi * httpa ; //Minnet. inf ure. lo/vJ/YOiW- PROJECT- ID * ) )
* Параметры транзакции
гее iplent = ■0*1234567890123456719012345678901234567890' anount = *3,toHtl(l# "ether") token x *sone.token"
tv.hash * "0x1234567890123456789012345678901234567890123456789012345678901234' tx = «3.eth.get Transact Ion(tx^hash)
nessage ■ (tx["froe') + reclplent + str(anount) + token),encode('utf-8")
recovered.address = a3.eth.account.recover_aessage(*eb3.eth.Account,.hash.nessagetsessage). signature=tx{'ínput")) lf txí * f roa" J « racovarad.addrtss:
w3.eth.sendRa«Transactlon(tx[*г$я*J)
Puc. 7. Проверка действительности и добавление в блокчейн
После того, как клиент успешно прошел двухфакторную аутентификацию с использованием блокчейна, сервер может подтвердить аутентификацию клиента и предоставить ему доступ к приложению. Алгоритм такого процесса выполняется следующим образом:
1. Клиент отправляет запрос на сервер для получения доступа к приложению.
2. Сервер проверяет наличие активной сессии у клиента, используя куки (cookie-файлы) или другой механизм сохранения состояния сессии.
3. Если сессия активна, сервер проверяет, прошел ли клиент двухфакторную аутентификацию и был ли токен успешно проверен узлом блокчейна. Для этого сервер может использовать хранилище сессий, где хранится информация о клиенте и статусе его аутентификации.
4. Если клиент успешно прошел аутентификацию и токен был успешно проверен, сервер подтверждает аутентичность клиента и предоставляет ему доступ к приложению, например, перенаправляет его на главную страницу приложения.
Пример программного кода на Python для реализации проверки статуса аутентификации клиента на сервере приведен на рис. 8.
Данный пример демонстрирует, как сервер может проверить статус аутентификации клиента, используя куки и хранилище сессий. Полноценная реализация может быть более сложной и включать другие механизмы проверки безопасности, такие как защита от подделки куки и угроз безопасности, связанных с хранением данных сессий.
froi flask import Flask, request, redirect app = FlaskC__name__)
(Эарр. route(*/*) def homeQ:
if 'session_id* in request.cookies:
session.id = request.cookies!'session_id']
U Проверяем, прошел ли клиент аутентификацию и был ли токен проверен if is_authenticated(ses$ion_id):
return 'Добро пожаловать в приложение!*
а Если клиент не проаеп аутентификацию, перенаправляем его на страницу аутентификации return redirectCf/login*)
def is,authenticated(session,id):
а Проверяем статус аутентификации клиента в хранилице сессий session = get,session (session.,id)
if session is not None and session['authenticated'] and session['token_valid*):
return True else:
return False
if __naae__ ss '__uain__':
app.run()
Рис. 8. Проверка статуса аутентификации клиента на сервере.
В случае, если токен был использован или истек срок его действия, сервер блокчейна отклоняет транзакцию и уведомляет пользователя о неудачной попытке аутентификации. Пример кода проверки токена на Python приведен на рис. 9.
l*P*rt hathllb t*e«rt ?I«M
в Site* nptdnotataetc*, «те у нос гегь косного скр*г«м/ «л«ч SECtET.KEY > b'ay.ltcret_fc*v*
в Фумция, «отсра» «рует токен мо стерся* сереере
del tenerete.token(u»er_id):
tUtltue i tn((tlM.ttM(}) Ш tcn^'rr i:rif M Cf^miCA
я СозЗвг* твои, uiepvr* Hffif-fiiSi
token ■ Ье|М1Ь.*Ь«2ИШС11(Т.Ш * strtvier Id).encodef*vtf-I'> * »tr{tifiette«e).*rcoee('utf-•')).h*xOlge*t<) return token, tlMltaop
3 inf us тора* npoirflfI TeiM hq сторсне tcpatpv ^лцкчгйке
def vilUate_tefce*{tefca«, uitr.ld):
в Яолучсен IPIM f Се«*ч40л
current_ttee > mt(tUe.tUeC))
l Пропер»**, vto Ku* 6*m tcjij* v* dent* wait S »t^r «aie^ if current.floe * IntOaktn.tfUtf: *)IH) * JH: return Felt*
t £ojdsew тояе* #e с герои* c*plepo, исто*»jye re *# nope*e гр*, что и ери создавши точено ничего«
expected,token я hetkUb. «he?H(lfCftEt.if* * tlr(u*er.ld) .ercedei'utf) * *tr(token.*pUt(':' )Ц J).encodc( *utf в' )).h*idl9
в Сроениесен no луче» ни} г очен с oiudo*4«
return token »■ «»peeted.tokee e ♦ str(token.spUU':')H1)
Рис. 9. Проверка токена
Данный программный код реализует простой пример двухфакторной аутентификации на основе блокчей-на с помощью языка программирования Python и библиотеки Web3.py. Код содержит два основных класса: Blockchain и Authentication. Класс Blockchain отвечает за взаимодействие с блокчейном Ethereum и содержит методы для создания транзакций, проверки токенов и добавления транзакций в блокчейн. Класс Authentication реализует логику двухфакторной аутентификации и содержит методы для генерации токенов и их проверки.
В методе generate_token класса Authentication генерируется случайный токен и вычисляется его хэш-значение с помощью алгоритма SHA-256. Затем происходит создание транзакции на отправку токена на адрес клиента, где параметры транзакции - адрес клиента и хэш-значение токена, в приложение Б добавляются использованные для работы импорты.
В методе check_token класса Authentication проверяется действительность токена с помощью запроса к блокчейну Ethereum. В блокчейне ищется транзакция с переданным хэш-значением токена и проверяется совпадение адреса получателя транзакции с адресом клиента. Если транзакция найдена и адрес получателя совпадает с адресом клиента, то токен считается действительным.
В методе addjransaction класса Blockchain происходит добавление транзакции в блокчейн Ethereum с помощью вызова метода sendTransaction из библиотеки Web3.py.
В методе authenticate класса Authentication происходит логика аутентификации пользователя. Сначала генерируется токен с помощью метода generate_token, затем токен отправляется на адрес клиента с помощью метода add_transaction из класса Blockchain. Если отправка токена прошла успешно, то пользователю предлагается ввести токен для проверки с помощью метода check_token. Если токен действительный, то пользователь считается аутенти-фицированным и получает доступ к приложению. Если токен недействительный, то пользователь получает сообщение об ошибке и доступ к приложению не предоставляется [4].
В рассмотренном примере были продемонстрированы основные этапы работы двухфакторной аутентификации на основе блокчейн с помощью языка программирования Python и блокчейн-платформы Ethereum, однако для более безопасных сервисов 2FA требуется более сложная логика.
В результате проведенного анализа были сделаны выводы о том, что использование блокчейн-технологии в системах аутентификации может значительно повысить их безопасность и эффективность, а также обеспечить защиту конфиденциальности пользовательских данных.
Алгоритм реализации двухфакторной аутентификации с использованием блокчейн-платформы является перспективным направлением в области информационной безопасности и может быть использован в различных сферах, в том числе в банковском секторе и электронной коммерции.
Список литературы
1. Дюдикова Е.И. Блокчейн в национальной платежной системе: сущность, понятие и варианты использования //Инновационное развитие экономики. 2016. №. 4. С. 139-149 (дата обращения: 01.11.2023).
2. Федеральный закон N 63-Ф3 об электронной подписи URL https://www.cryptocom.ru/law/digitalsign.html (дата обращения: 03.11.2023).
3. Danish S.M. et al. A lightweight blockchain based two factor authentication mechanism for LoRaWAN join procedure //2019 IEEE International Conference on Communications Workshops (ICC Workshops). IEEE, 2019. С. 1 - 6 (дата обращения: 04.11.2023).
4. Чуваков А.В., Артамонова А.В. Угрозы информационной безопасности и методы защиты: фокус на облачные хранилища и технологию блокчейн //Современные вопросы устойчивого развития общества в эпоху трансформационных процессов. 2023. С. 124 - 31 (дата обращения: 04.11.2023).
Жданов Антон Александрович, студент, [email protected], Россия, Санкт-Петербург, Национальный исследовательский университет ИТМО,
Шульга Дмитрий Константинович, студент, [email protected], Россия, Санкт-Петербург, Национальный исследовательский университет ИТМО,
Елфимов Илья Олегович, студент, [email protected], Россия, Санкт-Петербург, Национальный исследовательский университет ИТМО,
Селищев Валерий Анатольевич, канд. техн. наук, доцент, [email protected], Россия, Тула, Тульский государственный университет
WAY TO IMPLEMENT TWO-FACTOR AUTHENTICATION ON A BLOCKCHAIN PLATFORM A.A. Zhdanov, D.K. Shulga, I.O. Yelfimov, V.A. Selischev
Process of two-factor authentication, as well as the issues of information protection during user authentication in the system. The analysis offunctional architecture of two-factor authentication using blockchain technology is presented and the main stages of the algorithm of realization of this system are considered.
Key words: token, two-factor authentication, algorithm, blockchain, encryption.
Zhdanov Anton Alexandrovich, student, [email protected], Russia, Saint-Petersburg, National Research University ITMO,
Shulga Dmitry Konstantinovich, student, [email protected], Russia, Saint-Petersburg, National Research University ITMO,
Elfimov Ilya Olegovich, student, [email protected], Russia, Saint-Petersburg, National Research University
ITMO,
Selischev Valery Anatolievich, candidate of technical sciences, docent, sel648val@rambler. ru, Russia, Tula, Tula State University,