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à:
- Phải có ít nhất một chữ số.
- Phải có ít nhất một ký tự viết hoa và một ký tự viết thường.
- Nên có ít nhất một ký tự đặc biệt.
- 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: