Skip to content
Jude51Public

About

Образовательный проект двухфакторной аутентификации с использованием TOTP и кодов электронной почты

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

14 Commits

Folders and files

Repository files navigation

2FA App — Двухфакторная аутентификация

Это учебный проект веб-приложения на Flask с системой регистрации пользователей и защитой аккаунтов через двухфакторную аутентификацию (2FA).

Как это работает?

Процесс регистрации

  1. Новый пользователь открывает страницу регистрации
  2. Вводит имя пользователя и пароль
  3. Выбирает способ двухфакторной аутентификации:
    • TOTP — коды генерируются на телефоне в специальном приложении (Google Authenticator, Authy)
    • Email — коды отправляются на указанный email
  4. Если выбран TOTP, пользователь сканирует QR-код в приложении на телефоне
  5. Пароль сохраняется в базе данных в зашифрованном виде (bcrypt)

Процесс входа

  1. Пользователь открывает форму входа
  2. Вводит имя пользователя и пароль
  3. Если пароль верный, система переводит его на экран верификации 2FA:
    • Для TOTP: нужно ввести код из приложения на телефоне
    • Для Email: система отправляет 6-значный код на почту, пользователь вводит его
  4. После ввода верного кода пользователь получает доступ в приложение

Процесс выхода

  1. Пользователь нажимает кнопку "Выйти"
  2. Сессия очищается, он выходит из аккаунта

Возможности приложения

Регистрация новых пользователей с выбором метода 2FA
Безопасное хранение паролей с помощью bcrypt (криптографическое хеширование)
TOTP (Time-based One-Time Password) — динамические коды через Google Authenticator
Email 2FA — отправка кодов на электронную почту
QR-код для TOTP — удобное сканирование в приложении
Управление сессиями — отслеживание авторизованных пользователей
Безопасная конфигурация — все секреты хранятся в переменных окружения, а не в коде

Требования

  • Python 3.7+
  • Flask
  • Flask-SQLAlchemy
  • bcrypt
  • pyotp
  • qrcode
  • python-dotenv

Установка

  1. Клонируй репозиторий:
git clone https://github.com/Jude51/2FA_app.git
cd 2FA_app
  1. Установи зависимости:
python -m pip install -r requirements.txt
  1. Создай файл .env в корне проекта:
cp .env.example .env

Настройка

Отредактируй файл .env и добавь свои значения:

SECRET_KEY=your-secret-key-here
EMAIL_SENDER=your-email@example.com
EMAIL_PASSWORD=your-email-password
DATABASE_URI=sqlite:///users.db

Важно:

  • SECRET_KEY — случайная строка для Flask
  • EMAIL_SENDER — Gmail адрес для отправки кодов
  • EMAIL_PASSWORD — пароль приложения Gmail (не главный пароль)

Запуск

Используй безопасную версию приложения:

python app_safe.py

Описание файлов в репозитории

app_safe.py

Основной файл приложения — безопасная версия.

Особенности:

  • Все секреты подгружаются из переменных окружения через python-dotenv
  • Приложение выбрасывает ошибку при запуске, если отсутствуют необходимые переменные (SECRET_KEY, EMAIL_SENDER, EMAIL_PASSWORD)
  • Содержит все маршруты: регистрация, вход, 2FA верификация, выход
  • Поддерживает TOTP (Google Authenticator) и email-коды для двухфакторной аутентификации
  • Использует SQLite для хранения пользователей и TOTP-секретов
  • Пароли хешируются с помощью bcrypt

Основные маршруты:

  • / — главная страница (показывает имя пользователя, если авторизован)
  • /register — регистрация нового пользователя с выбором метода 2FA
  • /login — вход по имени и паролю
  • /setup-2fa — настройка TOTP с QR-кодом
  • /verify-2fa — ввод кода 2FA (TOTP или email)
  • /logout — выход

requirements.txt

Список всех зависимостей проекта с точными версиями:

  • Flask — веб-фреймворк
  • Flask-SQLAlchemy — ORM для работы с БД
  • bcrypt — хеширование паролей
  • pyotp — генерация и проверка TOTP
  • qrcode — создание QR-кодов для TOTP
  • python-dotenv — загрузка переменных окружения из .env

Установка: pip install -r requirements.txt

.gitignore

Правила исключения файлов из Git репозитория. Защищает от случайной загрузки:

  • .env — конфиденциальные переменные окружения
  • app.py — локальная версия с жёстко закодированными секретами
  • test_app.py — файлы тестов
  • instance/users.db — база данных пользователей
  • __pycache__/ — кеш Python
  • .pytest_cache/ — кеш тестов
  • .coverage — отчёты покрытия

templates/ — HTML-шаблоны

index.html

Главная страница приложения:

  • Если пользователь авторизован — показывает приветствие с его именем и кнопку выхода
  • Если не авторизован — предлагает войти или зарегистрироваться

register.html

Форма регистрации:

  • Поле для ввода имени пользователя
  • Поле для ввода пароля
  • Выбор метода 2FA: TOTP или email
  • Поле для ввода email (если выбран email 2FA)

login.html

Форма входа:

  • Поле для ввода имени пользователя
  • Поле для ввода пароля
  • После успешного входа переводит на верификацию 2FA

setup_2fa.html

Страница настройки TOTP:

  • Показывает QR-код для сканирования в Google Authenticator или другом приложении
  • Содержит инструкции для пользователя

verify_2fa.html

Форма верификации 2FA:

  • Для TOTP: поле для ввода 6-значного кода из приложения
  • Для email: поле для ввода кода, отправленного на почту

static/style.css

CSS-стили для оформления веб-интерфейса:

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

Как это работает технически

База данных

Приложение использует SQLite — простую встроенную базу данных. В ней хранится информация о пользователях:

  • Имя пользователя (уникальное)
  • Пароль (зашифрован с помощью bcrypt)
  • TOTP-секрет (используется для генерации кодов в Google Authenticator)
  • Email (для отправки кодов)
  • Способ 2FA (TOTP или email)

Хеширование паролей (bcrypt)

Пароль никогда не хранится в открытом виде. Вместо этого используется bcrypt — криптографический алгоритм:

  1. При регистрации пароль преобразуется в хеш (это необратимо)
  2. При входе введённый пароль снова хешируется и сравнивается с сохранённым хешем
  3. Даже если кто-то получит доступ к БД, пароль не удастся восстановить

TOTP (Time-based One-Time Password)

Это алгоритм для генерации одноразовых кодов:

  1. При регистрации приложение генерирует случайный секретный ключ (32 символа)
  2. Этот ключ кодируется в QR-код и передаётся пользователю
  3. Пользователь сканирует QR в Google Authenticator, и приложение начинает генерировать 6-значные коды
  4. Коды обновляются каждые 30 секунд
  5. При входе пользователь вводит текущий код, и приложение проверяет его

Переменные окружения (.env)

Вместо того, чтобы писать секреты прямо в коде (опасно!), используются переменные окружения:

  • SECRET_KEY — ключ для Flask (защита сессий)
  • EMAIL_SENDER — Gmail адрес (отправитель писем)
  • EMAIL_PASSWORD — пароль Gmail (не главный пароль, а специальный)
  • DATABASE_URI — путь к БД

При запуске приложение читает эти переменные из файла .env (локально) или системных переменных (на сервере).

Безопасность

  • Пароли хешируются с помощью bcrypt — невозможно восстановить исходный пароль
  • Секреты не в коде — все ключи и пароли хранятся в .env, которого нет в Git
  • HTTPS для email — используется защищённое соединение с Gmail (SSL/TLS)
  • Одноразовые коды — email-коды используются один раз и удаляются
  • TOTP в стандарте — Google Authenticator использует RFC 6238 (признанный стандарт)
  • Проверка переменных окружения — приложение отказывается запускаться без необходимых ключей

Используемые библиотеки

  • Flask — лёгкий веб-фреймворк на Python для создания веб-приложений
  • Flask-SQLAlchemy — удобный интерфейс для работы с базами данных
  • bcrypt — криптографическое хеширование паролей
  • pyotp — реализация TOTP и HOTP для двухфакторной аутентификации
  • qrcode — генерация QR-кодов из строк
  • python-dotenv — загрузка переменных окружения из файла .env

Лицензия

MIT

Автор

Jude51

About

Образовательный проект двухфакторной аутентификации с использованием TOTP и кодов электронной почты

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages