Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Chương trình C# kiểm tra tính hợp lệ mật khẩu (Password Validation)

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).