Xây dựng hệ thống mạng bảo mật đòi hỏi nhiều hơn chỉ hệ thống an ninh hậu phương; đầu trước đóng vai trò quan trọng trong việc hướng dẫn người dùng về hành vi an toàn. Một trong những cách hiệu quả nhất để cải thiện vệ sinh mật khẩu là đồng hồ đo sức mạnh mật khẩu có khả năng hoạt động ngay lập tức. Trong khi khái niệm này đơn giản, đồng hồ sản xuất phải xử lý các trường hợp cạnh, cung cấp các dấu hiệu trực quan rõ ràng, và tránh sự tự tin sai. Trong hướng dẫn toàn diện này, bạn sẽ học cách xây dựng một mét mật khẩu JavaScript từ đầu có khả năng quan hơn, khả năng truy cập và các thực hiện an ninh tốt nhất.

Tại sao mật khẩu có sức mạnh hơn?

Mật khẩu yếu vẫn còn nguyên nguyên nhân đầu của sự thỏa hiệp tài khoản. Theo [FLT: 0] [FLT: 1] [FLT:], nhiều người dùng vẫn còn dựa vào các mẫu có thể đoán trước như "cấu 123". Một đồng hồ tăng tốc độ cho người dùng mật khẩu phức tạp hơn, dài hơn, không cần thiết họ phải hiểu các tính toán ngẫu nhiên. Nghiên cứu Google và Mellon phát hiện rằng phản hồi sức mạnh có thể tăng đáng kể mật khẩu hơn các quy tắc tĩnh.

Tuy nhiên, một mét chỉ tốt như cách đánh giá logic của nó. một mét không được thiết kế có thể nhãn "Patwoct1!" mạnh (khi nó thực sự phổ biến) hoặc làm nản lòng người dùng với quy tắc quá nghiêm ngặt. độ phức tạp tốt nhất là cân bằng với khả năng sử dụng và sử dụng nhiều lớp phân tích.

Name

Trước khi viết mã, xác định những gì tạo ra mật khẩu "mạnh". Những quy tắc đơn giản như độ dài và tính đa dạng nhân vật là bắt đầu, nhưng mô hình đe dọa hiện đại cũng xem xét các mẫu, từ điển và các thay thế phổ biến. Đối với dự án này, chúng tôi sẽ thực hiện một hệ thống ghi đè dựa trên các yếu tố sau, theo sát các chỉ dẫn từ [FLT: 0] [FLT: 0] [FL:1): 1]:

  • Lungth ): tối thiểu 8 ký tự, với phần thưởng tăng lên đến 20 ký tự+.
  • Thay đổi ): chữ thường, chữ số, ký tự đặc biệt.
  • Ký tự ):
  • Mô hình giao diện ): bước đi đơn giản (qwerty), ngày tháng, hoặc từ phổ biến.
  • Định nghĩa [FLT: 1]: sức mạnh bit dựa trên bộ ký tự và chiều dài có thể.

Để có một hệ thống sản xuất, hãy xem xét việc kết hợp một thư viện như [FLT: 0] [FLT: 1] [FLT: 1] từ Dropbox, dùng mẫu khớp và phân tích tần số. Đối với bài này, chúng tôi sẽ tạo một số đếm riêng bao gồm ba tiêu chuẩn đầu tiên - đủ cho nhiều trường hợp sử dụng rồi chỉ ra cách mở rộng nó với zxcbn.

Kiến trúc của mật khẩu có sức mạnh hơn

Đồng hồ gồm ba lớp:

  1. cấu trúc HTML – trường nhập, vùng phản hồi trực tiếp, và thanh tiến bộ hình ảnh.
  2. Mở bằng ) – các đoạn có mã màu và chỉ thị khả năng truy cập thân thiện.
  3. logicJava ) – Sự kiện xử lý, ghi điểm và UI cập nhật với sự không chắc chắn cho hiệu suất.

Chúng tôi sẽ xây dựng nó như một thành phần đứng vững có thể được đưa vào bất kỳ hình thức nào.

Bước 1: Cấu trúc HTML với khả năng truy cập trong tâm trí

Dùng ngữ nghĩa HTML5 với vùng để người đọc màn hình thông báo thay đổi sức mạnh. Đồng hồ này nên bao gồm điểm số (có thể ẩn) và thanh tiến bộ hiển thị.

<div class="password-field">
 <label for="password">Choose a password:</label>
 <input type="password" id="password" autocomplete="new-password" />
 <div class="strength-meter" role="status" aria-live="polite">
 <div class="strength-bar" id="strength-bar"></div>
 <span class="strength-text" id="strength-text">Weak</span>
 </div>
</div>

đảm bảo rằng những thay đổi động được thông báo mà không ngắt lời người dùng.

Bước 2: CNP mình để xem lại thị giác rõ ràng

Dùng thanh tiến trình chuyển đổi tuyến tính thay đổi màu: đỏ sang vàng. Bao gồm một hoạt cảnh tinh tế để thu hút sự chú ý. Giữ nó đơn giản và dễ truy cập — đảm bảo độ tương phản màu tương phản đầy đủ.

.strength-meter {
 margin-top: 0.5rem;
 height: 1rem;
 border-radius: 4px;
 background-color: #e0e0e0;
}
.strength-bar {
 height: 100%;
 width: 0%;
 border-radius: 4px;
 transition: width 0.3s ease, background-color 0.3s ease;
}
.strength-text {
 display: block;
 margin-top: 4px;
 font-weight: bold;
 font-size: 0.9rem;
}

Bước 3: logic JavaScript – Thuật toán dao động

Giải một hàm số mà trả lại một điểm (0–100) và một nhãn tương ứng. chúng tôi sẽ thưởng rất nhiều, cho điểm cho sự đa dạng của ký tự, và trừ cho lặp lại.

function evaluateStrength(password) {
 let score = 0;

 // Length bonuses (exponential)
 if (password.length >= 8) score += 20;
 if (password.length >= 12) score += 20;
 if (password.length >= 16) score += 20;
 if (password.length >= 20) score += 20;

 // Character variety
 if (/[a-z]/.test(password)) score += 5;
 if (/[A-Z]/.test(password)) score += 5;
 if (/[0-9]/.test(password)) score += 5;
 if (/[^a-zA-Z0-9]/.test(password)) score += 10;

 // Penalty for repeated characters (3+ consecutive same)
 const repeats = password.match(/(.)\1{2,}/g);
 if (repeats) {
 const penalty = repeats.reduce((acc, seq) => acc + seq.length, 0) * 2;
 score = Math.max(0, score - penalty);
 }

 // Clamp score to 0–100
 return Math.min(100, Math.max(0, score));
}

function getStrengthLabel(score) {
 if (score < 30) return 'Weak';
 if (score < 60) return 'Moderate';
 if (score < 85) return 'Strong';
 return 'Very Strong';
}

Thuật toán này nhỏ nhẹ và chạy theo mili giây ngay cả trên mật khẩu dài. Đối với ứng dụng sản xuất, hãy cân nhắc đánh giá thời gian để tránh chặn sợi chính khi đầu vào cực dài (mặc dù hiếm).

Bước 4: Làm giảm các sự kiện nhập

Đánh giá các phím có thể gây ra vấn đề hiệu suất, đặc biệt nếu bạn tích hợp với thư viện nặng như zxcvn. Dùng chức năng debounce để hoãn việc đánh giá cho đến khi người dùng dừng gõ cho 300m.

const input = document.getElementById('password');
const strengthBar = document.getElementById('strength-bar');
const strengthText = document.getElementById('strength-text');
let debounceTimer;

input.addEventListener('input', function() {
 clearTimeout(debounceTimer);
 debounceTimer = setTimeout(() => {
 const score = evaluateStrength(this.value);
 updateUI(score);
 }, 300);
});

function updateUI(score) {
 const label = getStrengthLabel(score);
 strengthBar.style.width = score + '%';
 strengthBar.style.backgroundColor = getColor(score);
 strengthText.textContent = label;
}

function getColor(score) {
 if (score < 30) return '#e53935'; // red
 if (score < 60) return '#fb8c00'; // orange
 if (score < 85) return '#43a047'; // green
 return '#1b5e20'; // dark green
}

Bước 5: Tăng cường – Hợp nhất zxcvn

Các bộ đánh giá tự chọn bỏ qua các mẫu mật khẩu chung. Thư viện của máy thả xuống của zxcvbn dùng một từ điển tần số và mẫu khớp để tạo ra một điểm chính xác hơn. Để kết hợp nó, nạp thư viện qua CDN và thay thế logic đánh giá trong khi giữ cùng một hệ thống UI.

<script src="https://cdnjs.cloudflare.com/ajax/libs/zxcvbn/4.4.2/zxcvbn.js"></script>

Sau đó trong rebounce gọi trở lại:

const result = zxcvbn(this.value);
const score = result.score; // 0-4
updateUI(score * 25); // map to 0-100

Bạn cũng có thể hiển thị gợi ý từ để hướng dẫn người dùng tới mật khẩu mạnh hơn.

Bước 6: Hợp nhất và báo đáp

Đừng dừng lại tại đồng hồ. Liên kết nó với bộ quản lý gởi đơn. Nếu điểm mật khẩu quá thấp, hãy ngăn chặn sự gửi thư và hiển thị thư. Cũng thực hiện việc bật/ tắt mật khẩu để người dùng có thể xem dữ liệu nhập của họ — điều này giảm sự thất vọng.

const showToggle = document.getElementById('show-password');
showToggle.addEventListener('change', function() {
 input.type = this.checked ? 'text' : 'password';
});

document.querySelector('form').addEventListener('submit', function(e) {
 const score = evaluateStrength(input.value);
 if (score < 30) {
 e.preventDefault();
 alert('Password is too weak. Please choose a stronger one.');
 }
});

Những sự xem xét an ninh

Một đồng hồ năng lượng bên khách hàng là hữu ích cho UX nhưng không bao giờ coi nó như một cơ chế bảo mật. Luôn luôn thực thi chính sách mật khẩu mạnh ở phía máy phục vụ. Không bao giờ gửi mật khẩu nhập khẩu cho máy phục vụ để đánh giá – mà sẽ phơi bày nó trong lúc đi lại. Dùng HTTPS và hashing (bcrypt, argon2) để lưu trữ. Không nên lưu hoặc lưu mật khẩu theo bất cứ cách nào.

Cũng xem xét rằng phản hồi của đồng hồ có thể được sử dụng bởi một kẻ tấn công để thu hẹp không gian mật khẩu nếu họ có thể quan sát kết xuất UI. Trong môi trường bảo mật cao, bạn có thể muốn hạn chế phản hồi sức mạnh hoặc sử dụng entropy ước tính mà không tiết lộ điểm chính xác.

Kiểm tra hiệu lực của mật khẩu

Kiểm tra các đơn vị cho các chức năng ghi đè bằng các trường hợp thử nghiệm phổ biến:

  • "Dài qua" Wak (scre < 30)
  • "P@sw0rd123!" vội vàng (scre > 60)
  • "a" yếu đuối
  • "Horse-Battery-Staple" rất mạnh
  • "11111111" WAK (hình phạt nhân vật bị hủy bỏ)

Thử ra khả năng truy cập bằng cách định vị bàn phím và trình đọc màn hình. Vùng nên thông báo thay đổi sức mạnh sau một tạm dừng ngắn.

Cách tô màu

Nếu bạn dùng zxcvn, hãy xem xét tải nó lên asychin với tính năng nhập hay hoãn lại. Để mật khẩu (100 ký tự+), việc đánh giá là 100 ký tự đầu tiên để tránh bị giảm tốc độ chậm. Giảm thiểu lực vẫn còn quan trọng — đặt sự chậm tới 250–400ms. Trên thiết bị di động, hãy cân nhắc giảm thời gian bị ngắt quãng xuống 200m để đáp ứng.

Tuỳ biến và làm quen

Cho phép các nhà phát triển ghi đè lên màu, ngưỡng và ghi đè trọng lượng qua một đối tượng cấu hình. Cung cấp một giao diện gọi lại để đồng hồ có thể được kết hợp với máy phát điện mật khẩu, danh sách đen mật khẩu chung, hoặc máy tính entropy.

function createStrengthMeter(inputEl, options = {}) {
 const config = {
 minLength: options.minLength || 8,
 colors: options.colors || ['#e53935', '#fb8c00', '#43a047', '#1b5e20'],
 thresholds: options.thresholds || [30, 60, 85]
 };
 // ... rest of the plugin logic
}

Kết luận

Xây dựng đồng hồ mật khẩu JavaScript là một cách thực tế để cải thiện an ninh người dùng mà không thêm ma sát. Ví dụ trong bài này cung cấp một nền tảng vững chắc: một thuật toán ghi đè, hủy bỏ tiến trình xử lý, truy cập HTML và phản hồi thị giác. Đối với ứng sản xuất, xem xét tích hợp zxcvn để phát hiện mẫu nâng cao và luôn luôn kết hợp đồng mét với các chính sách mật khẩu bên máy chủ. Bằng cách theo những thực hiện tốt nhất, bạn trao quyền cho người dùng tạo mật khẩu mạnh hơn trong khi duy trì một kinh nghiệm người dùng mịn.