ToolDeck

Trình Tạo Mật Khẩu

Tạo mật khẩu ngẫu nhiên mạnh mẽ có độ dài và bộ ký tự có thể tùy chỉnh

Độ Dài20
Số Lượng5

Trình Tạo Mật Khẩu là gì?

Trình tạo mật khẩu tạo ra các chuỗi ký tự ngẫu nhiên được dùng làm mật khẩu cho tài khoản người dùng, khóa API, thông tin xác thực cơ sở dữ liệu và bí mật mã hóa. Khác với mật khẩu do con người tự chọn, mật khẩu được tạo tự động lấy từ toàn bộ không gian tổ hợp ký tự có thể, khiến chúng có khả năng chống lại các cuộc tấn công từ điển và đoán theo mẫu. Công cụ này tạo mật khẩu ngẫu nhiên mạnh mẽ trực tuyến bằng bộ tạo số ngẫu nhiên mật mã tích hợp sẵn của trình duyệt.

Độ mạnh của mật khẩu phụ thuộc vào hai yếu tố: độ dài và sự đa dạng ký tự. Một mật khẩu 20 ký tự sử dụng chữ hoa, chữ thường, chữ số và ký hiệu có khoảng 131 bit entropy. Ở mức đó, một cuộc tấn công brute-force kiểm tra một nghìn tỷ lần đoán mỗi giây sẽ cần nhiều thời gian hơn tuổi của vũ trụ để thử mọi tổ hợp. Công thức rất đơn giản: entropy = độ dài x log2(kích thước bộ ký tự).

Các tiêu chuẩn như NIST SP 800-63B khuyến nghị mật khẩu có ít nhất 8 ký tự mà không có giới hạn trên do bên xác minh áp đặt, và không khuyến khích các quy tắc thành phần bắt buộc như yêu cầu chính xác một ký hiệu, thay vào đó ưu tiên cụm từ mật khẩu dài hơn. Đối với thông tin xác thực máy-máy và tài khoản dịch vụ, 20 ký tự ngẫu nhiên trở lên được lấy từ bộ ký tự đầy đủ là tiêu chuẩn được chấp nhận trong hầu hết các khung bảo mật và chế độ tuân thủ.

Tại sao Dùng Trình Tạo Mật Khẩu?

Con người là những bộ tạo số ngẫu nhiên kém. Chúng ta tái sử dụng mật khẩu, chọn các từ trong từ điển, thay thế chữ cái theo các mẫu có thể đoán trước (@ thay cho a, 3 thay cho e) và mặc định dùng chuỗi ngắn. Trình tạo mật khẩu loại bỏ sự thiên lệch của con người khỏi quy trình.

🔐
Tạo mật khẩu ưu tiên quyền riêng tư
Mật khẩu được tạo hoàn toàn trong trình duyệt của bạn bằng Web Crypto API. Không có ký tự nào rời khỏi thiết bị của bạn, không có gì được ghi lại và không có yêu cầu mạng nào được thực hiện trong quá trình tạo.
Kết quả hàng loạt tức thì
Tạo tới 20 mật khẩu cùng lúc chỉ với một cú nhấp. Sao chép từng mật khẩu riêng lẻ hoặc tất cả cùng lúc để dùng trong các script cấp phát hoặc kho thông tin xác thực.
🛡️
Không cần tài khoản
Không cần đăng ký, không cần email, không có cookie theo dõi mật khẩu bạn đã tạo. Mở trang, cấu hình tùy chọn và tạo mật khẩu.
🎛️
Kiểm soát hoàn toàn bộ ký tự
Bật/tắt chữ hoa, chữ thường, chữ số và ký hiệu một cách độc lập. Đặt độ dài từ 4 đến 128 ký tự để phù hợp với yêu cầu của bất kỳ hệ thống hoặc chính sách nào.

Các Trường Hợp Sử Dụng Trình Tạo Mật Khẩu

Lập Trình Frontend
Tạo mật khẩu thử nghiệm cho xác thực form, kiểm tra độ dài đầu vào và phát triển luồng xác thực. Xác minh rằng các form đăng nhập của bạn xử lý đúng mật khẩu 128 ký tự và các ký tự đặc biệt.
Backend & DevOps
Tạo thông tin xác thực cơ sở dữ liệu, token API và mật khẩu tài khoản dịch vụ trong quá trình thiết lập hạ tầng. Dùng tính năng tạo hàng loạt để cấp phát cho nhiều dịch vụ trong một phiên làm việc.
Kỹ Thuật Bảo Mật
Tạo bí mật có entropy cao cho khóa mã hóa, ký HMAC và xoay vòng bí mật JWT. Đặt độ dài 64+ ký tự cho các bí mật cần vượt quá 256 bit entropy.
QA & Kiểm Thử Thâm Nhập
Kiểm tra thực thi chính sách mật khẩu bằng cách tạo các chuỗi bao gồm hoặc loại trừ các bộ ký tự cụ thể. Xác minh rằng các hệ thống từ chối đúng mật khẩu dưới độ dài hoặc độ phức tạp tối thiểu.
Kỹ Thuật Dữ Liệu
Tạo thông tin xác thực ngẫu nhiên cho môi trường thử nghiệm, cơ sở dữ liệu staging và bí mật CI/CD pipeline. Tránh tái sử dụng mật khẩu production trong dữ liệu thử nghiệm bằng cách tạo mới cho mỗi môi trường.
Bảo Mật Tài Khoản Cá Nhân
Tạo mật khẩu duy nhất cho mỗi tài khoản trực tuyến. Kết hợp trình tạo này với trình quản lý mật khẩu để lưu trữ các thông tin xác thực bạn không cần ghi nhớ.

Bảng Tham Chiếu Entropy Mật Khẩu

Entropy đo mức độ khó đoán của mật khẩu. Được tính bằng log2(kích_thước_bộ_ký_tự ^ độ_dài). Entropy cao hơn có nghĩa là nhiều tổ hợp có thể hơn để kẻ tấn công phải dò qua. NIST và OWASP khuyến nghị ít nhất 80 bit entropy cho các ứng dụng bảo mật cao.

Độ DàiBộ Ký TựEntropyThời Gian Brute-Force
8lower + digits~41 bitsMinutes to hours
12lower + upper + digits~71 bitsCenturies (offline)
16all character sets~105 bitsBeyond brute-force
20all character sets~131 bitsBeyond brute-force
32all character sets~210 bitsBeyond brute-force
64all character sets~419 bitsBeyond brute-force

Thời gian dò mật khẩu giả định 1 nghìn tỷ lần đoán mỗi giây (tấn công offline với GPU hiện đại). Các cuộc tấn công trực tuyến có giới hạn tốc độ chậm hơn nhiều bậc độ lớn.

CSPRNG so với Math.random() để Tạo Mật Khẩu

Nguồn tạo số ngẫu nhiên quan trọng không kém độ dài mật khẩu. Mật khẩu được tạo bằng bộ tạo số ngẫu nhiên có thể đoán trước có thể bị kẻ tấn công tái tạo nếu họ biết thuật toán và trạng thái hạt giống. Công cụ này dùng crypto.getRandomValues(), là bộ tạo số giả ngẫu nhiên an toàn về mặt mật mã (CSPRNG) được tích hợp sẵn trong mọi trình duyệt hiện đại.

crypto.getRandomValues()
Dùng các nguồn entropy của hệ điều hành (phần cứng RNG, thời gian ngắt, v.v.). Đầu ra không thể đoán trước ngay cả khi kẻ tấn công biết tất cả các đầu ra trước đó. Được yêu cầu bởi đặc tả W3C Web Crypto cho các thao tác nhạy cảm về bảo mật.
Math.random()
Dùng thuật toán xác định được khởi tạo từ một vùng entropy giới hạn. Đầu ra có thể đoán trước nếu trạng thái hạt giống được biết. Đặc tả ECMAScript nêu rõ rằng Math.random() không cung cấp số ngẫu nhiên an toàn về mặt mật mã. Tuyệt đối không dùng để tạo mật khẩu.

Ví Dụ Code

Tạo mật khẩu theo chương trình trong các ngôn ngữ khác nhau. Mọi ví dụ dưới đây đều dùng nguồn ngẫu nhiên an toàn về mặt mật mã, không phải Math.random() hoặc các PRNG yếu tương đương.

JavaScript (Web Crypto API)
// Generate a random password in the browser or Node.js 19+
function generatePassword(length = 20) {
  const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
  const values = new Uint32Array(length)
  crypto.getRandomValues(values)
  return Array.from(values, v => charset[v % charset.length]).join('')
}

console.log(generatePassword())    // → "kR7!mZp$Xw2&nLq9@Yf3"
console.log(generatePassword(32))  // → "Hd4%tNx!Qw8#mKp2Rv6&Zj0*Ls3Yb7@"
Python
import secrets
import string

def generate_password(length: int = 20) -> str:
    """Generate a cryptographically secure random password."""
    alphabet = string.ascii_letters + string.digits + string.punctuation
    return ''.join(secrets.choice(alphabet) for _ in range(length))

# Single password
print(generate_password())      # → "kR7!mZp$Xw2&nLq9@Yf3"

# Batch of 5 passwords
for _ in range(5):
    print(generate_password(24))

# Ensure at least one char from each category
def generate_strong(length: int = 20) -> str:
    required = [
        secrets.choice(string.ascii_uppercase),
        secrets.choice(string.ascii_lowercase),
        secrets.choice(string.digits),
        secrets.choice(string.punctuation),
    ]
    remaining = length - len(required)
    alphabet = string.ascii_letters + string.digits + string.punctuation
    all_chars = required + [secrets.choice(alphabet) for _ in range(remaining)]
    secrets.SystemRandom().shuffle(all_chars)
    return ''.join(all_chars)
CLI (OpenSSL / /dev/urandom)
# OpenSSL — generate 32 random bytes, base64-encode
openssl rand -base64 32
# → "x7Kp2mNqR4wZ8vLs1Yb0Hd6tFj3Xc9Ga5eUi+Wo="

# /dev/urandom with tr — alphanumeric + symbols, 20 chars
tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 20; echo
# → "kR7!mZp$Xw2&nLq9@Yf3"

# pwgen (install: apt install pwgen / brew install pwgen)
pwgen -sy 20 5
# Generates 5 passwords, 20 chars each, with symbols
Go
package main

import (
    "crypto/rand"
    "fmt"
    "math/big"
)

func generatePassword(length int) (string, error) {
    charset := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"
    result := make([]byte, length)
    for i := range result {
        idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
        if err != nil {
            return "", err
        }
        result[i] = charset[idx.Int64()]
    }
    return string(result), nil
}

func main() {
    pwd, _ := generatePassword(20)
    fmt.Println(pwd) // → "kR7!mZp$Xw2&nLq9@Yf3"
}

Câu Hỏi Thường Gặp

Mật khẩu nên dài bao nhiêu?
Đối với tài khoản người dùng, 16 ký tự từ bộ ký tự hỗn hợp cung cấp hơn 100 bit entropy, đủ cho mọi mô hình mối đe dọa hiện tại. Đối với bí mật máy móc (khóa API, khóa mã hóa), dùng 32 ký tự trở lên. NIST SP 800-63B đặt tối thiểu 8 ký tự nhưng khuyến nghị các hệ thống cho phép mật khẩu dài hơn nhiều mà không bị cắt bớt.
Trình tạo mật khẩu này có an toàn để sử dụng không?
Có. Mật khẩu được tạo trong trình duyệt của bạn bằng Web Crypto API (crypto.getRandomValues). Không có dữ liệu nào được gửi đến bất kỳ máy chủ nào. Bạn có thể xác minh điều này bằng cách mở tab mạng của trình duyệt và quan sát rằng không có yêu cầu nào được thực hiện khi bạn nhấp Tạo Mật Khẩu. Mã nguồn là JavaScript phía máy khách, có thể xem trong công cụ dành cho nhà phát triển của trình duyệt.
Entropy mật khẩu là gì?
Entropy là thước đo tính ngẫu nhiên được biểu thị bằng bit. Mật khẩu có N bit entropy có 2^N giá trị có thể. Ví dụ, mật khẩu 20 ký tự được lấy từ 95 ký tự ASCII có thể in có log2(95^20) = 131,1 bit entropy. Mỗi bit bổ sung nhân đôi số lần đoán mà kẻ tấn công cần thực hiện.
Tôi có nên bao gồm ký hiệu trong mật khẩu không?
Bao gồm ký hiệu tăng bộ ký tự từ 62 (chữ cái + chữ số) lên 95 (ASCII có thể in), thêm khoảng 6,1 bit entropy mỗi ký tự. Một số hệ thống giới hạn các ký hiệu được phép. Nếu hệ thống từ chối một số ký hiệu nhất định, hãy tắt tùy chọn ký hiệu và bù lại bằng mật khẩu dài hơn. Mật khẩu chữ-số 24 ký tự có nhiều entropy hơn mật khẩu 16 ký tự có ký hiệu.
Tại sao không dùng Math.random() để tạo mật khẩu?
Math.random() không an toàn về mặt mật mã. Hầu hết các JavaScript engine triển khai nó với xorshift128+ hoặc PRNG nhanh tương tự được thiết kế cho mô phỏng và game, không phải bảo mật. Kẻ tấn công quan sát một vài đầu ra có thể khôi phục trạng thái nội bộ và dự đoán tất cả các đầu ra trong tương lai. Web Crypto API dùng các nguồn entropy của hệ điều hành mà không thể đoán trước.
Tôi có thể dùng mật khẩu được tạo cho khóa API và token không?
Có, nhưng hãy xem xét các yêu cầu định dạng của hệ thống đích. Một số API mong đợi khóa mã hóa Base64 hoặc chuỗi hex thay vì các ký tự tùy ý. Để tạo bí mật thô, dùng bộ ký tự đầy đủ ở 32+ ký tự. Để tạo khóa Base64, hãy tạo byte ngẫu nhiên và mã hóa riêng thay vì xem Base64 là bộ ký tự mật khẩu.
Tôi nên xoay vòng mật khẩu bao lâu một lần?
NIST SP 800-63B (2017, cập nhật 2024) khuyến nghị không nên bắt buộc xoay vòng định kỳ cho mật khẩu người dùng vì điều này dẫn đến lựa chọn mật khẩu yếu hơn. Chỉ xoay vòng khi có bằng chứng về sự xâm phạm. Đối với bí mật máy móc và tài khoản dịch vụ, hãy xoay vòng dựa trên mô hình rủi ro của tổ chức bạn, thường là mỗi 90 ngày đối với thông tin xác thực có đặc quyền cao.