Kiểm tra mật khẩu theo các quy tắc phổ biến: độ dài, chữ hoa, chữ thường, số, ký tự đặc biệt, không khoảng trắng.
Yêu cầu mẫu
- Độ dài: 8 - 14 ký tự
- Ít nhất 1 chữ thường
- Ít nhất 1 chữ hoa
- Ít nhất 1 chữ số
- Ít nhất 1 ký tự đặc biệt
- Không chứa khoảng trắng
Mã nguồn (Regex - khuyên dùng)
using System;
using System.Text.RegularExpressions;
public class PasswordValidator {
// Regex pattern: ít nhất 1 hoa, 1 thường, 1 số, 1 đặc biệt, 8-14 ký tự, không space
private static readonly Regex PasswordRegex = new Regex(
@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':""\\|,.<>\/?]).{8,14}$",
RegexOptions.Compiled
);
public static bool IsValid(string password) {
if (string.IsNullOrWhiteSpace(password)) return false;
if (password.Contains(" ")) return false; // Không space
return PasswordRegex.IsMatch(password);
}
public static void Main() {
string[] tests = { "Abc123!", "Abcdefg1!", "ABCDEFG1!", "abcdefg1!", "Abc12345" };
foreach (var pwd in tests) {
Console.WriteLine($"{pwd,-15} : {(IsValid(pwd) ? "Hợp lệ" : "Không hợp lệ")}");
}
}
}
Kết quả
Abc123! : Không hợp lệ (quá ngắn)
Abcdefg1! : Hợp lệ
ABCDEFG1! : Không hợp lệ (thiếu chữ thường)
abcdefg1! : Không hợp lệ (thiếu chữ hoa)
Abc12345 : Không hợp lệ (thiếu ký tự đặc biệt)
Giải thích Regex
^- Bắt đầu chuỗi(?=.*[a-z])- Lookahead: có ít nhất 1 chữ thường(?=.*[A-Z])- Lookahead: có ít nhất 1 chữ hoa(?=.*\d)- Lookahead: có ít nhất 1 chữ số(?=.*[!@#$%^&*()...])- Lookahead: có ít nhất 1 ký tự đặc biệt.{8,14}- 8 đến 14 ký tự bất kỳ (trừ newline)$- Kết thúc chuỗi
Cách không dùng Regex (dễ hiểu)
public static bool ValidatePassword(string pwd) {
if (string.IsNullOrWhiteSpace(pwd)) return false;
if (pwd.Length < 8 || pwd.Length > 14) return false;
if (pwd.Contains(" ")) return false;
bool hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false;
string special = "!@#$%^&*()_+-=[]{};':\"\\|,.<>/?";
foreach (char c in pwd) {
if (char.IsLower(c)) hasLower = true;
else if (char.IsUpper(c)) hasUpper = true;
else if (char.IsDigit(c)) hasDigit = true;
else if (special.Contains(c)) hasSpecial = true;
}
return hasLower && hasUpper && hasDigit && hasSpecial;
}
Lưu ý bảo mật
- Không lưu mật khẩu plaintext — luôn hash (bcrypt, Argon2, PBKDF2).
- Kiểm tra mật khẩu yếu (common passwords list, HaveIBeenPwned API).
- Yêu cầu độ dài tối thiểu 12+ ký tự hiện nay (NIST guideline).