Công cụ Tạo và Kiểm tra Mật khẩu
Công cụ tạo và xác minh mật khẩu chuyên nghiệp, hỗ trợ tạo mật khẩu mạnh và cụm mật khẩu dễ nhớ, cung cấp các chức năng tạo hàng loạt, đảm bảo tính duy nhất, đánh giá độ mạnh và kiểm tra chính sách. Tích hợp nguồn ngẫu nhiên an toàn, bộ ký tự có thể cấu hình, lọc ký tự tương tự, thống kê loại bỏ trùng lặp hàng loạt, cung cấp ví dụ mã đa ngôn ngữ, kiến thức về mật khẩu và hướng dẫn thực hành an toàn, tất cả các thao tác đều được thực hiện tại chỗ để đảm bảo bảo mật riêng tư.
Bộ kiểm tra chính sách mật khẩu
- Độ dài
- Chữ thường
- Chữ hoa
- Chữ số
- Ký tự đặc biệt
- Dãy liên tiếp
- Lặp lại
- Danh sách cấm
Bộ tạo cụm mật khẩu
Bảng tra cứu nhanh băm mật khẩu
- Sử dụng Argon2id với tham số bộ nhớ phù hợp
- Thời gian ≥ 2 vòng lặp, bộ nhớ ≥ 64MB (tùy chỉnh theo môi trường)
- Sử dụng salt riêng cho từng người dùng; có thể bổ sung pepper ở cấp ứng dụng
- Chọn SHA-256 hoặc SHA-512, số lần lặp ≥ 210k (tùy chỉnh theo nhu cầu)
- Sử dụng salt duy nhất cho mỗi băm; hỗ trợ nâng cấp tham số
- Chuyển đổi sang tham số chi phí cao hơn khi người dùng đăng nhập lần tới
- Chi phí từ 10–14, tùy thuộc vào khả năng máy chủ
- Tránh vấn đề cắt ngắn; luôn băm toàn bộ mật khẩu
- Áp dụng giới hạn tốc độ và giám sát cho endpoint xác thực
Đánh giá độ mạnh mật khẩu
Độ mạnh được ước tính dựa trên entropy: entropy = log2(kích thước bộ ký tự) × độ dài. Bộ ký tự lớn hơn và độ dài lớn hơn sẽ tăng khả năng chống đoán mò.
- Yếu: < 50 bit —— Chỉ phù hợp cho cảnh sử dụng một lần hoặc ít quan trọng
- Trung bình: 50–80 bit —— Có thể chấp nhận trong môi trường rủi ro thấp
- Mạnh: 80–110 bit —— Mục tiêu mặc định được khuyến nghị
- Rất mạnh: > 110 bit —— Phù hợp cho tài khoản quản trị viên hoặc quan trọng
Gợi ý: Các mô hình tấn công thực tế có thể khác biệt; hãy tránh dùng lại mật khẩu và kích hoạt xác thực đa yếu tố (MFA).
Hướng dẫn sử dụng
- Chọn độ dài và bộ ký tự (Chữ thường/Chữ hoa/Số/Ký hiệu); tùy chọn bật 'Tránh ký tự tương tự' và 'Yêu cầu mỗi loại'
- Khi cần kiểm soát chi tiết hơn: Loại trừ ký tự/khối ký tự hoặc chọn nhóm ký hiệu
- Chọn số lượng tạo, nhấp vào Tạo; kết quả hàng loạt tự động loại bỏ bản sao, có thể sao chép tất cả bằng một nút nhấn
- Để kiểm tra mật khẩu hiện có, dùng 'Bộ kiểm tra chính sách'; để tạo cụm mật khẩu dễ nhớ, dùng 'Bộ tạo cụm mật khẩu'
Tính năng nổi bật
- Nguồn ngẫu nhiên an toàn (Web Crypto)
- Bộ ký tự và nhóm ký hiệu có thể cấu hình
- Lọc ký tự tương tự và loại trừ tùy chỉnh
- Tạo hàng loạt từ 1 đến 100 cái, tự động đảm bảo duy nhất
- Đánh giá độ mạnh và chỉ số entropy
- Bộ kiểm tra chính sách và bộ tạo cụm mật khẩu
- Ví dụ mã nguồn đa ngôn ngữ
- Sao chép một lần (một dòng/tất cả)
Thư viện kiến thức mật khẩu
- Độ ngẫu nhiên ≈ log2(kích thước bộ ký tự) × độ dài; độ dài thường đóng góp nhiều hơn
- Mục tiêu đề xuất: Tài khoản thông thường ≥ 80 bit; tài khoản có quyền cao/tài chính ≥ 110 bit
- Bộ ký tự lớn hơn + độ dài dài hơn → chống đoán tốt hơn
- Việc thêm vô tội vạ các ký tự đặc biệt ít hiệu quả hơn so với tăng độ dài
- Tránh các mẫu dự đoán được (ví dụ: luôn viết hoa chữ cái đầu + kết thúc bằng số!)
- Ưu tiên đảm bảo độ dài đủ, sau đó mới tăng nhẹ tính đa dạng của ký tự
- Các chuỗi bàn phím (qwerty), khối lặp lại, ngày sinh/năm sinh... dễ bị phát hiện bởi quy tắc
- "Mật khẩu gốc + hậu tố trang web" là sự tái sử dụng biến thể, rủi ro tập trung và dễ bị đoán
- Không nên dùng cùng một mật khẩu cho nhiều trang web
- Sử dụng trình quản lý mật khẩu; mỗi trang một mật khẩu duy nhất; kích hoạt MFA cho tài khoản quan trọng
- Tránh truyền mật khẩu dưới dạng văn bản rõ qua kênh công cộng; nếu cần, hãy dùng mật khẩu dễ phát âm
- Nếu phát hiện rò rỉ hoặc tái sử dụng, thay đổi ngay lập tức và đảm bảo tính duy nhất
- Kết hợp nhiều từ (4–6 từ) thường mạnh và dễ nhớ
- Kết hợp dấu phân cách, viết hoa chữ cái đầu, chèn số để tăng cường độ mạnh và khả năng đọc hiểu
- Tránh ghép trực tiếp các cụm phổ biến/lời bài hát/trích dẫn nổi tiếng
Hướng dẫn thực hành bảo mật mật khẩu
- Ưu tiên độ dài đủ lớn: tài khoản thông thường 16+ ký tự, tài khoản quan trọng 24+ ký tự
- Đối với nhu cầu ghi nhớ, hãy ưu tiên sử dụng cụm mật khẩu; mật khẩu ngẫu nhiên mạnh nên được lưu bởi trình quản lý mật khẩu
- Bật xác thực đa yếu tố (MFA) khi có thể
- Không tái sử dụng mật khẩu giữa các trang web; mỗi tài khoản phải có mật khẩu duy nhất
Độ entropy phản ánh mức độ không thể dự đoán dựa trên độ dài và kích thước tập ký tự; số bit entropy càng cao thì mật khẩu thường càng mạnh.
- Tăng độ dài để đạt lợi ích tối đa
- Sử dụng nhiều bộ ký tự khi có thể
- Loại bỏ quá nhiều ký tự sẽ thu hẹp tập ký tự và làm giảm độ mạnh
- Ưu tiên độ dài và danh sách cấm các mật khẩu phổ biến/bị rò rỉ thay vì các quy tắc phức tạp về thành phần
- Tránh thay đổi mật khẩu thường xuyên; chỉ thay đổi khi xảy ra rò rỉ hoặc có nguy cơ
- Sử dụng danh sách mật khẩu bị rò rỉ để ngăn chặn các mật khẩu phổ biến/bị rò rỉ
- Sử dụng 4–6 từ ngẫu nhiên nối với nhau bằng ký tự phân cách, ví dụ: lake-CARROT-planet_7
- Tránh sử dụng câu nổi tiếng/ lời bài hát hoặc cụm phổ biến; tính ngẫu nhiên quan trọng hơn sự 'thông minh'
- Đối với tài khoản quan trọng, hãy sử dụng trình quản lý mật khẩu để lưu trữ mật khẩu ngẫu nhiên có độ entropy cao thực sự
- "Require each selected set" đảm bảo mỗi loại ký tự xuất hiện ít nhất một lần
- "Avoid similar" cải thiện khả năng đọc, nhưng làm giảm nhẹ kích thước tập ký tự
- Ký tự đặc biệt có thể giới hạn ở tập con được hệ thống mục tiêu chấp nhận
- Không bao giờ lưu mật khẩu dưới dạng văn bản rõ; hãy dùng hàm băm mạnh (Argon2id/PBKDF2/BCrypt) kèm salt
- Thiết lập tham số hợp lý (bộ nhớ/thời gian/chi phí); sử dụng pepper khi cần thiết
- Giới hạn tốc độ và giám sát các nỗ lực đăng nhập thất bại; khi bị tấn công, thêm CAPTCHA hoặc xác minh thiết bị
- Ưu tiên TOTP/ khóa phần cứng; tránh sử dụng SMS nếu có thể
- Bảo vệ quy trình khôi phục: dùng xác thực đa yếu tố hoặc xác minh email kèm thời gian chờ
- Cung cấp mã khôi phục dự phòng và khuyến nghị người dùng lưu giữ cẩn thận
- Sử dụng độ trễ tăng dần/ khóa và đánh giá rủi ro IP/thiết bị
- Cấu hình WAF/ giới hạn tốc độ cho API và biểu mẫu đăng nhập
- Theo dõi các cuộc tấn công dọn dẹp (credential stuffing) và khuyến khích người dùng sử dụng mật khẩu duy nhất
- Sử dụng trình quản lý mật khẩu đáng tin cậy để lưu trữ và điền tự động
- Không chia sẻ mật khẩu dưới dạng văn bản rõ qua trò chuyện/ email; nhóm nên dùng công cụ quản lý bí mật
- Nếu cần ghi lại thủ công, hãy đảm bảo an toàn vật lý
Cách tạo mật khẩu thông qua các ngôn ngữ lập trình
function randomPassword(length = 16, sets = {lower:true, upper:true, digits:true, symbols:true}) {
const pools = {
lower: 'abcdefghijklmnopqrstuvwxyz',
upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
digits: '0123456789',
symbols: '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
};
let pool = '';
for (const k of Object.keys(sets)) if (sets[k]) pool += pools[k];
if (!pool) throw new Error('No charset');
// Rejection sampling removes modulo bias
const limit = Math.floor(0x100000000 / pool.length) * pool.length;
const buf = new Uint32Array(1);
let out = '';
for (let i = 0; i < length; i++) {
do { crypto.getRandomValues(buf); } while (buf[0] >= limit);
out += pool[buf[0] % pool.length];
}
return out;
}
import secrets
def random_password(length=16, lower=True, upper=True, digits=True, symbols=True):
pools = {
'lower': 'abcdefghijklmnopqrstuvwxyz',
'upper': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'digits': '0123456789',
'symbols': '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
}
pool = ''.join(v for k, v in pools.items() if locals()[k])
if not pool:
raise ValueError('No charset')
return ''.join(secrets.choice(pool) for _ in range(length))
function random_password($length = 16, $sets = ['lower'=>true,'upper'=>true,'digits'=>true,'symbols'=>true]) {
$pools = [
'lower' => 'abcdefghijklmnopqrstuvwxyz',
'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'digits' => '0123456789',
'symbols' => '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
];
$pool = '';
foreach ($sets as $k => $on) if ($on) $pool .= $pools[$k];
if ($pool === '') throw new Exception('No charset');
$out = '';
for ($i = 0; $i < $length; $i++) {
$out .= $pool[random_int(0, strlen($pool)-1)];
}
return $out;
}
package main
import (
"crypto/rand"
"math/big"
)
func RandomPassword(length int, pool string) (string, error) {
out := make([]byte, length)
for i := 0; i < length; i++ {
nBig, err := rand.Int(rand.Reader, big.NewInt(int64(len(pool))))
if err != nil { return "", err }
out[i] = pool[nBig.Int64()]
}
return string(out), nil
}
import java.security.SecureRandom;
public class Pw {
static final String POOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
static final SecureRandom SR = new SecureRandom();
static String randomPassword(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int idx = SR.nextInt(POOL.length());
sb.append(POOL.charAt(idx));
}
return sb.toString();
}
}
using System;
using System.Security.Cryptography;
public static class Pw {
public static string RandomPassword(int length, string pool) {
// GetInt32 draws an unbiased value in [0, pool.Length)
var chars = new char[length];
for (int i = 0; i < length; i++) {
chars[i] = pool[RandomNumberGenerator.GetInt32(pool.Length)];
}
return new string(chars);
}
}
use rand::rngs::OsRng;
use rand::Rng;
fn random_password(length: usize, pool: &str) -> String {
// gen_range is uniform, so there is no modulo bias
let chars: Vec = pool.chars().collect();
(0..length)
.map(|_| chars[OsRng.gen_range(0..chars.len())])
.collect()
}
fn main() {
let pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
let pw = random_password(16, pool);
println!("{}", pw);
}