تقنيات نور التعليمية تقنيات نور التعليمية

آخر الأخبار

جاري التحميل ...

📘 الدرس 15: تشفير كلمات المرور باستخدام Hashlib

حتى الآن كنا نخزن كلمات المرور نصوصًا عادية (Plain Text) في قاعدة البيانات، وهذا أمر غير آمن ⚠️.

في هذا الدرس سنتعلم كيف نحمي كلمات المرور عن طريق تشفيرها (Hashing) قبل تخزينها في قاعدة البيانات باستخدام مكتبة hashlib.

Hashlib

🎯 الفكرة

  1. عند تسجيل مستخدم جديد → لا نحفظ كلمة المرور مباشرة.
  2. نستخدم دالة تجزئة مثل SHA-256 لتحويل كلمة المرور إلى نص مشفر.
  3. عند تسجيل الدخول → نقوم بتشفير كلمة المرور المدخلة ونقارنها مع النسخة المخزنة.


💻 الكود

import sys
import sqlite3
import hashlib
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QDialog, QLabel, QPushButton,
    QLineEdit, QVBoxLayout, QWidget, QMessageBox, QHBoxLayout
)


# دالة لتشفير كلمات المرور
def hash_password(password):
    return hashlib.sha256(password.encode()).hexdigest()


# تهيئة قاعدة البيانات
def init_db():
    conn = sqlite3.connect("users.db")
    cursor = conn.cursor()

    cursor.execute("""
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL UNIQUE,
            password TEXT NOT NULL
        )
    """)

    conn.commit()
    conn.close()


# النافذة الرئيسية
class MainApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("النافذة الرئيسية")
        self.setGeometry(200, 200, 400, 200)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        layout = QVBoxLayout(central_widget)

        label = QLabel("🎉 تم تسجيل الدخول بنجاح")
        layout.addWidget(label)


# نافذة تسجيل مستخدم جديد
class SignUpWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("تسجيل مستخدم جديد")
        self.setGeometry(350, 350, 300, 200)

        layout = QVBoxLayout()

        self.username_input = QLineEdit(self)
        self.username_input.setPlaceholderText("اسم المستخدم")
        layout.addWidget(self.username_input)

        self.password_input = QLineEdit(self)
        self.password_input.setPlaceholderText("كلمة المرور")
        self.password_input.setEchoMode(QLineEdit.Password)
        layout.addWidget(self.password_input)

        self.confirm_input = QLineEdit(self)
        self.confirm_input.setPlaceholderText("تأكيد كلمة المرور")
        self.confirm_input.setEchoMode(QLineEdit.Password)
        layout.addWidget(self.confirm_input)

        self.signup_button = QPushButton("تسجيل", self)
        self.signup_button.clicked.connect(self.register_user)
        layout.addWidget(self.signup_button)

        self.setLayout(layout)

    def register_user(self):
        username = self.username_input.text()
        password = self.password_input.text()
        confirm = self.confirm_input.text()

        if not username or not password:
            QMessageBox.warning(self, "خطأ", "يرجى ملء جميع الحقول")
            return

        if password != confirm:
            QMessageBox.warning(self, "خطأ", "كلمتا المرور غير متطابقتين")
            return

        hashed_pass = hash_password(password)

        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()

        try:
            cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)", (username, hashed_pass))
            conn.commit()
            QMessageBox.information(self, "نجاح", "تم تسجيل المستخدم بنجاح 🎉")
            self.accept()
        except sqlite3.IntegrityError:
            QMessageBox.warning(self, "خطأ", "اسم المستخدم موجود بالفعل")
        finally:
            conn.close()


# نافذة تسجيل الدخول
class LoginWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("تسجيل الدخول")
        self.setGeometry(300, 300, 300, 150)

        layout = QVBoxLayout()

        self.username_input = QLineEdit(self)
        self.username_input.setPlaceholderText("اسم المستخدم")
        layout.addWidget(self.username_input)

        self.password_input = QLineEdit(self)
        self.password_input.setPlaceholderText("كلمة المرور")
        self.password_input.setEchoMode(QLineEdit.Password)
        layout.addWidget(self.password_input)

        btn_layout = QHBoxLayout()

        self.login_button = QPushButton("تسجيل الدخول", self)
        self.login_button.clicked.connect(self.check_login)
        btn_layout.addWidget(self.login_button)

        self.signup_button = QPushButton("مستخدم جديد؟", self)
        self.signup_button.clicked.connect(self.open_signup)
        btn_layout.addWidget(self.signup_button)

        layout.addLayout(btn_layout)

        self.setLayout(layout)

    def check_login(self):
        username = self.username_input.text()
        password = self.password_input.text()
        hashed_pass = hash_password(password)

        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users WHERE username=? AND password=?", (username, hashed_pass))
        result = cursor.fetchone()
        conn.close()

        if result:
            self.accept()
        else:
            QMessageBox.warning(self, "خطأ", "اسم المستخدم أو كلمة المرور غير صحيحة")

    def open_signup(self):
        signup = SignUpWindow()
        if signup.exec_() == QDialog.Accepted:
            QMessageBox.information(self, "تنبيه", "يمكنك الآن تسجيل الدخول باستخدام بياناتك الجديدة")


if __name__ == "__main__":
    init_db()

    app = QApplication(sys.argv)
    login = LoginWindow()

    if login.exec_() == QDialog.Accepted:
        window = MainApp()
        window.show()
        sys.exit(app.exec_())

✅ ما تعلمناه

  • استخدام hashlib لتشفير كلمات المرور.
  • تخزين كلمات المرور المشفرة بدل النصوص العادية.
  • مقارنة كلمة المرور المدخلة بعد تشفيرها مع النسخة المخزنة.


📌 في الدرس 16 سنطور النظام أكثر:

إضافة نظام أذونات وصلاحيات (Roles) مثل:

  • مستخدم عادي.
  • مدير (Admin) لديه ميزات إضافية.

عن الكاتب

Tamer Ahmed

التعليقات


اتصل بنا

إذا أعجبك محتوى مدونتنا نتمنى البقاء على تواصل دائم ، فقط قم بإدخال بريدك الإلكتروني للإشتراك في بريد المدونة السريع ليصلك جديد المدونة أولاً بأول ، كما يمكنك إرسال رساله بالضغط على الزر المجاور ...

جميع الحقوق محفوظة

تقنيات نور التعليمية