مولد كلمات المرور
أنشئ كلمات مرور عشوائية قوية بطول وأنماط أحرف قابلة للتخصيص
ما هو مولِّد كلمات المرور؟
مولِّد كلمات المرور هو أداة تُنشئ سلاسل عشوائية من الأحرف تُستخدم كلمات مرور لحسابات المستخدمين ومفاتيح API وبيانات اعتماد قواعد البيانات والأسرار التشفيرية. على خلاف كلمات المرور التي يختارها البشر، تستمد كلمات المرور المُولَّدة من الفضاء الكامل للتركيبات الممكنة من الأحرف، مما يجعلها مقاومة لهجمات القاموس والتخمين القائم على الأنماط. تُولِّد هذه الأداة كلمات مرور قوية عشوائية عبر الإنترنت باستخدام مولِّد الأرقام العشوائية التشفيري المدمج في متصفحك.
تعتمد قوة كلمة المرور على عاملين: الطول وتنوع الأحرف. تمتلك كلمة مرور مكوَّنة من 20 حرفاً تجمع بين الأحرف الكبيرة والصغيرة والأرقام والرموز ما يقارب 131 بت من الانتروبيا. عند هذا المستوى، يحتاج هجوم القوة الغاشمة الذي يختبر تريليون تخمين في الثانية إلى وقت أطول من عمر الكون لتجربة كل التركيبات. المعادلة بسيطة: الانتروبيا = الطول × log2(حجم مجموعة الأحرف).
توصي معايير مثل NIST SP 800-63B بكلمات مرور لا تقل عن 8 أحرف دون حد أقصى تفرضه جهة التحقق، وتُحبِّط قواعد التركيب الإجبارية كاشتراط رمز واحد بالضبط، مفضِّلةً عبارات مرور أطول. بالنسبة لبيانات اعتماد من آلة إلى آلة وحسابات الخدمة، يُعدّ 20 حرفاً عشوائياً أو أكثر مستمدةً من مجموعة أحرف كاملة الحد الأدنى المقبول في معظم أُطر الأمان وأنظمة الامتثال.
لماذا تستخدم مولِّد كلمات المرور؟
البشر ضعاف في توليد الأرقام العشوائية. نُعيد استخدام كلمات المرور، ونختار كلمات من القاموس، ونستبدل الأحرف بأنماط متوقعة (@ بدلاً من a، و3 بدلاً من e)، ونميل تلقائياً إلى اختيار كلمات مرور قصيرة. يُزيل مولِّد كلمات المرور التحيز البشري من هذه العملية.
حالات استخدام مولِّد كلمات المرور
مرجع انتروبيا كلمات المرور
تقيس الانتروبيا مدى عدم قابلية كلمة المرور للتنبؤ. تُحسب بالصيغة log2(حجم_مجموعة_الأحرف ^ الطول). تعني الانتروبيا الأعلى مزيداً من التركيبات الممكنة التي يحتاج المهاجم إلى استعراضها. توصي NIST وOWASP بما لا يقل عن 80 بت من الانتروبيا للتطبيقات عالية الأمان.
| الطول | مجموعة الأحرف | الانتروبيا | وقت الاختراق بالقوة الغاشمة |
|---|---|---|---|
| 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() أو ما يعادله من PRNGs الضعيفة.
// 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"
}