Реализация двухфакторной аутентификации на основе TOTP

RedDeveloper
26.02.2023 07:23
Реализация двухфакторной аутентификации на основе TOTP

Здесь рассказывается о том, как реализовать двухфакторную аутентификацию.

Во-первых, что такое двухфакторная аутентификация?

Двухфакторная аутентификация (2FA) - это метод безопасности управления идентификацией и доступом, который требует двух форм идентификации для доступа к ресурсам и данным. (Microsoft)

Существуют различные типы аутентификации 2FA.

Вот некоторые из них;

  • 2FA на основе электронной почты
  • 2FA на основе SMS
  • 2FA на основе голоса
  • 2FA на основе программного токена/TOTP
  • 2FA на основе биометрических данных
  • В виде Push-уведомления
  • 2FA на основе аппаратного токена

В этой статье я реализую 2FA на основе TOTP.

Алгоритм TOTP

В этой статье я реализую 2FA на основе TOTP

Алгоритм использует форму симметричной ключевой криптографии: один и тот же ключ используется обеими сторонами для генерации и проверки токена.

Алгоритм TOTP следует открытому стандарту, задокументированному в RFC 6238 . Входные данные включают общий секретный ключ и системное время.

Как это реализовать?

Для этого я использовал несколько пакетов с открытым исходным кодом.

Этот пакет (Google2FA) является PHP-реализацией модуля двухфакторной аутентификации Google, поддерживающего алгоритм одноразового пароля на основе HMAC (HOTP), указанный в RFC 4226 , и алгоритм одноразового пароля на основе времени (TOTP), указанный в RFC 6238 .

Этот пакет позволяет нам;

  • Генерировать секретный ключ
  • Сгенерировать QR для включения 2FA.
  • Проверить код

Генерация секретного ключа

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

Пример генерации секрета;

$google2fa = new Google2FA();
$secret = $google2fa->generateSecretKey();

// you can give length as first parameter for specify key length

Генерация QR-кода

Поэтому нам нужно сгенерировать QR-код для сканирования любым устройством. Для этого, в основном, нам нужен этот блок кода.

    public function createInlineQRCode($email, $secret)
    {
        $google2fa = new Google2FA();
        $inlineUrl = $google2fa->getQRCodeInline(
            'APP_NAME',
            $email,
            $secret
        );

        return $inlineUrl;
    }

Он создаст встроенный QR-код. Вам нужно сделать эхо. На любой странице вы можете легко использовать эти заголовки и эхо QR-кода.

header('Content-Type: image/svg+xml');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

echo $this->createInlineQRCode($user->email, $user->secret);

Проверка кодов

На последнем этапе нам необходимо проверить сгенерированный код. В этой библиотеке вам нужно использовать этот блок кода для проверки введенного кода.

    public function verify($secret, $code)
    {
        $google2fa = new Google2FA();
        return $google2fa->verifyKey($secret, $code);
    }

По сути, вам нужно передать секрет и код (введенный пользователем код) в метод verifyKey.

Что такое Flow?

Я рассказал основные вещи о технической части. Давайте погрузимся в реальную реализацию с помощью потока.

Я рассказал основные вещи о технической части Давайте погрузимся в реальную реализацию с

Это основной поток моей реализации. Конечно, существуют различные типы и различные потоки, но для данной реализации этого достаточно.

Конечные точки 2FA

Я создал основные 2 конечные точки для реализации этого потока в части бэкенда.

$app->router->get('/2fa/qr-code', 'TwoFAController@printQRCode');
$app->router->post('/2fa/verify', 'TwoFAController@verify2FA');

Конечная точка QR-кода в основном печатает изображение QR-кода с соответствующими заголовками HTPP, и я использую ее для сканирования с любого устройства.

Предназначен для проверки заданного кода от пользователя с соответствующим ключом безопасности. Эта конечная точка просто получает параметр кода, мы храним секреты в базе данных и не показываем их клиенту.

Где мы храним секреты? Конечная точка Verify

Нам нужно хранить секретные ключи, и мы можем хранить их в таблицах users или в таблице user_settings, если они у вас есть. Это полностью зависит от вас и вашего дизайна.

Если вы решите хранить их в таблице users, ваш SQL-запрос будет выглядеть следующим образом;

ALTER TABLE users ADD COLUMN secret varchar(32) DEFAULT NULL;

Примечание: Для совместимости с Google Authenticator нам необходимо хранить строки Base32.

Включение и отключение 2FA

Важно дать вам возможность отключить или включить 2FA для ваших пользователей. Вы можете хранить булево значение в вашей БД для этой опции. Например, с именем two_factor_enabled.

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

Это делается перед включением 2FA. Пользователям необходимо отсканировать QR-код и ввести его для включения 2FA.

QR-код генерируется конечной точкой 2fa/qr-code на лету.

QR-код генерируется конечной точкой 2fa/qr-code на лету

После включения этого 2FA, он просит ввести 6-значный проверочный код.

После включения этого 2FA он просит ввести 6-значный проверочный код

Ссылки

  • https://medium.com/@richb_/easy-two-factor-authentication-2fa-with-google-authenticator-php-108388a1ea23
  • https://www.twilio.com/docs/glossary/totp#the-totp-algorithm
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js

21.03.2023 12:23

Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из самых популярных фреймворков для веб-разработки сегодня является React.js. Если вы начинающий веб-разработчик и хотите узнать больше о React.js, это...

Разница между Angular и React
Разница между Angular и React

21.03.2023 07:56

React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые делают их подходящими для различных проектов веб-разработки.

Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit

20.03.2023 14:01

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

Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра

20.03.2023 12:24

Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие действия:

ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023

20.03.2023 11:15

О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц. HTML обеспечивает структуру страницы CSS (визуальное и звуковое) оформление для различных устройств. Наряду с графикой и сценариями HTML и CSS являются...

Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular

20.03.2023 08:46

Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?