ตัวสร้างรหัสผ่าน
สร้างรหัสผ่านสุ่มที่แข็งแกร่งด้วยความยาวและชุดอักขระที่กำหนดเอง
เครื่องมือสร้างรหัสผ่านคืออะไร?
เครื่องมือสร้างรหัสผ่านจะสร้างสตริงอักขระแบบสุ่มเพื่อใช้เป็นรหัสผ่านสำหรับบัญชีผู้ใช้ API keys ข้อมูลรับรองฐานข้อมูล และค่าลับสำหรับการเข้ารหัส ต่างจากรหัสผ่านที่มนุษย์เลือกเอง รหัสผ่านที่สร้างขึ้นจะดึงจากพื้นที่การรวมกันของอักขระที่เป็นไปได้ทั้งหมด ทำให้ต้านทานการโจมตีแบบ dictionary attack และการเดาจากรูปแบบได้ เครื่องมือนี้สร้างรหัสผ่านแบบสุ่มที่แข็งแกร่งออนไลน์โดยใช้ตัวสร้างเลขสุ่มแบบเข้ารหัสที่มีอยู่ในเบราว์เซอร์ของคุณ
ความแข็งแกร่งของรหัสผ่านขึ้นอยู่กับสองปัจจัย ได้แก่ ความยาวและความหลากหลายของอักขระ รหัสผ่านความยาว 20 อักขระที่ใช้ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก ตัวเลข และสัญลักษณ์มีเอนโทรปีประมาณ 131 บิต ที่ระดับนั้นการโจมตีแบบ brute-force ที่ทดสอบหนึ่งล้านล้านการเดาต่อวินาทีจะใช้เวลานานกว่าอายุจักรวาลเพื่อลองทุกรูปแบบ สูตรคำนวณตรงไปตรงมา: entropy = length x log2(charset size)
มาตรฐานอย่าง NIST SP 800-63B แนะนำรหัสผ่านที่มีความยาวอย่างน้อย 8 อักขระโดยไม่มีขีดจำกัดบนที่บังคับใช้โดยผู้ตรวจสอบ และไม่สนับสนุนกฎการประกอบแบบบังคับ เช่น กำหนดให้มีสัญลักษณ์หนึ่งตัวพอดี โดยให้ความสำคัญกับ passphrase ที่ยาวกว่าแทน สำหรับข้อมูลรับรองแบบ machine-to-machine และ service account อักขระสุ่มตั้งแต่ 20 ตัวขึ้นไปจากชุดอักขระครบชุดถือเป็นมาตรฐานขั้นต่ำที่ยอมรับได้ในกรอบงานความปลอดภัยและระบบการปฏิบัติตามข้อกำหนดส่วนใหญ่
ทำไมต้องใช้เครื่องมือสร้างรหัสผ่าน?
มนุษย์สร้างตัวเลขสุ่มได้ไม่ดีนัก เราใช้รหัสผ่านซ้ำ เลือกคำจากพจนานุกรม แทนที่ตัวอักษรด้วยรูปแบบที่คาดเดาได้ (@ แทน a, 3 แทน e) และมักใช้สตริงสั้น เครื่องมือสร้างรหัสผ่านช่วยขจัดอคติของมนุษย์ออกจากกระบวนการ
กรณีการใช้งานเครื่องมือสร้างรหัสผ่าน
ตารางอ้างอิงเอนโทรปีรหัสผ่าน
เอนโทรปีวัดว่ารหัสผ่านคาดเดาได้ยากแค่ไหน คำนวณจาก log2(charset_size ^ length) เอนโทรปีที่สูงขึ้นหมายถึงรูปแบบที่เป็นไปได้มากขึ้นสำหรับผู้โจมตีในการค้นหา NIST และ OWASP แนะนำเอนโทรปีอย่างน้อย 80 บิตสำหรับแอปพลิเคชันที่มีความปลอดภัยสูง
| ความยาว | ชุดอักขระ | เอนโทรปี | เวลา Brute-Force |
|---|---|---|---|
| 8 | lower + digits | ~41 bits | Minutes to hours |
| 12 | lower + upper + digits | ~71 bits | Centuries (offline) |
| 16 | all character sets | ~105 bits | Beyond brute-force |
| 20 | all character sets | ~131 bits | Beyond brute-force |
| 32 | all character sets | ~210 bits | Beyond brute-force |
| 64 | all character sets | ~419 bits | Beyond brute-force |
เวลาที่ใช้ถอดรหัสสมมติว่ามีการเดา 1 ล้านล้านครั้งต่อวินาที (การโจมตีแบบออฟไลน์ด้วย GPU สมัยใหม่) การโจมตีออนไลน์ที่มีการจำกัดอัตราจะช้ากว่านี้หลายระดับ
CSPRNG เทียบกับ Math.random() สำหรับการสร้างรหัสผ่าน
แหล่งที่มาของความสุ่มมีความสำคัญพอ ๆ กับความยาวรหัสผ่าน รหัสผ่านที่สร้างด้วยตัวสร้างเลขสุ่มที่คาดเดาได้สามารถถูกสร้างใหม่โดยผู้โจมตีที่รู้จักอัลกอริทึมและสถานะ seed เครื่องมือนี้ใช้ crypto.getRandomValues() ซึ่งเป็น CSPRNG ที่มีอยู่ในเบราว์เซอร์สมัยใหม่ทุกตัว
ตัวอย่างโค้ด
สร้างรหัสผ่านแบบโปรแกรมในภาษาต่าง ๆ ทุกตัวอย่างด้านล่างใช้แหล่งเลขสุ่มที่ปลอดภัยทางการเข้ารหัส ไม่ใช่ Math.random() หรือ PRNG ที่ไม่แข็งแกร่งเทียบเท่า
// 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@"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)# 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
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"
}