Trong lập trình web, bảo mật tài khoản người dùng luôn là một trong những yêu cầu quan trọng nhất. Nếu bạn xây dựng một hệ thống đăng nhập mà lưu mật khẩu dạng plain text (nguyên gốc) trong cơ sở dữ liệu, đó sẽ là sai lầm nghiêm trọng. Bởi chỉ cần kẻ tấn công xâm nhập vào cơ sở dữ liệu, toàn bộ tài khoản người dùng sẽ bị lộ ngay lập tức.
Để tránh rủi ro này, PHP cung cấp sẵn hàm password_hash() để hash (mã hóa một chiều) mật khẩu và password_verify() để xác minh mật khẩu khi người dùng đăng nhập. Đây là giải pháp an toàn, hiện đại và dễ sử dụng, thay thế cho các cách làm cũ như md5() hoặc sha1(), vốn không còn đủ mạnh trước các kỹ thuật tấn công hiện nay.
Nếu bạn đã tìm hiểu qua các bài trước như:
thì việc kết hợp với password_hash và password_verify sẽ giúp bạn xây dựng được một hệ thống đăng nhập và quản lý người dùng vừa an toàn vừa chuyên nghiệp.
Tại sao không nên lưu mật khẩu gốc?
Một trong những sai lầm phổ biến nhất của lập trình viên mới là lưu mật khẩu gốc (plain text) trong database. Ví dụ, bảng users chứa cột password với giá trị "123456" hoặc "abc123". Điều này vô cùng nguy hiểm vì:
-
Nếu database bị rò rỉ, kẻ tấn công sẽ biết toàn bộ mật khẩu ngay lập tức.
-
Người dùng thường dùng chung một mật khẩu cho nhiều dịch vụ, do đó hệ quả không chỉ dừng lại ở website của bạn.
-
Website dễ bị mất uy tín và có thể vi phạm các quy định về bảo mật dữ liệu.
Chính vì vậy, quy tắc cơ bản là không bao giờ lưu mật khẩu gốc. Thay vào đó, ta cần hash mật khẩu để khi database bị lộ, kẻ tấn công cũng khó (hoặc gần như không thể) giải mã lại mật khẩu ban đầu.
Hash mật khẩu bằng password_hash()
PHP cung cấp hàm password_hash() để mã hóa mật khẩu một cách an toàn. Hàm này sử dụng các thuật toán mạnh như bcrypt, argon2i, hoặc argon2id.
Trước tiên, hãy hiểu cách hoạt động:
-
Khi người dùng đăng ký, bạn nhận mật khẩu từ form.
-
Thay vì lưu trực tiếp mật khẩu, bạn hash nó bằng
password_hash(). -
Chuỗi hash này sẽ được lưu vào database.
-
Khi người dùng đăng nhập, bạn sẽ dùng
password_verify()để so sánh.
Ví dụ cách hash:
<?php $password = "123456"; // mật khẩu người dùng nhập khi đăng ký $hashedPassword = password_hash($password, PASSWORD_DEFAULT); echo $hashedPassword; ?>
Trong đoạn code này, biến $hashedPassword sẽ chứa một chuỗi dài, ví dụ:

