Chúng ta đã làm quen với việc sử dụng Regular Expression để kiểm tra tính hợp lệ của dữ liệu. Trong phần này, chúng ta sẽ tìm hiểu về cách thức áp dụng Regular Expression để kiểm tra tính hợp lệ của mật khẩu, trong đó xây dựng cơ chế để điều chỉnh các mức độ mạnh yếu khác nhau của mật khẩu cần được kiểm tra.

Trong ví dụ minh họa bài viết, chúng ta xây dựng lớp đối tượng có tên PasswordPolicyChecker thực hiện chức năng kiểm tra tính hợp lệ của mật khẩu, thông qua hàm validate() định nghĩa bên trong lớp đối tượng này.

Lập trình PasswordPolicyChecker

Lớp đối tượng PasswordPolicyChecker cung cấp hàm validate() kiểm tra tính hợp lệ của mật khẩu cũng như cho phép người lập trình tùy chỉnh các quy tắc kiểm tra. Có hai nhóm quy tắc giúp tăng cường độ khó của mật khẩu: giới hạn về kích thước mật khẩu và các quy định về các loại ký tự cần phải có trong mật khẩu.

Quy định về kích thước mật khẩu

Kích thước mật khẩu là số lượng ký tự có trong mật khẩu đó. Thông thường các hệ thống đều quy định kích thước tối thiểu mật khẩu cần có. Một số hệ thống cũng quy định thêm giới hạn kích thước tối đa. Trong chương trình ví dụ minh họa, chúng ta sử dụng 2 thuộc tính để quy định giới hạn kích thước tối thiểu và tối đa cho mật khẩu:

  • minNumberOfChars: xác định số lượng tối thiểu ký tự có trong mật khẩu (kích thước tối thiểu). Nếu giá trị này không thiết lập hoặc được thiết lập giá trị nhỏ hơn hoặc bằng 0, thì sẽ được tự động thiết lập lại giá trị mặc định (bằng 6).
  • maxNumberOfChars: xác định số lượng tối đa ký tự có trong mật khẩu (kích thước tối đa). Nếu giá trị này không thiết lập hoặc thiết lập nhỏ hơn hoặc bằng 0, thì sẽ được xem như không giới hạn tối đa, giá trị mật khẩu có thể có chiều dài không giới hạn. Nếu giá trị maxNumberOfChars thỏa mãn 0 < maxNumberOfChars < minNumberOfChars thì sẽ được gán giá trị bằng với minNumberOfChars.

Quy tắc về ký tự có trong mật khẩu

Phần này sẽ liệt kê các quy tắc về các ký tự có trong mật khẩu và các mẫu đối sánh (Pattern) định nghĩa trong RegExp tương ứng với các quy tắc đó.

Hình 1. Bảng định nghĩa Pattern cho các Rule

Trường hợp đơn giản nhất, mật khẩu phải đáp ứng được yêu cầu 1, đó là không được phép có ký tự trắng (whitespace) trong mật khẩu.

Lựa chọn các quy tắc áp dụng kiểm tra

Việc lựa chọn các quy tắc áp dụng kiểm tra được thực hiện thông qua thuộc tính optionFlags. Thuộc tính này là một số nguyên, mỗi bit từ phải qua trái (tức là hướng từ vị trí có ý nghĩa thấp đến vị trí có ý nghĩa cao) được dùng làm một “cờ” để đánh dấu cho một quy tắc. Chẳng hạn bit số 0, là “cờ” có tên FLAG_HAS_NO_WHITESPACE đại diện cho quy tắc “No whitespace allowed in the entire string”, tùy thuộc giá trị cờ bằng 1 (cờ được bật) hay bằng 0 (cờ bị tắt) mà chương trình kiểm tra sẽ áp dụng hoặc bỏ qua quy tắc này.

Hình 2. Bảng định nghĩa Flags

Để thiết lập nhiều quy tắc cùng lúc, chúng ta có thể dùng toán tử Bitwise OR để “ghép” các quy tắc này với nhau. Giả sử với 3 quy tắc: “No whitespace allowed in the entire string”, “A digit must occur at least once” và “A special character must occur at least once”, chúng ta có thể thiết lập bằng lệnh:

validator.setOptionFlags(FLAG_HAS_NO_WHITESPACE | FLAG_HAS_DIGIT | FLAG_HAS_SPECIAL_CHARS);

Kiểm thử PasswordPolicyChecker

Chương trình kiểm thử (Unit Test) được viết trong lớp PasswordPolicyCheckerTest. Mã nguồn ví dụ được chia sẻ trên github, các bạn có thể tải ví dụ về để chạy thử trên máy tính của mình.

Comments