Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3342442
А
Аноним
03 сентября 2025 19:23 · публичный вопрос
А
Аноним

Код для авторизации

Ответ нейросети
03 сентября 2025 19:23

Ниже — подробное решение задачи "Код для авторизации" с пошаговыми пояснениями. Так как параметры предмет/класс не указаны, приведу общий подход, понятный для средней школы и с примерами на Python.

Цель: Понять, как работает авторизация и как сделать её безопаснее.

Часть 1. Простой (интерпретационный) пример — как работает базовая авторизация (недопустимо хранить пароли в явном виде)

  • Что делаем: сопоставляем логин и пароль, которые вводит пользователь, с хранящимися в памяти данными.
  • Примечание: этот пример демонстрирует принцип, но не безопасен для реальных систем — пароли хранятся в явном виде.

Код (инструкция и пояснения внутри кода):

# Простой, небезопасный пример
# Учетные данные хранятся в виде словаря: username -> password (в явном виде)

users = {
    "alice": "wonderland",
    "bob": "builder123"
}

def authenticate(username, password):
    # Проверяем, что введенный логин существует и пароль совпадает
    if username in users and users[username] == password:
        return True
    return False

def main():
    uname = input("Username: ")
    pwd = input("Password: ")
    if authenticate(uname, pwd):
        print("Login successful!")
    else:
        print("Invalid credentials.")

if __name__ == "__main__":
    main()

Что здесь происходит:

  • Пользователь вводит логин и пароль.
  • Функция authenticate сравнивает введённые данные с сохранёнными в словаре.
  • Это работает, но хранит пароли в явном виде — опасно.

Часть 2. Безопасный подход — хэширование паролей с солью (рекомендовано для реальных задач)

Идея:

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

Важно: используем PBKDF2 с HMAC и SHA-256, чтобы не хранить пароль напрямую и увеличить устойчивость к переборам.

Код (упрёк в виде небольшой демонстрации, без внешних зависимостей):

import os
import hashlib
from getpass import getpass

# База данных на лету (в памяти). В реальной системе хранится в файле/базе.
# Структура: username -> {"salt": ..., "hash": ...}
users_db = {}

def create_user(username, password, db):
    """
    Создает пользователя с солью и хешем пароля.
    """
    # Генерируем соль (16 байт)
    salt = os.urandom(16)
    # Вычисляем хэш пароля с солью
    dk = hashlib.pbkdf2_hmac(
        'sha256',               # алгоритм
        password.encode(),      # пароль в байтах
        salt,                   # соль
        100000                  # количество итераций
    )
    # Сохраняем соль и хеш
    db[username] = {
        'salt': salt,
        'hash': dk
    }

def verify_user(username, password, db):
    """
    Проверяет введенный пароль, учитывая сохраненную соль и хеш.
    Возвращает True, если пароль верный.
    """
    if username not in db:
        return False
    salt = db[username]['salt']
    hash_expected = db[username]['hash']
    # Вычисляем хэш введенного пароля с той же солью
    dk = hashlib.pbkdf2_hmac(
        'sha256',
        password.encode(),
        salt,
        100000
    )
    # Сравниваем безопасно (могут использоваться специальная функция compare_digest)
    return dk == hash_expected

def main():
    # Пример создания пользователя (для теста)
    create_user('alice', 'wonderland', users_db)

    # Ввод данных для авторизации
    uname = input("Username: ")
    pwd = getpass("Password: ")  # прячем ввод

    if verify_user(uname, pwd, users_db):
        print("Login successful!")
    else:
        print("Invalid credentials.")

if __name__ == "__main__":
    main()

Пояснения к коду:

  • create_user: создает соль и хеш пароля с использованием PBKDF2-HMAC-SHA256. Сохраняются соль и получившийся хеш.
  • verify_user: при логине берёт сохранённую соль для пользователя, повторно вычисляет хеш введённого пароля и сравнивает с сохранённым.
  • В этом примере база данных хранится в переменной в памяти (словарь). Чтобы сделано было постоянно между запусками, нужно сохранить данные в файл (например, JSON) или базу данных.
  • Используется getpass для безопасного ввода пароля (не показывается на экране).

Как можно расширить (для реального применения):

  • Сохранение базы данных в файл или БД, с сериализацией соли и хеша (например, JSON, Base64).
  • Добавление обработки ошибок, логирования, лимитов попыток входа (защита от перебора).
  • Использование готовых библиотек аутентификации/управления пользователями (например, библиотеки для веб-приложений: Flask-Login, Django auth, или bcrypt, argon2 для ещё большей надёжности).
  • Реализация процесса регистрации, сброса пароля и восстановления доступа через безопасные методы.

Дополнительные заметки:

  • Не размещайте реальный код авторизации в образовательных целях без учёта безопасности. В учебных задачах демонстрируйте принципы, но в проектах используйте надёжные подходы и зависимости.
  • Если нужно, могу адаптировать код под конкретный язык (JavaScript/Node.js, Java, C#, и т.д.) или под ваш уровень знаний.

Если хочешь, могу привести аналогичный пример на другом языке или сделать мини-демо под конкретную среду (например, консольное Python-приложение, веб-приложение на Flask, или простую авторизацию в JavaScript).