Hướng dẫn dùng salted passwords 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.

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
  • 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
  • Kết quả trả về
  • Kết quả trả về
  • Giới thiệu

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
  • 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
  • Kết quả trả về
  • Kết quả trả về
  • Giới thiệu
$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.

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
  • Kết quả trả về
  • Kết quả trả về
  • Giới thiệu
$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àm hash_file() sẽ mã hóa nội dung của file được truyền vào theo thuật toán nhất định.

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Cú pháp

Cú pháphash_file( $algo, $filename, $raw_output);

Trong đó

  • $algo là tên của thuật toán mã hóa( md5, md4 .v.v.).
  • $filename là đường dẫn tới file cần mã hóa nội dung.
  • $raw_output là tham số không bắt buộc, mặc định mang giá trị FALSE:
    • Nếu $raw_output = FALSE, hàm sẽ trả về chuỗi mã hóa dưới dạng chuỗi thập phân in thường.
    • Nếu $raw_output = TRUE, hàm sẽ trả về chuỗi mã hóa dưới dạng chuỗi nhị phân.

Kết quả trả về

Hàm sẽ trả về một chuỗi đã được mã hóa từ nội dung của file truyền vào.

Bài viết này được đăng tại [free tuts .net]

Ví dụ

Cách sử dụng hàm hash_file():

Code

//tạo file mới
file_put_contents("test.txt", "this is a test file content");
echo hash_file("md5", "test.txt");

Kết quả

e24e8e958841c05a649a2dce30f01e43

Tham khảo: php.net

Hàm hash() sẽ mã hóa chuỗi truyền vào theo một thuật toán nhất định. Thuật toán mã hóa sẽ do người dùng cung cấp.

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Cú pháp

Cú pháp: hash( $algo, $str ,$raw_output);

Trong đó:

  • $algo là thuật toán mã hóa.
  • $str là chuỗi cần mã hóa.
  • $raw_output là tham số, mặc định mang giá trị FALSE chuỗi trả về sẽ là chuỗi in thường thập phân. Nếu $raw_output mang giá trị TRUE chuỗi trả về sẽ là chuỗi theo kiểu nhị phân.

Kết quả trả về

Hàm sẽ trả về chuỗi được tính toán dưới dạng nhị phân nếu $raw_output mang giá trị TRUE, và trả về chuỗi được tính toán dưới dạng thập phân nếu $raw_output mang giá trị FALSE .

Bài viết này được đăng tại [free tuts .net]

Ví dụ

Mã hóa theo kiểu "ripemd160":

Code

echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.') . "
"; echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.', true);

Kết quả

5c6ffbdd40d9556b73a21e63c3e0e904 ec457d0a974c48d5685a7efa03d137dc8bbde7e3

Mã hóa theo kiểu "md5":

Code

echo hash('md5', 'The quick brown fox jumped over the lazy dog.') . "
"; echo md5("The quick brown fox jumped over the lazy dog.") . "
";

Kết quả

5c6ffbdd40d9556b73a21e63c3e0e904 5c6ffbdd40d9556b73a21e63c3e0e904

Tham khảo: php.net

  • Giới thiệu
    • Cách sử dụng cơ bản
    • So sánh mật khẩu với một giá trị băm
    • Kiểm tra nếu mật khẩu cần được hash lại

Giới thiệu

Laravel hash facade cung cấp phương thức hash an toàn với Bcrypt để lưu mật khẩu của người dùng. Nếu bạn sử dụng LoginController và RegisterController có sẵn có Laravel, nó đã tự động thiết lập sử dụng sẵn Bcrypt cho việc đăng kí và xác thực.

Lưu ý: Bcrypt là một sự lựa chọn tốt cho hashing password bởi vì “work factor (chỉ số hoạt động)” của nó có thể điều chỉnh được, có nghĩa là thời gian để tạo ra một hash có thể tăng lên nếu như công suất của phần cứng tăng lên.

Cách sử dụng cơ bản

Bạn có thể tạo giá trị băm (hash) của mật khẩu bằng cách gọi hàm make trong facade Hash:

user()->fill([
            'password' => Hash::make($request->newPassword)
        ])->save();
    }
}

So sánh mật khẩu với một giá trị băm

Phương thức check cho phép bạn so sánh một chuỗi với một giá trị băm. Tuy nhiên, nếu bạn đang sử dụng LoginController của laravel, thì bạn không cần làm điều này, vì LoginController đã tự động xử lý cho bạn:

if (Hash::check('plain-text', $hashedPassword)) {
    // The passwords match...
}

Kiểm tra nếu mật khẩu cần được hash lại

Phương thức needsRehash cho phép bạn xác định nếu chỉ số hoạt động (work factor) của hasher thay đổi khi mật khẩu thay đổi:

if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}