import sqlite3
import bcrypt
DB_NAME = "users_system.db"
def init_database():
"""Создает файл базы данных и таблицу пользователей, если они еще не созданы."""
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
# Поле username имеет атрибут UNIQUE, чтобы логины не повторялись
cursor.execute(
"""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL
)
"""
)
conn.commit()
conn.close()
def register_user(username, password):
"""Шеширует пароль и сохраняет нового пользователя в базу данных."""
# 1. Хешируем пароль (превращаем в безопасный набор символов)
salt = bcrypt.gensalt()
hashed_bytes = bcrypt.hashpw(password.encode("utf-8"), salt)
# Переводим байты в текст для удобного хранения в SQLite
hashed_text = hashed_bytes.decode("utf-8")
# 2. Записываем в базу данных
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
try:
cursor.execute(
"INSERT INTO users (username, password_hash) VALUES (?, ?)",
(username, hashed_text),
)
conn.commit()
print(f"[УСПЕХ] Пользователь '{username}' успешно зарегистрирован!")
return True
except sqlite3.IntegrityError:
print(f"[ОШИБКА] Логин '{username}' уже занят. Выберите другой.")
return False
finally:
conn.close()
def login_user(username, password):
"""Проверяет введенный пароль по хешу из базы данных."""
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
# Ищем пользователя в базе по его логину
cursor.execute(
"SELECT password_hash FROM users WHERE username = ?", (username,)
)
result = cursor.fetchone()
conn.close()
# Если пользователь не найден
if not result:
print("[ОШИБКА] Пользователь с таким логином не найден.")
return False
# Извлекаем сохраненный текстовый хеш
db_hashed_text = result[0]
# Переводим текст обратно в байты для библиотеки bcrypt
db_hashed_bytes = db_hashed_text.encode("utf-8")
# Сравниваем введенный пароль с хешем из базы
if bcrypt.checkpw(password.encode("utf-8"), db_hashed_bytes):
print(f"[ДОСТУП РАЗРЕШЕН] Добро пожаловать, {username}!")
return True
else:
print("[ОШИБКА] Неверный пароль. Доступ заблокирован.")
return False
# --- ДЕМОНСТРАЦИЯ РАБОТЫ СКРИПТА ---
if __name__ == "__main__":
# Шаг 1: Инициализируем базу данных
init_database()
print("--- ТЕСТ 1: Регистрация нового пользователя ---")
# Пробуем создать аккаунт
register_user("user777", "MySecurePass123")
print("\n--- ТЕСТ 2: Повторная регистрация того же логина ---")
# База данных не должна пропустить дубликат
register_user("user777", "AnotherPassword")
print("\n--- ТЕСТ 3: Проверка входа с НЕВЕРНЫМ паролем ---")
# Система должна отклонить запрос
login_user("user777", "WrongPassword")
print("\n--- ТЕСТ 4: Проверка входа с ПРАВИЛЬНЫМ паролем ---")
# Система должна успешно авторизовать пользователя
login_user("user777", "MySecurePass123")