تولیدکننده رمز عبور
ایجاد رمز عبور تصادفی قوی با طول و مجموعه کاراکترهای قابل تنظیم
تولیدکننده رمز عبور چیست؟
یک تولیدکننده رمز عبور، رشتههای تصادفی از کاراکترها را برای استفاده بهعنوان رمز عبور حسابهای کاربری، کلیدهای API، اعتبارنامههای پایگاه داده و کلیدهای رمزنگاری میسازد. برخلاف رمزهای عبور انتخابی انسان، رمزهای تولیدشده از کل فضای ترکیبهای ممکن کاراکتر بهره میبرند و در برابر حملات دیکشنری و حدسزنی مبتنی بر الگو مقاوم هستند. این ابزار رمزهای عبور تصادفی قوی را با استفاده از مولد اعداد تصادفی رمزنگاریشده داخلی مرورگر شما بهصورت آنلاین تولید میکند.
قدرت رمز عبور به دو عامل بستگی دارد: طول و تنوع کاراکتر. یک رمز عبور ۲۰ کاراکتری با حروف بزرگ، کوچک، ارقام و نمادها دارای حدود ۱۳۱ بیت آنتروپی است. در این سطح، یک حمله brute-force که یک تریلیون حدس در ثانیه آزمایش میکند، بیش از عمر کیهان طول میکشد تا تمام ترکیبها را امتحان کند. محاسبه ساده است: آنتروپی = طول × log2(اندازه مجموعه کاراکتر).
استانداردهایی مانند NIST SP 800-63B رمزهای عبور حداقل ۸ کاراکتری را توصیه میکنند، بدون اینکه سقف بالایی توسط تأییدکننده اعمال شود، و توصیه میکنند که از قوانین ترکیب اجباری مانند الزام دقیقاً یک نماد اجتناب شود و بهجای آن عبارات عبور طولانیتر را ترجیح میدهند. برای اعتبارنامههای ماشین به ماشین و حسابهای سرویس، ۲۰ یا بیشتر کاراکتر تصادفی از یک مجموعه کاراکتر کامل، خط پایه پذیرفتهشده در اکثر چارچوبهای امنیتی و رژیمهای انطباق است.
چرا از تولیدکننده رمز عبور استفاده کنیم؟
انسانها در انتخاب تصادفی ضعیف هستند. رمزهای عبور را تکرار میکنیم، کلمات دیکشنری انتخاب میکنیم، حروف را با الگوهای قابل پیشبینی جایگزین میکنیم (@ بهجای a، 3 بهجای e) و به رشتههای کوتاه تکیه میکنیم. یک تولیدکننده رمز عبور این سوگیری را از فرایند حذف میکند.
موارد استفاده از تولیدکننده رمز عبور
جدول مرجع آنتروپی رمز عبور
آنتروپی اندازهگیری میکند که یک رمز عبور چقدر غیرقابل پیشبینی است. بهصورت log2(charset_size ^ length) محاسبه میشود. آنتروپی بالاتر به معنای ترکیبهای بیشتری است که مهاجم باید در آنها جستجو کند. NIST و OWASP حداقل ۸۰ بیت آنتروپی را برای برنامههای امنیتی بالا توصیه میکنند.
| طول | مجموعه کاراکتر | آنتروپی | زمان 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 |
این زمانها با فرض یک تریلیون حدس در ثانیه محاسبه شدهاند (حمله آفلاین با GPUهای مدرن). حملات آنلاین با محدودیت نرخ چندین برابر کندتر هستند.
CSPRNG در مقابل Math.random() برای تولید رمز عبور
منبع تصادفیسازی به اندازه طول رمز عبور اهمیت دارد. رمز عبوری که با یک مولد اعداد تصادفی قابل پیشبینی تولید شده، میتواند توسط مهاجمی که الگوریتم و وضعیت اولیه را میداند بازسازی شود. این ابزار از 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"
}