পাসওয়ার্ড জেনারেটর
কাস্টমাইজযোগ্য দৈর্ঘ্য এবং ক্যারেক্টার সেট দিয়ে শক্তিশালী র্যান্ডম পাসওয়ার্ড তৈরি করুন
পাসওয়ার্ড জেনারেটর কী?
একটি পাসওয়ার্ড জেনারেটর র্যান্ডম ক্যারেক্টারের স্ট্রিং তৈরি করে যা ব্যবহারকারীর অ্যাকাউন্ট, API কী, ডেটাবেস ক্রেডেনশিয়াল এবং এনক্রিপশন সিক্রেট হিসেবে ব্যবহৃত হয়। নিজে বেছে নেওয়া পাসওয়ার্ডের বিপরীতে, জেনারেট করা পাসওয়ার্ডগুলো সম্ভাব্য সব ক্যারেক্টার কম্বিনেশন থেকে তৈরি হয়, যা তাদের ডিকশনারি আক্রমণ এবং প্যাটার্ন-ভিত্তিক অনুমানের বিরুদ্ধে প্রতিরোধী করে তোলে। এই টুলটি আপনার ব্রাউজারের অন্তর্নির্মিত ক্রিপ্টোগ্রাফিক র্যান্ডম নম্বর জেনারেটর ব্যবহার করে অনলাইনে শক্তিশালী র্যান্ডম পাসওয়ার্ড তৈরি করে।
পাসওয়ার্ডের শক্তি দুটি বিষয়ের উপর নির্ভর করে: দৈর্ঘ্য এবং ক্যারেক্টারের বৈচিত্র্য। বড় হাতের অক্ষর, ছোট হাতের অক্ষর, ডিজিট এবং প্রতীক ব্যবহার করে একটি ২০-ক্যারেক্টারের পাসওয়ার্ডে প্রায় ১৩১ বিট এনট্রপি থাকে। সেই মাত্রায়, প্রতি সেকেন্ডে এক ট্রিলিয়ন অনুমান পরীক্ষা করা একটি ব্রুট-ফোর্স আক্রমণের প্রতিটি সমন্বয় চেষ্টা করতে মহাবিশ্বের বয়সের চেয়ে বেশি সময় লাগবে। গণিতটি সহজ: এনট্রপি = দৈর্ঘ্য × log2(ক্যারেক্টার সেটের আকার)।
NIST SP 800-63B-এর মতো মানদণ্ড কমপক্ষে ৮ ক্যারেক্টারের পাসওয়ার্ড সুপারিশ করে এবং যাচাইকারীর দ্বারা কোনো উপরের সীমা না রাখার পরামর্শ দেয়। এটি জোরপূর্বক কম্পোজিশন নিয়ম, যেমন ঠিক একটি প্রতীক প্রয়োজন, এর বিরুদ্ধে নিরুৎসাহিত করে এবং পরিবর্তে দীর্ঘ পাসফ্রেজকে প্রাধান্য দেয়। মেশিন-টু-মেশিন ক্রেডেনশিয়াল এবং সার্ভিস অ্যাকাউন্টের জন্য, একটি সম্পূর্ণ ক্যারেক্টার সেট থেকে নেওয়া ২০ বা তার বেশি র্যান্ডম ক্যারেক্টার অধিকাংশ নিরাপত্তা ফ্রেমওয়ার্ক এবং কমপ্লায়েন্স পদ্ধতিতে গৃহীত মান।
পাসওয়ার্ড জেনারেটর কেন ব্যবহার করবেন?
আমরা মানুষেরা আসলে ভালো র্যান্ডম নম্বর তৈরি করতে পারি না। আমরা পাসওয়ার্ড পুনরায় ব্যবহার করি, ডিকশনারির শব্দ বেছে নিই, অনুমানযোগ্য প্যাটার্নে অক্ষর বদলাই (a-এর জায়গায় @, e-এর জায়গায় 3) এবং ছোট পাসওয়ার্ড দিয়েই কাজ চালাই। একটি পাসওয়ার্ড জেনারেটর এই স্বাভাবিক মানবিক দুর্বলতা দূর করে।
পাসওয়ার্ড জেনারেটরের ব্যবহারের ক্ষেত্র
পাসওয়ার্ড এনট্রপি রেফারেন্স
এনট্রপি পরিমাপ করে একটি পাসওয়ার্ড কতটা অনুমানযোগ্য নয়। এটি log2(ক্যারেক্টার_সেটের_আকার ^ দৈর্ঘ্য) হিসেবে গণনা করা হয়। উচ্চ এনট্রপি মানে একজন আক্রমণকারীর অনুসন্ধানের জন্য আরও বেশি সম্ভাব্য সমন্বয়। NIST এবং OWASP উচ্চ-নিরাপত্তা অ্যাপ্লিকেশনের জন্য কমপক্ষে ৮০ বিট এনট্রপি সুপারিশ করে।
| দৈর্ঘ্য | ক্যারেক্টার সেট | এনট্রপি | ব্রুট-ফোর্স সময় |
|---|---|---|---|
| 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"
}