ابزار تولید و اعتبارسنجی رمز عبور

تولید رمزهای قوی و عبارات رمزی، با پشتیبانی از تولید انبوه، تضمین منحصر به فرد بودن، اعتبارسنجی قدرت و سیاست‌ها، همراه با نمونه‌های کد چندزبانه و دانش کاربردی.

سازنده رمز عبور

تعداد
انتخاب گروه‌های نمادها
راهنما: می‌توانید با انتخاب گروه یا کلیک مستقیم بر روی کاراکتر، آن را حذف کنید.
نتیجه

آزمون سیاست رمز عبور

نتایج
  • طول
  • حروف کوچک
  • حروف بزرگ
  • اعداد
  • نمادها
  • دنباله‌های متوالی
  • تکرارها
  • لیست سیاه
تمام بررسی‌ها در مرورگر شما به صورت محلی انجام می‌شوند.

تولیدکننده عبارت رمز

کلمات به صورت تصادفی و ایمن (Web Crypto) انتخاب می‌شوند. لیست کلمات نمونه به دلیل محدودیت حجم، کوتاه است.

جدول راهنمای هش رمز عبور

Argon2id
  • استفاده از Argon2id با تنظیم پارامترهای حافظه مناسب
  • تعداد تکرار ≥ 2، حافظه ≥ 64MB (با توجه به محیط بهینه‌سازی شود)
  • استفاده از نمک منحصر به فرد برای هر کاربر؛ استفاده اختیاری از pepper در لایه برنامه
PBKDF2
  • انتخاب SHA-256 یا SHA-512 با تکرار ≥ 210k (با توجه به نیاز بهینه‌سازی شود)
  • استفاده از نمک منحصر به فرد برای هر هش؛ پشتیبانی از ارتقاء پارامترها
  • انتقال به پارامترهای هزینه بالاتر هنگام ورود بعدی کاربر
BCrypt
  • هزینه 10–14، بسته به توانایی سرور
  • اجتناب از قطع کردن رمز عبور؛ هش‌سازی کامل رمز عبور
  • محدود کردن و نظارت بر نقاط احراز هویت
منبع: NIST SP 800-63B، OWASP ASVS. پارامترها باید با ظرفیت سخت‌افزار و SLO هماهنگ باشند.

ارزیابی قدرت رمز عبور

قدرت تقریبی از آنتروپی استخراج می‌شود: آنتروپی = log2(اندازه مجموعه کاراکترها) × طول. مجموعه کاراکترهای بزرگ‌تر و طول بیشتر، مقاومت در برابر حدس را افزایش می‌دهند.

  • ضعیف: < 50 بیت —— فقط مناسب برای سناریوهای یک‌بار مصرف یا ارزش پایین
  • متوسط: 50–80 بیت —— برای سناریوهای با ریسک پایین قابل قبول است
  • قوی: 80–110 بیت —— هدف پیش‌فرض توصیه‌شده
  • بسیار قوی: > 110 بیت —— مناسب برای حساب‌های مدیر یا حیاتی

نکته: مدل‌های حمله واقعی ممکن است متفاوت باشند؛ از تکرار رمز عبور جلوگیری کنید و احراز هویت دو مرحله‌ای (MFA) را فعال نمایید.

راهنمای استفاده

  • طول و مجموعه کاراکترها (حروف کوچک/بزرگ/اعداد/نمادها) را انتخاب کنید؛ در صورت لزوم، گزینه‌های 'اجتناب از کاراکترهای مشابه' و 'الزام وجود هر کاراکتر' را فعال کنید
  • برای کنترل دقیق‌تر: کاراکترها یا گروه‌های خاصی را حذف کنید یا گروه‌های نماد را انتخاب کنید
  • بر روی دکمه تولید کلیک کنید؛ برای تولید چندین رمز، تولید انبوه را فعال کنید و با یک کلیک تمامی رمزها را کپی کنید
  • برای اعتبارسنجی رمزهای موجود، از 'آزمون‌گر سیاست' استفاده کنید؛ برای تولید عبارات رمزی قابل به خاطر سپردن، از 'تولیدکننده عبارت رمزی' استفاده کنید

ویژگی‌ها

  • منبع تصادفی ایمن (Web Crypto)
  • مجموعه‌های کاراکتر و گروه‌های نماد قابل پیکربندی
  • فیلتر کاراکترهای مشابه و حذف سفارشی
  • تولید انبوه، تضمین منحصر به فرد بودن و آمار حذف تکرارها
  • شاخص‌های قدرت و آنتروپی
  • آزمون‌گر سیاست و تولیدکننده عبارت رمزی
  • نمونه‌های کد چندزبانه (JS、Python、PHP、Go、Java、C#、Rust)
  • کپی یک‌کلیکی (یک رمز / همه رمزها)

مثال‌های تولید رمز عبور

قوی (Strong)
طول 24، شامل حروف بزرگ/کوچک/اعداد/نمادها
قابل به خاطر سپردن (Memorable)
طول 16، شامل حروف بزرگ/کوچک/اعداد، اجتناب از کاراکترهای مشابه

پایگاه دانش رمز عبور

1) قدرت رمز عبور و آنتروپی
  • آنتروپی ≈ log2(اندازه مجموعه کاراکترها) × طول؛ تأثیر طول معمولاً بیشتر است
  • هدف پیشنهادی: حساب‌های معمولی ≥ 80 بیت؛ حساب‌های دارای دسترسی بالا/مالی ≥ 110 بیت
  • مجموعه کاراکترهای بزرگ‌تر + طول بیشتر → مقاوم‌تر در برابر حدس
2) طول در برابر پیچیدگی
  • افزودن بی‌رویه نمادها کمتر از افزایش طول مؤثر است
  • از الگوهای پیش‌پاافتاده و قابل پیش‌بینی (مانند همیشه «حروف بزرگ در ابتدا + عدد در انتها!») خودداری کنید
  • اولویت را به داشتن طول کافی بدهید، سپس به‌طور معتدل تنوع کاراکترها را افزایش دهید
3) اشتباهات رایج و الگوهای نادرست
  • دنباله‌های صفحه کلیدی (qwerty)، بلوک‌های تکراری، تاریخ تولد/سال و غیره به راحتی توسط قوانین پیش‌بینی می‌شوند
  • استفاده از «رمز اصلی + پسوند وب‌سایت» نوعی بازاستفاده از واریانت است که خطر را متمرکز می‌کند و آسان‌تر قابل حدس است
  • از استفاده مجدد از یک رمز عبور در وب‌سایت‌های مختلف خودداری کنید
4) پیشنهادات مدیریت رمز عبور
  • از مدیر رمز عبور استفاده کنید؛ هر سایت رمز منحصر به فرد داشته باشد؛ برای حساب‌های مهم، MFA را فعال کنید
  • از انتقال رمز عبور به صورت متن ساده در کانال‌های عمومی خودداری کنید؛ در صورت لزوم از «رمزهای دوستانه به صوت» استفاده کنید
  • در صورت کشف نشت یا بازاستفاده، فوراً آن را تغییر دهید و مطمئن شوید که منحصر به فرد است
5) راهنمای عبارات رمز (Passphrase)
  • ترکیب چند کلمه (۴–۶ کلمه) معمولاً قوی و به یاد ماندنی است
  • استفاده از جداکننده‌های متنوع، حروف بزرگ در ابتدا و درج اعداد، قدرت و خوانایی را افزایش می‌دهد
  • از اتصال مستقیم عبارات، آهنگ‌ها یا اقتباسات رایج خودداری کنید

راهنمای عملیات امنیتی رمز عبور

بهترین روش‌ها
  • از طول کافی استفاده کنید: حساب‌های معمولی حداقل 16 کاراکتر، حساب‌های حیاتی حداقل 24 کاراکتر
  • برای نیازهای حفظ‌شدنی، از عبارت‌های رمز استفاده کنید؛ رمزهای تصادفی و قوی را به مدیر رمز واگذار کنید
  • هرچه بیشتر ممکن است، احراز هویت چندعاملی (MFA) را فعال کنید
  • رمزهای خود را بین سایت‌های مختلف تکرار نکنید؛ هر حساب باید رمز منحصر به فرد خود را داشته باشد
آنتروپی و قدرت

آنتروپی بیانگر پیش‌بینی‌ناپذیری بر اساس طول و اندازه مجموعه کاراکترها است؛ تعداد بیت‌های آنتروپی بالاتر معمولاً به معنای قوت بیشتر است.

  • برای بهره‌وری حداکثری، اولویت را به افزایش طول بدهید
  • در صورت امکان، از مجموعه‌های متعدد کاراکتر استفاده کنید
  • حذف بیش از حد کاراکترها مجموعه کاراکترها را کوچک‌تر می‌کند و قوت را کاهش می‌دهد
سیاست‌ها و چرخش
  • به جای قوانین پیچیده ترکیب، به طول و لیست سیاه کردن رمزهای رایج/نشسته ترجیح دهید
  • از چرخش مکرر اجباری خودداری کنید؛ فقط در صورت نشت یا خطر، رمز را تغییر دهید
  • از لیست رمزهای نشت‌یافته برای جلوگیری از رمزهای رایج/نشسته استفاده کنید
عبارت‌های رمز
  • از 4–6 کلمه تصادفی با جداکننده‌هایی مانند lake-CARROT-planet_7 استفاده کنید
  • از عبارات رایج مانند اقتباسات یا آهنگ‌ها خودداری کنید؛ تصادفی بودن مهم‌تر از «هوشمندی» است
  • برای حساب‌های حیاتی، از مدیر رمز برای ذخیره رمزهای تصادفی با آنتروپی بالا استفاده کنید
پیشنهادات تنظیمات تولید
  • "Require each selected set" اطمینان می‌دهد که حداقل یک کاراکتر از هر مجموعه انتخاب‌شده وجود داشته باشد
  • "Avoid similar" خوانایی را افزایش می‌دهد، اما به طور جزئی مجموعه کاراکترها را کوچک‌تر می‌کند
  • نمادها را می‌توان به زیرمجموعه‌ای از نمادهای پذیرفته‌شده توسط سیستم هدف محدود کرد
ذخیره‌سازی سمت سرور
  • هرگز رمزها را به صورت متن ساده ذخیره نکنید؛ از هش قوی (Argon2id/PBKDF2/BCrypt) با نمک استفاده کنید
  • پارامترهای مناسب (حافظه/زمان/هزینه) را تنظیم کنید و در صورت لزوم از pepper استفاده کنید
  • سرعت را محدود کنید و تلاش‌های ناموفق را 모نیتور کنید؛ در صورت حمله، از CAPTCHA یا تأیید دستگاه استفاده کنید
احراز هویت چندعاملی و بازیابی
  • از TOTP/کلیدهای سخت‌افزاری اولویت دهید؛ تا حد امکان از SMS خودداری کنید
  • فرآیند بازیابی را محافظت کنید: از چند عامل یا تأیید ایمیل همراه با دوره سکوت استفاده کنید
  • کدهای بازیابی جایگزین ارائه دهید و کاربران را تشویق کنید آن‌ها را به‌خوبی نگهداری کنند
محافظت در برابر حملات شکستن تصادفی
  • از تأخیر تدریجی/قفل‌کردن و امتیازدهی ریسک IP/دستگاه استفاده کنید
  • WAF/محدودیت نرخ را برای API و فرم‌های ورود پیکربندی کنید
  • حملات تکراری را تشخیص دهید و کاربران را تشویق کنید از رمزهای منحصر به فرد استفاده کنند
ذخیره‌سازی و پردازش محلی
  • از مدیر رمز معتبر برای ذخیره‌سازی و پرکردن خودکار استفاده کنید
  • رمزها را از طریق چت یا ایمیل به صورت متن ساده به اشتراک نگذارید؛ برای تیم‌ها از ابزارهای مدیریت اسرار استفاده کنید
  • اگر نیاز به ثبت دستی دارید، از ایمنی فیزیکی اطمینان حاصل کنید
اعلامیه: این ابزار با استفاده از Web Crypto در مرورگر محلی رمز تولید می‌کند؛ هیچ داده‌ای به سرور ارسال نمی‌شود.

چگونه رمز عبور را از طریق زبان‌های برنامه‌نویسی تولید کنیم

JavaScript(Web Crypto)
function randomPassword(length = 16, sets = {lower:true, upper:true, digits:true, symbols:true}) {
  const pools = {
    lower: 'abcdefghijklmnopqrstuvwxyz',
    upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    digits: '0123456789',
    symbols: '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
  };
  let pool = '';
  for (const k of Object.keys(sets)) if (sets[k]) pool += pools[k];
  if (!pool) throw new Error('No charset');
  const bytes = new Uint32Array(length);
  crypto.getRandomValues(bytes);
  let out = '';
  for (let i = 0; i < length; i++) out += pool[bytes[i] % pool.length];
  return out;
}
Python(secrets)
import secrets

def random_password(length=16, lower=True, upper=True, digits=True, symbols=True):
    pools = {
        'lower': 'abcdefghijklmnopqrstuvwxyz',
        'upper': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'digits': '0123456789',
        'symbols': '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
    }
    pool = ''.join(v for k, v in pools.items() if locals()[k])
    if not pool:
        raise ValueError('No charset')
    return ''.join(secrets.choice(pool) for _ in range(length))
PHP(random_int)
function random_password($length = 16, $sets = ['lower'=>true,'upper'=>true,'digits'=>true,'symbols'=>true]) {
    $pools = [
        'lower' => 'abcdefghijklmnopqrstuvwxyz',
        'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'digits' => '0123456789',
        'symbols' => '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
    ];
    $pool = '';
    foreach ($sets as $k => $on) if ($on) $pool .= $pools[$k];
    if ($pool === '') throw new Exception('No charset');
    $out = '';
    for ($i = 0; $i < $length; $i++) {
        $out .= $pool[random_int(0, strlen($pool)-1)];
    }
    return $out;
}
Go(crypto/rand)
package main

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

func RandomPassword(length int, pool string) (string, error) {
  out := make([]byte, length)
  for i := 0; i < length; i++ {
    nBig, err := rand.Int(rand.Reader, big.NewInt(int64(len(pool))))
    if err != nil { return "", err }
    out[i] = pool[nBig.Int64()]
  }
  return string(out), nil
}
Java(SecureRandom)
import java.security.SecureRandom;

public class Pw {
  static final String POOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
  static final SecureRandom SR = new SecureRandom();
  static String randomPassword(int length) {
    StringBuilder sb = new StringBuilder(length);
    for (int i = 0; i < length; i++) {
      int idx = SR.nextInt(POOL.length());
      sb.append(POOL.charAt(idx));
    }
    return sb.toString();
  }
}
C#(.NET RandomNumberGenerator)
using System;
using System.Security.Cryptography;

public static class Pw {
  public static string RandomPassword(int length, string pool) {
    using var rng = RandomNumberGenerator.Create();
    var bytes = new byte[length];
    rng.GetBytes(bytes);
    var chars = new char[length];
    for (int i = 0; i < length; i++) {
      chars[i] = pool[bytes[i] % pool.Length];
    }
    return new string(chars);
  }
}
Rust(rand + getrandom)
use rand::rngs::OsRng;
use rand::RngCore;

fn random_password(length: usize, pool: &str) -> String {
    let mut bytes = vec![0u8; length];
    OsRng.fill_bytes(&mut bytes);
    let chars: Vec = pool.chars().collect();
    bytes
        .iter()
        .map(|b| chars[(*b as usize) % chars.len()])
        .collect()
}

fn main() {
    let pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
    let pw = random_password(16, pool);
    println!("{}", pw);
}