Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3602113
А
Аноним
17 апреля 2026 10:13 · публичный вопрос
А
Аноним

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

Ответ нейросети
17 апреля 2026 10:13

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

  1. Простой вариант (она легкая для понимания, но не подходит для реальных приложений)
  • Идея: хранить пары логин/пароль в памяти и сравнивать введённый пароль с сохранённым.

Пример кода (Python): # Простой вариант: логин -> пароль в открытом виде (небезопасно) users = { "alice": "password123", "bob": "letmein" }

def login():
    username = input("Username: ")
    password = input("Password: ")
    if username in users and users[username] == password:
        print("Доступ разрешен")
    else:
        print("Неправильное имя пользователя или пароль")

if __name__ == "__main__":
    login()

Пояснения:

  • Здесь пароль хранится прямо в словаре. Это unacceptable для реального приложения, но полезно для понимания механики входа: пользователь вводит имя и пароль, программа сравнивает с сохранённым значением и даёт доступ или нет.
  • Недостатки: пароли видны в памяти, легко украсть, неустойчивая к повторным атакам, нет защиты от попыток перебора.
  1. Безопасный вариант: хранение паролей в виде безопасной хеш-защиты с солью
  • Идея: никогда не хранить пароль как есть. Вместо этого хранить крипто-хеш пароля и уникальную соль. При входе повторно вычислять хеш введённого пароля с той же солью и сравнивать с сохранённым хешем.

Небольшие пояснения по выбору методов:

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

Пример кода (Python) с хешированием и солью: import os import hashlib import binascii

# В память будем хранить: username -> (хеш пароля, соль)
users = {}

def hash_password(password, salt=None):
    # Если соль не дана, генерируем случайную соль
    if salt is None:
        salt = os.urandom(16)  # 16 байт соли
    # Присваиваем соль как байты, если она дана в виде hex-строки — преобразуем
    if isinstance(salt, str):
        salt = binascii.unhexlify(salt)
    # PBKDF2-HMAC-SHA256: 100000 итераций
    dk = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
    # Возвращаем хеш и соль как hex-строки для удобного хранения
    return binascii.hexlify(dk).decode(), binascii.hexlify(salt).decode()

def register(username, password):
    if username in users:
        print("Пользователь уже существует")
        return
    pwd_hash, salt = hash_password(password)
    users[username] = (pwd_hash, salt)
    print("Пользователь успешно зарегистрирован")

def login(username, password):
    if username not in users:
        print("Неправильное имя пользователя или пароль")
        return False
    stored_hash, salt = users[username]
    # Повторно вычисляем хеш введённого пароля с той же солью
    computed_hash, _ = hash_password(password, salt)
    if computed_hash == stored_hash:
        print("Доступ разрешен")
        return True
    else:
        print("Неправильное имя пользователя или пароль")
        return False

if __name__ == "__main__":
    # Пример использования
    register("alice", "password123")
    register("bob", "letmein")

    # Попытка входа
    login("alice", "password123")  # Доступ разрешен
    login("alice", "wrongpass")    # Неправильное имя пользователя или пароль

Пояснения к этому коду:

  • Функция hash_password(password, salt=None) получает пароль и соль. Если соль не задана, она создаёт новую случайную соль. Затем выполняет PBKDF2-HMAC-SHA256 с 100000 итерациями и возвращает хеш и соль в виде шестнадцатеричных строк.
  • register(username, password) сохраняет для пользователя его хеш пароля и соль.
  • login(username, password) ищет пользователя, берет сохранённую соль, повторно хеширует введённый пароль с той же солью и сравнивает полученный хеш с сохранённым.
  • Преимущества: пароли не сохраняются в открытом виде, значительно сложнее украсть пароли даже если база окажется скомпрометированной.
  1. Как это использовать на практике
  • Для учебной задачи можно скопировать приведённый безопасный вариант и попробовать:
    • зарегистрировать нескольких пользователей;
    • проверить вход под верными и неверными паролями.
  • В реальном приложении замените память на постоянное хранилище (базу данных, файл и т.д.) и добавьте защиту от переборов (ограничение количества попыток, задержки).
  • Не забывайте про безопасность канала связи (HTTPS если это веб-приложение) и про управление сессиями после успешного входа.
  1. Примечания и общие советы
  • Простой вариант годится только для демонстрации механизма входа на локальном примере; не используйте его в реальных проектах.
  • Безопасность — важная тема: никогда не храните пароли в открытом виде, используйте хеширование с солью, ограничивайте количество попыток входа, журналируйте попытки без утечки чувствительных данных.
  • Если нужно, могу привести пример на другом языке (JavaScript/Node.js, Java, C#) или показать небольшой веб-центрованный пример (фронтенд + бэкенд) по аналогичной схеме.

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