آموزش ساخت سیستم مدیریت رمز عبور

آموزش ساخت سیستم مدیریت رمز عبور با PHP

آموزش ساخت سیستم مدیریت رمز عبور با PHP

در دنیای امروز، مدیریت امن رمزهای عبور یکی از مهم‌ترین جنبه‌های امنیت سایبری است. کاربران به طور معمول از رمزهای عبور یکسان برای چندین حساب کاربری استفاده می‌کنند که این امر آن‌ها را در برابر حملات هکری آسیب‌پذیر می‌سازد. یک سیستم مدیریت رمز عبور (Password Manager) به کاربران کمک می‌کند تا رمزهای عبور قوی و منحصر به فرد برای هر حساب کاربری ایجاد و ذخیره کنند. این مقاله به شما آموزش می‌دهد که چگونه یک سیستم مدیریت رمز عبور ساده اما کاربردی را با استفاده از PHP و MySQL پیاده‌سازی کنید.

پیش‌نیازها

برای دنبال کردن این آموزش، شما به موارد زیر نیاز دارید:

  • یک سرور وب با PHP نصب شده (مانند Apache یا Nginx)
  • یک پایگاه داده MySQL
  • دانش پایه PHP و SQL
  • یک ویرایشگر متن یا IDE

طراحی پایگاه داده

ابتدا باید پایگاه داده‌ای برای ذخیره اطلاعات کاربران و رمزهای عبور آن‌ها طراحی کنیم. یک جدول به نام users و یک جدول به نام passwords ایجاد می‌کنیم.

جدول users

  • id: شناسه یکتا برای هر کاربر (INT, PRIMARY KEY, AUTO_INCREMENT)
  • username: نام کاربری کاربر (VARCHAR(255), UNIQUE)
  • password: رمز عبور کاربر (VARCHAR(255))
  • salt: یک رشته تصادفی برای افزایش امنیت رمز عبور (VARCHAR(255))

جدول passwords

  • id: شناسه یکتا برای هر رمز عبور (INT, PRIMARY KEY, AUTO_INCREMENT)
  • user_id: شناسه کاربری که رمز عبور به آن تعلق دارد (INT, FOREIGN KEY referencing users.id)
  • website: نام وب‌سایتی که رمز عبور برای آن استفاده می‌شود (VARCHAR(255))
  • username: نام کاربری در وب‌سایت (VARCHAR(255))
  • password: رمز عبور ذخیره شده (VARCHAR(255))
  • salt: یک رشته تصادفی برای افزایش امنیت رمز عبور (VARCHAR(255))

اسکریپت SQL برای ایجاد جداول:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    salt VARCHAR(255) NOT NULL
);

CREATE TABLE passwords (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    website VARCHAR(255) NOT NULL,
    username VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    salt VARCHAR(255) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

پیاده‌سازی توابع امنیتی

برای افزایش امنیت سیستم، از توابع زیر استفاده می‌کنیم:

تولید Salt

Salt یک رشته تصادفی است که به رمز عبور اضافه می‌شود تا از حملات Rainbow Table جلوگیری کند. تابع زیر یک Salt تصادفی تولید می‌کند:

function generateSalt($length = 16) {
    return bin2hex(random_bytes($length));
}

Hash کردن رمز عبور

برای ذخیره رمز عبور در پایگاه داده، از تابع password_hash() استفاده می‌کنیم. این تابع رمز عبور را با استفاده از یک الگوریتم قوی (مانند bcrypt) Hash می‌کند:

function hashPassword($password, $salt) {
    return password_hash($password . $salt, PASSWORD_DEFAULT);
}

تایید رمز عبور

برای تایید رمز عبور وارد شده توسط کاربر، از تابع password_verify() استفاده می‌کنیم. این تابع رمز عبور وارد شده را با Hash ذخیره شده در پایگاه داده مقایسه می‌کند:

function verifyPassword($password, $hash, $salt) {
    return password_verify($password . $salt, $hash);
}

پیاده‌سازی عملیات ثبت نام و ورود

ثبت نام کاربر

در فرآیند ثبت نام، کاربر نام کاربری و رمز عبور خود را وارد می‌کند. ما یک Salt تصادفی تولید می‌کنیم، رمز عبور را با Salt Hash می‌کنیم و اطلاعات کاربر را در پایگاه داده ذخیره می‌کنیم.

function registerUser($username, $password) {
    $salt = generateSalt();
    $hashedPassword = hashPassword($password, $salt);

    $conn = new mysqli("localhost", "username", "password", "database");
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    $sql = "INSERT INTO users (username, password, salt) VALUES ('$username', '$hashedPassword', '$salt')";

    if ($conn->query($sql) === TRUE) {
        $conn->close();
        return true;
    } else {
        $conn->close();
        return false;
    }
}

ورود کاربر

در فرآیند ورود، کاربر نام کاربری و رمز عبور خود را وارد می‌کند. ما نام کاربری را در پایگاه داده جستجو می‌کنیم و اگر یافت شد، Salt و Hash رمز عبور را از پایگاه داده بازیابی می‌کنیم. سپس رمز عبور وارد شده را با Salt Hash می‌کنیم و با Hash ذخیره شده مقایسه می‌کنیم. اگر مطابقت داشت، کاربر با موفقیت وارد سیستم می‌شود.

function loginUser($username, $password) {
    $conn = new mysqli("localhost", "username", "password", "database");
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    $sql = "SELECT password, salt FROM users WHERE username = '$username'";
    $result = $conn->query($sql);

    if ($result->num_rows == 1) {
        $row = $result->fetch_assoc();
        $hashedPassword = $row["password"];
        $salt = $row["salt"];

        if (verifyPassword($password, $hashedPassword, $salt)) {
            $conn->close();
            return true;
        } else {
            $conn->close();
            return false;
        }
    } else {
        $conn->close();
        return false;
    }
}

پیاده‌سازی عملیات ذخیره و بازیابی رمزهای عبور

ذخیره رمز عبور

کاربر می‌تواند رمزهای عبور خود را برای وب‌سایت‌های مختلف ذخیره کند. ما یک Salt تصادفی برای هر رمز عبور تولید می‌کنیم، رمز عبور را با Salt Hash می‌کنیم و اطلاعات رمز عبور را در پایگاه داده ذخیره می‌کنیم.

بازیابی رمزهای عبور

کاربر می‌تواند رمزهای عبور ذخیره شده خود را بازیابی کند. ما اطلاعات رمز عبور را از پایگاه داده بازیابی می‌کنیم و رمز عبور Hash شده را نمایش می‌دهیم.

نکات امنیتی مهم

  • همیشه از توابع امنیتی برای Hash کردن و تایید رمزهای عبور استفاده کنید.
  • از Salt تصادفی برای افزایش امنیت رمزهای عبور استفاده کنید.
  • از الگوریتم‌های قوی Hash (مانند bcrypt) استفاده کنید.
  • اطلاعات حساس را به صورت امن ذخیره کنید.
  • از حملات SQL Injection جلوگیری کنید.
  • از حملات Cross-Site Scripting (XSS) جلوگیری کنید.
  • به طور منظم سیستم را به‌روزرسانی کنید.

نتیجه‌گیری

در این مقاله، شما یاد گرفتید که چگونه یک سیستم مدیریت رمز عبور ساده اما کاربردی را با استفاده از PHP و MySQL پیاده‌سازی کنید. با رعایت نکات امنیتی ذکر شده، می‌توانید یک سیستم امن و قابل اعتماد برای مدیریت رمزهای عبور خود ایجاد کنید. این سیستم می‌تواند به کاربران کمک کند تا رمزهای عبور قوی و منحصر به فرد برای هر حساب کاربری ایجاد و ذخیره کنند و از آن‌ها در برابر حملات هکری محافظت کنند.