Xác thực Password với biểu thức chính quy (Regular Expression) trong Python



Trong bài viết trước, ta được tìm hiểu về cách Xác thực địa chỉ Email với biểu thức chính quy (Regular Expression) trong Python, nếu các bạn chưa đọc, bạn có thể đọc lại bài viết này để nắm bắt cơ bản về Biểu thức chính quy và cách sử dụng chúng để xác thực địa chỉ Email có hợp lệ hay không. Trong bài viết này, ta tìm hiểu về xác thực password có đạt được tiêu chí đã đề ra trước đó hay không.

Yêu cầu xác thực mật khẩu

Mật khẩu là sự kết hợp của các ký tự là chữ (chữ hoa và chữ thường), các chữ số (từ 0 đến 9) và các ký tự đặc biệt, nhằm xác nhận danh tính của người dùng. Giống như cơ chế ổ khoá và chìa khoá vậy. Bạn không thể đăng nhập vào tài khoản nếu không nhập chính xác mật khẩu.
Yêu cầu đưa ra, kiểm tra chuỗi (xâu) ký tự được nhập vào từ bàn phím ở ô nhập mật khẩu có hợp lệ với các điều kiện của hệ thống đã đề ra trước đó hay chưa.
Thông thường, điều kiện để có mật khẩu hợp lệ là:

  1. Phải có ít nhất một chữ số.
  2. Phải có ít nhất một ký tự viết hoa và một ký tự viết thường.
  3. Nên có ít nhất một ký tự đặc biệt.
  4. Nên dài từ 6 đến 20 ký tự.

Ví dụ:
Đầu vào: qwertyABC@123
Đầu ra: Mật khẩu hợp lệ
Đầu vào: 123
Đầu ra: Mật khẩu không hợp lệ

Cách 1: Sử dụng phương pháp “cày chay” (tức không dùng RegEx)

# hàm kiểm tra tính hợp lệ của mật khẩu
def kiem_tra_mat_khau(password):
    # ký tự đặc biệt
    SpecialSym =['$', '@', '#', '%']
    # biến cờ lưu giá trị kết quả kiểm tra
    val = True
     
    # kiểm tra độ dài
    if len(password) < 6: print('Chiều dài tối thiểu của mật khẩu là 6 ký tự!') val = False if len(password) > 20:
        print('Chiều dài của mật khẩu không lớn hơn 20 ký tự!')
        val = False
         
    # kiểm tra mật khẩu chứa số
    if not any(char.isdigit() for char in password):
        print('Mật khẩu phải có ít nhất một chữ số!')
        val = False
         
    # kiểm tra mật khẩu chứa ký tự chữ hoa
    if not any(char.isupper() for char in password):
        print('Mật khẩu phải có ít nhất một chữ in hoa!')
        val = False
         
    # kiểm tra mật khẩu chứa ký tự chữ thường
    if not any(char.islower() for char in password):
        print('Mật khẩu phải có ít nhất một chữ in thường!')
        val = False
         
    if not any(char in SpecialSym for char in password):
        print('Mật khẩu phải có ít nhất một trong các ký tự đặc biệt: $@#')
        val = False
    if val:
        return val

# chương trình chính
if __name__ == "__main__":
    pass1 = "qwertyABC@123"
    if kiem_tra_mat_khau(pass1):
        print("Mật khẩu hợp lệ!")
    else:
        print("Mật khẩu không hợp lệ!")
    
    pass2 = "123"
    if kiem_tra_mat_khau(pass2):
        print("Mật khẩu hợp lệ!")
    else:
        print("Mật khẩu không hợp lệ!")

Cách 2: Xác thực mật khẩu hợp lệ bằng biểu thức chính quy

Đối với cách 1, ta thấy độ phức tạp của hàm không đáng kể, nhưng xét về khối lượng các mã lệnh thì cần suy nghĩ khi lựa chọn cách này. Cách dưới đây sử dụng biểu thức chính quy để kiểm tra tính xác thực của mật khẩu có đạt được những tiêu chí đã liệt kê ở trên hay không. Hàm này trả về giá trị True nếu mật khẩu truyền vào qua đối số là hợp lệ. Ngược lại, hàm trả về giá trị False nếu mật khẩu không hợp lệ.

# thêm thư viện
import re

# hàm kiểm tra tính hợp lệ của mật khẩu
def kiem_tra_mat_khau(password):
    # regex
    reg = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!#%*?&]{6,20}$"
    # compiling regex
    pat = re.compile(reg)
     
    # searching regex                 
    mat = re.search(pat, password)
     
    # validating conditions
    if mat:
        return True
    else:
        return False
 

# chương trình chính
if __name__ == "__main__":
    pass1 = "qwertyABC@123"
    if kiem_tra_mat_khau(pass1):
        print("Mật khẩu hợp lệ!")
    else:
        print("Mật khẩu không hợp lệ!")
    
    pass2 = "123"
    if kiem_tra_mat_khau(pass2):
        print("Mật khẩu hợp lệ!")
    else:
        print("Mật khẩu không hợp lệ!")

Cách 3: Xác thực mật khẩu hợp lệ bằng ASCII

Cách này cũng được gọi là một dạng lập trình cày chay khi không sử dụng biểu thức chính quy. Thay vào đó, ta dùng vòng lặp để duyệt và kiểm tra lần lượt các ký tự có thoả mãn được kiều kiện hợp lệ của mật khẩu hay không. Ta dễ dàng nhận thấy độ phức tạp thuật toán của cách này là O(n) với n là độ dài (số lượng) các ký tự trong mật khẩu.

# hàm kiểm tra tính hợp lệ của mật khẩu
def kiem_tra_mat_khau(password):
    SpecialSym =['$', '@', '#', '%']
    val = True
    if len(password) < 6: print('Chiều dài tối thiểu của mật khẩu là 6 ký tự!') val = False if len(password) > 20:
        print('Chiều dài của mật khẩu không lớn hơn 20 ký tự!')
        val = False
 
    # Kiểm tra xem mật khẩu có chứa ít nhất một chữ số, chữ hoa, chữ thường và ký hiệu đặc biệt không
    has_digit = False
    has_upper = False
    has_lower = False
    has_sym = False
    for char in password:
        if ord(char) >= 48 and ord(char) <= 57: has_digit = True elif ord(char) >= 65 and ord(char) <= 90: has_upper = True elif ord(char) >= 97 and ord(char) <= 122:
            has_lower = True
        elif char in SpecialSym:
            has_sym = True
 
    if not has_digit:
        print('Mật khẩu phải có ít nhất một chữ số!')
        val = False
    if not has_upper:
        print('Mật khẩu phải có ít nhất một chữ in hoa!')
        val = False
    if not has_lower:
        print('Mật khẩu phải có ít nhất một chữ in thường!')
        val = False
    if not has_sym:
        print('Mật khẩu phải có ít nhất một trong các ký tự đặc biệt: $@#')
        val = False
 
    return val 

# chương trình chính
if __name__ == "__main__":
    pass1 = "qwertyABC@123"
    if kiem_tra_mat_khau(pass1):
        print("Mật khẩu hợp lệ!")
    else:
        print("Mật khẩu không hợp lệ!")
    
    pass2 = "123"
    if kiem_tra_mat_khau(pass2):
        print("Mật khẩu hợp lệ!")
    else:
        print("Mật khẩu không hợp lệ!")

Tài liệu tham khảo:

  1. www.geeksforgeeks.org
  2. www.programiz.com
  3. www.w3schools.com

You may also like...

Trả lời