Hướng dẫn
Quảng cáo

Cách tạo mật khẩu an toàn bằng PHP

Phương pháp dùng PHP để tạo mật khẩu ngẫu nhiên và an toàn với các chữ cái, chữ số và ký tự đặc biệt. Mã PHP đầy đủ và đang hoạt động.

Trong hướng dẫn này, chúng ta sẽ triển khai một phương thức lớp PHP để tạo mật khẩu bảo mật ngẫu nhiên .

Mật khẩu sẽ chứa các chữ cái , chữ số và ký tự đặc biệt ngẫu nhiên .
Nó sẽ bao gồm ít nhất một chữ cái viết thường, một chữ cái viết hoa, một chữ số và một ký tự đặc biệt.

Bạn có thể đặt độ dài tối thiểu và tối đa của mật khẩu khi gọi hàm tạo của lớp.

Bạn cũng có thể cung cấp danh sách các chuỗi phải khác với mật khẩu.
Ví dụ: bạn có thể cung cấp mật khẩu cũ và tên người dùng, đồng thời đảm bảo rằng mật khẩu mới khác với chúng.

Việc sử dụng một lớp thay vì một hàm đơn giản giúp bạn có thể dễ dàng mở rộng và cải thiện nó.
Nếu bạn chưa quen với kế thừa lớp thì đây là hướng dẫn dành cho bạn .

Lớp tạo mật khẩu ngẫu nhiên PHP

Trước hết, hãy tạo một lớp có tên passGenerator :

Ví dụ

class passwordGenerator {
}


Tiếp theo, hãy tạo một số hằng số để giữ các ký tự mà chúng ta muốn đưa vào mật khẩu.
Bạn nên tạo các hằng số riêng biệt cho chữ cái, chữ số và ký tự đặc biệt.

Chúng ta cũng hãy thêm một hằng số để xác định tỷ lệ phần trăm giống nhau tối đa . Chúng tôi sẽ sử dụng giá trị này khi xác minh rằng mật khẩu mới không quá giống với chuỗi do người gọi cung cấp.

Ví dụ

class passwordGenerator {
  
  // Alphabetic letters, lowercase
  const LETTERS = 'abcdefghijklmnopqrstuvwxyz';
  
  // Digits
  const DIGITS = '0123456789';
  
  // Special characters
  const SPECIAL_CHARS = '!@#$%^&*()_+-={}[]|:;"<>,.?/';
  
  // The maximum similarity percentage
  const MAX_SIMILARITY_PERC = 20;
}


Đây là hằng số của chúng tôi:

  • LETTERS chứa tất cả các ký tự chữ cái, chữ thường.
  • DIGITS chứa tất cả các chữ số.
  • SPECIAL_CHARS chứa danh sách các ký tự đặc biệt có thể sử dụng được. Bạn có thể chỉnh sửa danh sách này nếu bạn muốn thêm nhiều ký tự hơn hoặc loại trừ một số ký tự trong số chúng.
  • MAX_SIMILARITY_PERC là độ tương tự tối đa giữa mật khẩu và chuỗi do người gọi cung cấp, tính theo phần trăm. Ví dụ: đặt nó thành 20 có nghĩa là độ tương tự phải nhỏ hơn 20%.

Chúng ta sẽ sử dụng Hàm similar_text() trong PHP để tính giá trị này.
Chúng ta cũng cần ba thuộc tính lớp để lưu trữ các tham số được người gọi truyền vào: độ dài tối thiểu và tối đa của mật khẩu cũng như danh sách các chuỗi phải khác với mật khẩu.

Hãy thêm chúng nữa (lưu ý rằng tất cả mã đều nằm trong lớp):

Ví dụ

// The password minimum length
private $minLength;
// The password maximum length
private $maxLength;
// The optional list of strings that must be different from the password
private $diffStrings;


Được rồi, hãy chuyển sang hàm tạo của lớp .

Hàm tạo có ba đối số: độ dài tối thiểu, độ dài tối đa và danh sách các chuỗi khác nhau (viết tắt của: các chuỗi phải khác với mật khẩu).

Mỗi đối số cũng là một giá trị mặc định, với giá trị mặc định của đối số cuối cùng là một mảng trống:

Ví dụ

public function __construct(int $minLength = 4, int $maxLength = 32, array $diffStrings = []) {
  $this->minLength = $minLength;
  $this->maxLength = $maxLength;
  $this->diffStrings = $diffStrings;
}


Cách tạo mật khẩu ngẫu nhiên: phương thức generate()

Cuối cùng đã đến lúc tạo phương thức tạo mật khẩu .

Hãy gọi nó là generate() .
Đây là cách triển khai đầy đủ, theo sau là phần giải thích về mã:

Ví dụ

public function generate(): string {
  // List of usable characters
  $chars = self::LETTERS . mb_strtoupper(self::LETTERS) . self::DIGITS . self::SPECIAL_CHARS;
  
  // Set to true when a valid password is generated
  $passwordReady = false;
  
  while (!$passwordReady) {
    // The password
    $password = '';
    
    // Password requirements
    $hasLowercase = false;
    $hasUppercase = false;
    $hasDigit = false;
    $hasSpecialChar = false;
    
    // A random password length
    $length = random_int($this->minLength, $this->maxLength);
    
    while ($length > 0) {
      $length--;
      
      // Choose a random character and add it to the password
      $index = random_int(0, mb_strlen($chars) - 1);
      $char = $chars[$index];
      $password .= $char;
      
      // Verify the requirements
      $hasLowercase = $hasLowercase || (mb_strpos(self::LETTERS, $char) !== false);
      $hasUppercase = $hasUppercase || (mb_strpos(mb_strtoupper(self::LETTERS), $char) !== false);
      $hasDigit = $hasDigit || (mb_strpos(self::DIGITS, $char) !== false);
      $hasSpecialChar = $hasSpecialChar || (mb_strpos(self::SPECIAL_CHARS, $char) !== false);
    }
    
    $passwordReady = ($hasLowercase && $hasUppercase && $hasDigit && $hasSpecialChar);
    
    // If the new password is valid, check for similarity
    if ($passwordReady) {
      foreach ($this->diffStrings as $string) {
        similar_text($password, $string, $similarityPerc);
        $passwordReady = $passwordReady && ($similarityPerc < self::MAX_SIMILARITY_PERC);
      }
    }
  }
  
  return $password;
}


Đây là những gì phương thức generate() thực hiện:

  • $char chứa danh sách đầy đủ các ký tự được sử dụng trong mật khẩu. Các chữ in hoa được tạo bằng cách sử dụng mb_strtoupper() trên LETTERS .
  • Vòng lặp while tiếp tục cho đến khi tìm thấy mật khẩu đáp ứng tất cả các yêu cầu.
  • Bên trong vòng lặp, có một danh sách các biến boolean kiểm tra xem mật khẩu mới có ít nhất một chữ cái viết thường, một chữ cái viết hoa, một chữ số và một ký tự đặc biệt hay không. Chúng sai ở đầu vòng lặp và được đặt thành đúng khi một ký tự tương ứng được thêm vào mật khẩu.
  • Độ dài ngẫu nhiên, $length , được tính toán.
  • Các ký tự ngẫu nhiên từ $char được thêm vào mật khẩu cho đến khi độ dài đạt đến $length .
  • Nếu tất cả các yêu cầu được đáp ứng, phương thức sẽ kiểm tra sự tương tự với các chuỗi trong $diffStrings .
  • Nếu quá trình kiểm tra này thành công thì mật khẩu sẽ được trả lại.

Để đảm bảo mật khẩu đáp ứng các yêu cầu về ký tự, phương thức này sử dụng hàm mb_strpos() trên mỗi ký tự được thêm vào. Lưu ý cách bạn cần sử dụng so sánh nghiêm ngặt về giá trị trả về mb_strpos() .

Để chọn các ký tự ngẫu nhiên để thêm vào mật khẩu, phương thức sử dụng random_int() . Chức năng này được bảo mật bằng mật mã để các ký tự thực sự là ngẫu nhiên.

Cuối cùng, phương thức này sử dụng hàm similar_text() để tính toán độ giống nhau giữa mật khẩu và “chuỗi khác biệt”.

Đây là một cách sử dụng ví dụ:

Ví dụ

$passwordGenerator = new passwordGenerator(6, 10, ['old_password', 'myUsername']);
for ($i = 0; $i < 5; $i++) {
  echo htmlspecialchars($passwordGenerator->generate());
  echo '<br>';
}


Output:

Ví dụ

7vj;[AU
3XrO2r_Y
2^Z)3{%UXw
rKcWjw.A1
0o!]^gnlU6


Phần kết luận

Bạn có thể sử dụng phương pháp lớp này để tạo mật khẩu ngẫu nhiên và an toàn .
Nó có thể hữu ích khi triển khai hệ thống đăng nhập để đề xuất mật khẩu mới cho người dùng.

Hãy nhớ: không bao giờ lưu trữ mật khẩu văn bản thuần túy trên cơ sở dữ liệu. Thay vào đó hãy sử dụng hàm băm.

Vui lòng chỉnh sửa lớp này bằng cách thêm bất kỳ chức năng mới nào bạn có thể cần.
Nếu bạn có bất kỳ câu hỏi nào, hãy để lại bình luận cho tôi.

Bài viết này đã giúp ích cho bạn?

Bài viết mới

Advertisements