Cập nhật lần cuối:
Độ dài mật khẩu và bảo mật - Chọn độ dài phù hợp
Độ dài mật khẩu là yếu tố quan trọng nhất trong bảo mật mật khẩu. Mỗi ký tự bổ sung nhân số lượng tổ hợp có thể lên khoảng 95 lần, khiến các cuộc tấn công brute-force khó hơn theo cấp số nhân. Hướng dẫn này đi sâu hơn những lời khuyên bề mặt, bao gồm cách tính entropy, chi phí hàm băm, bậc độ lớn của thời gian cần cho tấn công vét cạn, so sánh passphrase với chuỗi ngẫu nhiên, và chiến lược xác thực đa yếu tố - tất cả dựa trên NIST SP 800-63B phiên bản thứ tư, công bố năm 2025.
Entropy và độ mạnh mật khẩu
Entropy, đo bằng bit, định lượng mức độ khó đoán của mật khẩu. Công thức rất đơn giản:
Entropy (bits) = log2(charset sizelength) = length × log2(charset size)
Với bộ ký tự ASCII in được đầy đủ gồm 95 ký tự, mỗi ký tự đóng góp khoảng 6,57 bit entropy. Mật khẩu 8 ký tự cho khoảng 52,6 bit, 12 ký tự khoảng 78,8 bit, và 16 ký tự khoảng 105,1 bit. Entropy không có một ngưỡng tuyệt đối nào để tuyên bố là "an toàn": con số này chỉ có ý nghĩa khi được đặt cạnh tốc độ thử của kẻ tấn công. Cùng một mật khẩu 60 bit có thể trụ rất lâu nếu dịch vụ lưu trữ bằng một hàm băm chậm, nhưng sụp đổ nhanh nếu dữ liệu bị đánh cắp lại được băm bằng một hàm nhanh. Vì vậy hãy đọc entropy như một thang so sánh giữa các mật khẩu, chứ không phải như một giấy chứng nhận an toàn.
Một nhận định quan trọng: tăng độ dài hiệu quả hơn tăng sự đa dạng ký tự. Mật khẩu 16 ký tự chỉ dùng chữ thường (26 ký tự) có khoảng 75,2 bit entropy - gần bằng mật khẩu 12 ký tự sử dụng toàn bộ 95 ký tự (78,8 bit). Kéo dài mật khẩu chữ thường đó lên 20 ký tự và entropy đạt khoảng 94 bit, vượt qua mật khẩu 14 ký tự dùng đầy đủ bộ ký tự (khoảng 92 bit). Đây là cơ sở toán học cho lý do tại sao độ dài quan trọng hơn độ phức tạp.
Hướng dẫn NIST SP 800-63B
NIST SP 800-63B phiên bản thứ tư được công bố tháng 8 năm 2025 và thay thế các phiên bản trước đó, trở thành tài liệu tham chiếu cho chính sách mật khẩu. Tài liệu cấm việc bắt buộc quy tắc cấu tạo và bắt buộc đổi mật khẩu theo định kỳ, đồng thời đặt độ dài làm yếu tố bảo mật chính.
- Mật khẩu dùng một mình: tối thiểu 15 ký tự (yêu cầu bắt buộc, SHALL)
- Mật khẩu dùng làm một yếu tố trong xác thực đa yếu tố: tối thiểu 8 ký tự (SHALL)
- Độ dài tối đa: dịch vụ nên cho phép ít nhất 64 ký tự (khuyến nghị, SHOULD)
- Cấm bắt buộc quy tắc cấu tạo, tức là không được buộc người dùng phải có chữ hoa, chữ số hay ký hiệu
- Cấm bắt buộc đổi mật khẩu theo định kỳ - chỉ được buộc đổi khi có bằng chứng mật khẩu đã bị lộ
- Bắt buộc đối chiếu với danh sách chặn: dịch vụ phải so mật khẩu mới với danh sách các mật khẩu đã rò rỉ hoặc quá dễ đoán, và đối tượng so sánh là toàn bộ mật khẩu chứ không phải từng phần của nó
- Không có yêu cầu về mức entropy tối thiểu: tài liệu không đặt ra ngưỡng bit nào, mà chỉ quy định số ký tự và việc đối chiếu danh sách chặn
Lý do tài liệu đi xa đến mức cấm hẳn quy tắc cấu tạo là vì trên thực tế người dùng đáp ứng quy tắc bằng biến đổi nhỏ nhất có thể: thêm "1" và "!" vào cuối, hoặc viết hoa chữ cái đầu. Những biến đổi đó nằm ngay trong các mẫu mà công cụ dò mật khẩu thử trước tiên, nên không gian tìm kiếm thực tế gần như không rộng thêm, trong khi mật khẩu lại khó nhớ hơn.
Thời gian cần cho tấn công vét cạn
Bảng dưới đây là một ví dụ tính toán, không phải số đo trên một thiết bị cụ thể. Giả định kẻ tấn công thử được 1011 lần mỗi giây trên một hàm băm nhanh, và mật khẩu được sinh ngẫu nhiên từ bộ 95 ký tự ASCII in được. Điều đáng đọc ở đây là bậc độ lớn: cứ thêm hai ký tự thì thời gian dài ra khoảng 9.000 lần.
| Độ dài | Tổ hợp | Entropy | Thời gian với giả định 1011 lần thử/giây |
|---|---|---|---|
| 6 ký tự | ~7,35 × 1011 | ~39,4 bit | ~7 giây |
| 8 ký tự | ~6,63 × 1015 | ~52,6 bit | ~18 giờ |
| 10 ký tự | ~5,99 × 1019 | ~65,7 bit | ~19 năm |
| 12 ký tự | ~5,4 × 1023 | ~78,8 bit | ~1,7 × 105 năm |
| 16 ký tự | ~4,4 × 1031 | ~105,1 bit | ~1,4 × 1013 năm |
Tốc độ giả định ở trên chỉ có nghĩa với một hàm băm nhanh. Nếu dịch vụ lưu mật khẩu bằng một hàm băm được thiết kế cho mục đích đó, số lần thử mỗi giây giảm đi nhiều bậc độ lớn và cùng một mật khẩu sẽ trụ lâu hơn rất nhiều. Ngược lại, hệ thống dùng hàm băm nhanh khiến mật khẩu ngắn sụp đổ gần như tức thời. Vì người dùng không chọn được thuật toán băm phía máy chủ, cách phòng thủ nằm trong tầm tay vẫn là đặt mật khẩu đủ dài.
Chi phí hàm băm và độ dài mật khẩu
Bảo mật mật khẩu không chỉ phụ thuộc vào độ dài mà còn vào chi phí tính toán của hàm băm phía máy chủ. Dưới đây là so sánh các thuật toán chính:
| Thuật toán | Vị trí trong việc lưu trữ mật khẩu |
|---|---|
| MD5 | Hàm băm đa dụng, được thiết kế để chạy nhanh, nên không phù hợp cho lưu trữ mật khẩu. Vẫn còn tồn tại trong các hệ thống cũ |
| SHA-256 | Cũng là hàm băm đa dụng và vẫn quá nhanh cho mục đích lưu mật khẩu, dù chậm hơn MD5 |
| bcrypt | Được thiết kế để cố ý chậm, với hệ số chi phí điều chỉnh được. Đầu vào bị giới hạn 72 byte |
| Argon2id | Bên thắng cuộc thi Password Hashing Competition năm 2015 và là lựa chọn đầu tiên được RFC 9106 khuyến nghị. Thiết kế memory-hard nên khó tăng tốc bằng song song hóa |
| scrypt | Cũng theo thiết kế memory-hard, ra đời trước Argon2 |
bcrypt cắt đầu vào ở 72 byte, nghĩa là mật khẩu chỉ dùng ASCII bị giới hạn hiệu quả ở 72 ký tự, và văn bản tiếng Nhật UTF-8 khoảng 24 ký tự. Hạn chế này ảnh hưởng trực tiếp đến độ dài mật khẩu tối đa trên một số nền tảng. Argon2id không có hạn chế như vậy và có thể xử lý mật khẩu có độ dài tùy ý. Các dịch vụ mới nên ưu tiên Argon2id.
Ngay cả với hàm băm chậm như bcrypt hoặc Argon2id, mật khẩu ngắn vẫn dễ bị tấn công từ điển và tấn công dựa trên quy tắc. Chi phí băm là chiến thuật trì hoãn; biện pháp phòng thủ cơ bản là độ dài đủ lớn (entropy).
Tại sao độ dài quan trọng hơn độ phức tạp
Nhiều dịch vụ yêu cầu "ít nhất một chữ hoa, một số và một ký hiệu", nhưng NIST rõ ràng bác bỏ cách tiếp cận này. Các con số nói lên tất cả.
"P@ssw0rd!" có 9 ký tự và đủ cả bốn loại ký tự, nhưng nó nằm trong những danh sách mật khẩu bị rò rỉ phổ biến nhất, nên bị dò ra gần như ngay lập tức. Ngược lại, bốn từ được chọn ngẫu nhiên từ một danh sách 7.776 từ - cách làm quen thuộc của phương pháp Diceware - cho khoảng 51,7 bit entropy, và sáu từ cho khoảng 77,5 bit, trong khi vẫn dễ nhớ hơn nhiều so với chín ký tự rối rắm kia.
Cũng cần hiểu rằng các phép thay thế kiểu l33t, chẳng hạn a thành @, o thành 0 hay i thành 1, không mở rộng không gian tìm kiếm. Công cụ dò mật khẩu áp dụng đúng những phép thay thế đó lên từ điển trước khi chuyển sang vét cạn, nên "P@ssw0rd" bị thử gần như cùng lúc với "password"; người dùng phải ghi nhớ thêm một quy tắc biến đổi mà hầu như không nhận lại chút an toàn nào.
Quy tắc phức tạp phản tác dụng vì ba lý do. Thứ nhất, người dùng đáp ứng yêu cầu bằng các mẫu dễ đoán (viết hoa chữ đầu, thêm "1!"). Thứ hai, mật khẩu phức tạp khó nhớ nên người dùng giữ chúng ngắn. Thứ ba, mật khẩu không thể nhớ được cuối cùng bị lưu dạng văn bản thuần trên giấy nhớ hoặc tệp văn bản.
Passphrase so với chuỗi ngẫu nhiên
Có hai cách tiếp cận để tạo mật khẩu dài: passphrase và chuỗi ký tự ngẫu nhiên. Mỗi cách có những đánh đổi riêng.
| Khía cạnh | Passphrase | Chuỗi ngẫu nhiên |
|---|---|---|
| Ví dụ | correct horse battery staple | kX9#mP2$vL7@nQ4 |
| Độ dài | 28 ký tự | 15 ký tự |
| Entropy | ~51,7 bit (4 từ từ danh sách 7.776 từ) | ~98,5 bit (95 ký tự × 15 ký tự) |
| Khả năng ghi nhớ | Cao (nhớ theo câu chuyện) | Thấp (cần trình quản lý mật khẩu) |
| Dễ gõ | Cao (gõ bình thường) | Thấp (ký tự đặc biệt bất tiện) |
| Khả năng chống tấn công từ điển | Phụ thuộc vào số từ và kích thước danh sách | Cực kỳ cao |
Hãy để ý sự chênh lệch trong bảng: passphrase dài gần gấp đôi về số ký tự nhưng entropy lại thấp hơn chuỗi ngẫu nhiên 15 ký tự. Với passphrase, đơn vị ngẫu nhiên là từ chứ không phải ký tự, nên đánh giá độ mạnh bằng số ký tự sẽ phóng đại rất nhiều so với thực tế. Độ mạnh của passphrase phụ thuộc vào số lượng từ và kích thước danh sách từ. Sáu từ Diceware (từ danh sách 7.776 từ) cho khoảng 77,5 bit entropy. Chỉ sử dụng các từ thông dụng hàng ngày sẽ làm yếu passphrase trước tấn công từ điển, vì vậy việc kết hợp các từ không liên quan một cách ngẫu nhiên là thiết yếu. "My cat is cute" là một passphrase kém; "chair purple submarine cayenne galaxy" mạnh hơn nhiều.
Sử dụng passphrase cho mật khẩu chính (mở khóa trình quản lý mật khẩu) và chuỗi ngẫu nhiên do trình quản lý mật khẩu tạo cho các tài khoản dịch vụ riêng lẻ.
Đối diện với giới hạn độ dài của dịch vụ
Giới hạn độ dài khác nhau rất nhiều giữa các dịch vụ, và phần lớn dịch vụ không công bố con số cụ thể ở chỗ dễ tìm. Vì vậy cách chắc chắn nhất là tự kiểm tra trên tài khoản của mình: thử đặt một mật khẩu 32 ký tự do trình quản lý mật khẩu sinh ra, nếu bị từ chối thì hạ xuống 24 ký tự, rồi 16 ký tự, cho đến khi được chấp nhận. Con số dừng lại chính là giới hạn thực tế của dịch vụ đó, và nên được ghi vào phần ghi chú của mục mật khẩu để lần sau không phải thử lại.
Giới hạn tối đa thường có hai nguyên nhân kỹ thuật. Thứ nhất, bcrypt cắt đầu vào ở 72 byte, nên các hệ thống dùng nó có lý do đặt trần quanh mức đó. Thứ hai, những hệ thống được thiết kế từ thời dữ liệu được lưu trong cột có độ dài cố định thường giữ nguyên trần cũ, kể cả sau khi thuật toán băm đã được thay. Nói cách khác, một trần ngắn phản ánh tuổi của hệ thống hơn là một chủ ý bảo mật nào đó.
- Đặt mật khẩu dài nhất trong phạm vi dịch vụ cho phép, thay vì lấy mức tối thiểu làm mục tiêu
- Với dịch vụ có trần ngắn, hãy bù lại bằng xác thực đa yếu tố, vì phần độ dài bị mất không thể lấy lại bằng cách thêm ký hiệu
- Ngay cả khi dịch vụ chỉ đòi 6 hay 8 ký tự, độ dài bạn thực sự đặt vẫn do bạn quyết định: mức tối thiểu là sàn của dịch vụ, không phải mục tiêu của người dùng
Sức mạnh kết hợp xác thực đa yếu tố
Dù mật khẩu dài đến đâu, nó trở nên vô dụng nếu bị đánh cắp qua phishing hoặc keylogger. Độ dài mật khẩu bảo vệ chống tấn công brute-force, trong khi xác thực đa yếu tố (MFA) bảo vệ chống đánh cắp thông tin đăng nhập - các vector tấn công khác nhau bổ sung cho nhau mạnh mẽ.
- TOTP (Mật khẩu dùng một lần dựa trên thời gian): Các ứng dụng như Google Authenticator hoặc Authy tạo mã 6 chữ số làm mới mỗi 30 giây. Mã bị đánh cắp hết hạn nhanh, nhưng proxy phishing thời gian thực có thể chuyển tiếp chúng trước khi hết hạn
- FIDO2 / WebAuthn (Passkeys): Khóa bảo mật vật lý hoặc sinh trắc học của thiết bị cho khả năng chống phishing mạnh nhất. Cơ chế nằm ở chỗ khóa được gắn với thông tin của bên mà nó đã đăng ký: khi đăng nhập, trình duyệt chỉ tạo chữ ký cho đúng bên đó, nên một trang giả mạo dù giống hệt về hình thức cũng không lấy được chữ ký dùng được. SP 800-63B phiên bản thứ tư cũng xếp cách này vào nhóm phương thức có khả năng chống phishing. Apple, Google và Microsoft đang tích cực quảng bá "passkeys" như bên kế nhiệm của mật khẩu
- Xác thực SMS: Tiện lợi nhưng dễ bị tấn công SIM-swap và chặn ở tầng giao thức. SP 800-63B phiên bản thứ tư xếp kênh out-of-band đi qua mạng điện thoại công cộng (PSTN), tức là SMS và cuộc gọi thoại, vào loại RESTRICTED, nghĩa là bị hạn chế sử dụng. Nên chuyển sang TOTP hoặc FIDO2 khi dịch vụ có hỗ trợ
Thiết lập lý tưởng là mật khẩu dài (hoặc passphrase) kết hợp với khóa bảo mật FIDO2. Điều này cung cấp khả năng chống mạnh mẽ đồng thời trước tấn công brute-force, tấn công từ điển, phishing và credential stuffing.
Phương pháp tốt nhất cho trình quản lý mật khẩu
- Mật khẩu chính: Sử dụng passphrase Diceware gồm 6+ từ (77+ bit entropy). Không bao giờ lưu mật khẩu chính ở bất kỳ đâu - chỉ ghi nhớ trong đầu
- Độ dài mật khẩu được tạo: Đặt mật khẩu dịch vụ riêng lẻ ở 20+ ký tự ngẫu nhiên. Xét giới hạn 72 byte của bcrypt, 20–64 ký tự ASCII là phạm vi thực tế tối ưu
- Tự động xóa clipboard: Bật tính năng tự động xóa clipboard sau 10–30 giây để ngăn mật khẩu đã sao chép tồn tại lâu
- Trình quản lý tích hợp trình duyệt so với chuyên dụng: Trình quản lý mật khẩu tích hợp của Chrome và Safari cung cấp mã hóa tốt, nhưng công cụ chuyên dụng cung cấp hỗ trợ đa nền tảng, kiểm tra bảo mật và kho chia sẻ cho nhóm
Kiểm tra rò rỉ và thiết kế chính sách mật khẩu
Hướng dẫn thực tế cho cả người dùng cá nhân và nhà phát triển dịch vụ:
Cho người dùng cá nhân:
- Thường xuyên kiểm tra haveibeenpwned.com để xem email của bạn có xuất hiện trong các vụ rò rỉ đã biết không. API của trang web sử dụng mô hình k-anonymity chỉ gửi 5 ký tự đầu của hash mật khẩu - mật khẩu thực của bạn không bao giờ được truyền đi
- Sử dụng tính năng kiểm tra bảo mật của trình quản lý mật khẩu để phát hiện mật khẩu yếu, thông tin đăng nhập tái sử dụng và mật khẩu bị rò rỉ trong một lần quét
- Ưu tiên các tài khoản có giá trị cao (email, tài chính, mạng xã hội). Tài khoản email xứng đáng được bảo vệ mạnh nhất vì chúng đóng vai trò kênh đặt lại mật khẩu cho các dịch vụ khác
Cho nhà phát triển dịch vụ:
- Yêu cầu tối thiểu 15 ký tự khi mật khẩu được dùng một mình, và tối thiểu 8 ký tự khi nó chỉ là một yếu tố trong xác thực đa yếu tố. Đây là hai mức bắt buộc (SHALL) của SP 800-63B phiên bản thứ tư
- Cho phép tối đa ít nhất 64 ký tự. Giới hạn ngắn không cần thiết hạn chế bảo mật người dùng
- Bỏ qua yêu cầu loại ký tự. Thay vào đó, triển khai kiểm tra mật khẩu bị rò rỉ sử dụng API như Have I Been Pwned
- Chọn Argon2id làm thuật toán băm chính, với bcrypt (hệ số chi phí 12+) làm phương án dự phòng. Không bao giờ sử dụng MD5 hoặc SHA-256 thuần cho lưu trữ mật khẩu
- Nếu hiển thị đồng hồ đo độ mạnh, hãy dùng thư viện như zxcvbn: cách này ước lượng số lần thử cần thiết dựa trên từ điển, các mẫu đã biết và cách sắp xếp bàn phím. Đồng hồ đo chỉ xét xem đã đủ các loại ký tự hay chưa sẽ cho điểm cao với những chuỗi như "P@ssw0rd!", tức là đánh giá ngược lại thực tế
Các lỗi thường gặp và biện pháp đối phó
- Sử dụng từ điển nguyên bản: Các từ như "sunshine", "football" và "dragon" bị tấn công từ điển bẻ ngay lập tức. Kẻ tấn công sử dụng từ điển hàng triệu từ cộng với biến đổi l33t speak (a→@, e→3) và mẫu bàn phím (qwerty, 1qaz2wsx)
- Bao gồm thông tin cá nhân: Ngày sinh, tên thú cưng và địa chỉ một phần dễ dàng đoán được từ hồ sơ mạng xã hội và rò rỉ dữ liệu. Kẻ tấn công thường xuyên xây dựng từ điển tùy chỉnh từ thông tin công khai của mục tiêu (social engineering)
- Tái sử dụng mật khẩu giữa các dịch vụ: Một vụ rò rỉ làm lộ mọi tài khoản chia sẻ mật khẩu đó. Tấn công credential stuffing tự động thử danh sách thông tin đăng nhập bị rò rỉ trên hàng loạt dịch vụ khác, và trong trường hợp này độ dài không giúp được gì vì kẻ tấn công đã có sẵn mật khẩu đúng. Cách duy nhất là không dùng lại mật khẩu, kết hợp với xác thực đa yếu tố
- Thay đổi tối thiểu: "MyPassword1", "MyPassword2", "MyPassword3" - tấn công dựa trên quy tắc dễ dàng tạo ra các biến thể này từ một phiên bản bị rò rỉ. Công cụ cho việc này có sẵn rộng rãi
Kết luận
Bảo mật mật khẩu phụ thuộc vào entropy, và cách hiệu quả nhất để tăng entropy là thêm độ dài. SP 800-63B phiên bản thứ tư yêu cầu tối thiểu 15 ký tự khi mật khẩu được dùng một mình và tối thiểu 8 ký tự khi nó chỉ là một yếu tố trong xác thực đa yếu tố, và kết hợp mật khẩu dài với hàm băm chậm như bcrypt hoặc Argon2id cung cấp bảo vệ thực tế hiệu quả. Người dùng cá nhân nên tạo mật khẩu ngẫu nhiên 20+ ký tự qua trình quản lý mật khẩu, sử dụng passphrase Diceware làm mật khẩu chính. Thêm xác thực đa yếu tố dựa trên FIDO2/passkey đạt được mức phòng thủ cao nhất hiện có. Kiểm tra độ dài mật khẩu của bạn với Bộ đếm ký tự.