Hướng dẫn dùng php password trong PHP

Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password

Khi lưu trữ password vào CSDL thường sẽ sử dụng các hàm băm khác nhau được hỗ trợ bởi hệ CSDL hoặc ngôn ngữ lập trình (như MD5, SHA1 ...) để tạo dữ liệu mã hóa, dữ liệu mã hóa đó được lưu vào CSDL. Ví dụ:

$raw_password = 'abc123';
$crypt = md5($raw_password); //e99a18c428cb38d5f260853678922e03

Ví dụ trên, đã sử dụng hàm băm của PHP là md5 để mã hóa password abc123, kết quả mã hóa là e99a18c428cb38d5f260853678922e03

Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược (không có thuật toán để giải giá trị hash e99a18c428cb38d5f260853678922e03 là chuỗi abc123, chỉ duy nhất một cách là thử), nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy e99a18c428cb38d5f260853678922e03 thì đoán được password là abc123. Để khắc phục điều này có thể sử dụng đến salt

Sử dụng Salt tăng cường an toàn cho mật khẩu

Để phức tạp hóa mật khẩu lưu trữ, thì các mật khẩu gốc trước khi mã hóa được nối thêm các chuỗi, các chuỗi thêm này gọi là salt

Ví dụ:

$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes(32);

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5($staticSalt.$raw_password.$salt);

Giờ mật khẩu lưu trữ ở trên phức tạp hơn rất nhiều. Biết được $crypt đoán ra $raw_password là rất khó, kể cả khi là password yếu. Khó mà xây dựng được một từ điển chứa các mã hóa tương ứng với password.

Hướng dẫn dùng php password trong PHP
  1. Tạo database và bảng users (nếu chưa có)
    • Tạo database hocPHP
    • Tạo table users có 11 field : id, tendangnhap, matkhau, hoten, email, ngaysinh, phai, ngaydangky, idgroup,  active, randomkey
    • Nhập vài users
      • ratvui/Vu1TungPhutG1@y
      • ratbuon/Bu0nTungPhutG1@y
  2. Tạo form
    • Tạo form như hình trên sử dụng code hỗ trợ của bootstrap:
  3. Start session và check đăng nhập, lấy và hiện tên đăng nhập
if(session_id() == '') session_start(); //print_r($_SESSION);
if (isset($_SESSION['login_user'])==false) {
    header("location:dangnhap.php");
    exit();
} 
$tendangnhap = $_SESSION['login_user'];
  1. Xử lý khi submit
    • Lấy 3  giá trị trong $_POST : matkhaucu, maukhaumoi1, maukhaumoi2
    • Kiểm tra mật khẩu cũ
    • Kiểm tra mật khẩu mới: ngắn, khộng giống
    • Nếu không có lỗi thì lưu mật khẩu mới vào db và chuyển qua trang khác.
    • Trong tag input:  hiện các giá trị user đã gõ

Tạo chức năng đổi pass trong php để giúp user đổi mật khẩu khi có nhu cầu. Chức năng này bắt buộc user phải đăng nhập để đổi mật khẩu, chúng ta sẽ hỏi mật khẩu cũ, mật khẩu mới. Nếu phù hợp thì sẽ cập nhật vào bảng users.

Hướng dẫn dùng php password trong PHP

Thực hiện theo gợi ý sau:

1. Tạo view đổi mật khẩu

Tạo file views/doipass.php, trong đó tạo form như sau:

a. Thuộc tính method của form là post và thuộc tính action dẫn đến chức năng xulydoipass

b. Form có 3 textfield để nhập pass_old, pass_new1, pass_new2 và 1 nút submit

ĐỔI MẬT KHẨU

2. Tạo action đổi mật khẩu

– Kiểm tra người dùng đăng nhập chưa, nếu chưa thì chuyển hướng sang action dangnhap , ngược lại thì nạp view doipass.php

3. Tạo action xử lý đổi mật khẩu

– Tạo action xulydoipass :

case "xulydoipass" : $this->xulydoipass(); break;

– Trong view doipass.php, gán thuộc tính action của form, trỏ vào action xulydoipass vừa tạo (nếu gán rồi thì thôi)

– Code trong hàm xulydoipass theo gợi ý sau:

a. Tiếp nhận pass_old, pass_new1, pass_new2, và username/email: $pass_old= $_POST[‘pass_old’]; …

b. Kiểm tra giá trị trong $pass_new1 và $pass_new2 không giống thì báo lỗi

b. Kiểm tra giá trị trong $pass_new1 quá ngắn thì báo lỗi

b. Kiểm tra nếu $pass_new1 quá đơn giản thì báo lỗi

c. Kiểm tra nếu $pass_old không đúng thì báo lỗi

e. Cập nhật mật khẩu mới vào bảng users mật khẩu  (có thể mã hóa nếu cần)

f. Chuyển hướng đến trang khác (thông báo, trang chủ…)


Tạo chức năng đổi mật khẩu là việc bắt buộc phải thực hiện trong chuỗi các chức năng liên quan đến tài khoản của người dùng như đăng ký, đăng nhập…. Khi thực hiện chức năng này, user phải đăng nhập thì mới cho đổi pass, do đó đầu action này bạn phảii kiểm tra user đã đăng nhập chưa nhé.