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

Hàm md5() là hệ mã hóa một chiều, giúp mã hóa những thông tin quan trọng. Trên thực tế chúng ta thường dùng để xây dựng mật khẩu của người dùng nhằm mục đích bảo mật, an toàn thông tin của tài khoản.

Cú pháp

md5(string $str)

input: $str: Chuỗi cần mã hóa

Output: Chuỗi dữ liệu có 32 ký tự sau khi mã hóa

Lưu ý: Đây là hệ mã hóa 1 chiều nên hàm này chỉ đóng vai trò mã hóa và không có hàm giải mã nó. Có nghĩa từ dữ liệu được mã hóa muốn tìm ra chuỗi ban đầu cần phải vét cạn.

Thuật toán kiểm tra mật khẩu

Để kiểm tra mật khẩu đúng hay không cần phải kiểm tra chuỗi sau khi mã hóa có khớp hay không.

Tôi có ví dụ bên dưới $password_db là mật khẩu người dùng đã được mã hóa sau khi đăng ký tài khoản hệ thống. $password là chuỗi ký tự người dùng nhập vào mật khẩu để đăng nhập.

Để kiểm tra xem mật khẩu có đúng hay không chúng ta cần kiểm tra theo ý tưởng bên dưới.

Ví dụ hàm Md5()

Ví dụ 1: Mã hóa chuỗi “abc”

Kết quả ta nhận được chuỗi

900150983cd24fb0d6963f7d28e17f72

Ví dụ 2: Mã hóa mật khẩu “unitop20!@#”

30868f64811f1c4eb9a9a32fac786485

Tổng kết

Qua bài này tôi đã hướng dẫn bạn cách để mã hóa một thông tin cho trước với hàm md5(). Hàm này thường được sử dụng để mã hóa mật khẩu người dùng nhằm tăng độ an toàn cho tài khoản.

Ngay bây giờ bạn nên ghi chú lại hàm này và thực hành lại để nắm chắc bài học.

Xin chào, sớm hẹn gặp lại!

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ụ:

Nội dung chính

  • Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password
  • Sử dụng Salt tăng cường an toàn cho mật khẩu
  • Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password
  • Sử dụng Salt tăng cường an toàn cho mật khẩu
  • So sánh 2 chuỗi đã mã hoá?

Nội dung chính

  • Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password
  • Sử dụng Salt tăng cường an toàn cho mật khẩu
  • Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password
  • Sử dụng Salt tăng cường an toàn cho mật khẩu
  • So sánh 2 chuỗi đã mã hoá?

Nội dung chính

  • Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password
  • Sử dụng Salt tăng cường an toàn cho mật khẩu
  • Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password
  • Sử dụng Salt tăng cường an toàn cho mật khẩu
  • So sánh 2 chuỗi đã mã hoá?
$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.

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.

Cập nhật ngày 27/12/2021

Trong PHP, muốn sử dụng mã hoá Bcrypt ta sẽ dùng hàm password_hash(). Hàm này thường dùng để mã hoá mật khẩu.

Ngoài mã hoá Bcrypt hàm này còn hỗ trợ mã hoá Argon2i và Argon2id.

password_hash ( string $password , int $algo [, array $options ] ) : string

Trong đó:

  • $password: chuỗi cần mã hoá
  • $algo: Phương thức mã hoá (mặc định là Bcrypt). (xem thêm)
  • $options: mảng tùy chọn (xem thêm)

Kết quả:

Trả về chuỗi mã hoá hoặc FALSE nếu thất bại.

Ví dụ:

 12,
];

echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);

So sánh 2 chuỗi đã mã hoá?

Đồi khi ta buồn ta chả biết làm gì rồi ngồi vu vơ nghĩ về Bcrypt, khi mà cùng 1 chuỗi nó mã hoá ra nhiều chuỗi mới khác nhau thì làm sao so sánh?

Nhưng không sao, PHP đã cung cấp cho ta 1 hàm giúp làm việc này đó là password_verify().

password_verify ( string $password , string $hash ) : bool

Trong đó:

  • $password: chuỗi gốc cần so sánh
  • $hash: chuỗi đã má hoá

Kết quả:

TRUE nếu khớp, FALSE nếu không khớp.

Ví dụ: