Password Hashing در وردپرس چطور امنیت را تضمین می‌کند؟ Password Hashing (هش کردن رمز عبور) فرآیند تبدیل رمز عبور به یک رشته غیرقابل برگشت است که حتی در صورت افشای دیتابیس، امکان بازیابی رمز اصلی وجود ندارد. در بستر وردپرس، این فرآیند از طریق کتابخانه phpass (Portable PHP Password Hashing Framework) و کلاس PasswordHash پیاده‌سازی شده است که از الگوریتم‌های قابل تنظیم مانند bcrypt و Blowfish پشتیبانی می‌کند. برخلاف ذخیره‌سازی رمز عبور به‌صورت متن ساده یا MD5، هش کردن در وردپرس از salt خودکار، تکرار (iteration)، و الگوریتم‌های مقاوم در برابر حمله استفاده می‌کند. از نسخه ۵.۵ وردپرس، تابع wp_hash_password() با الگوریتم bcrypt به‌روزرسانی شد و پارامتر wp_hash_password_algorithm امکان انتخاب الگوریتم را فراهم می‌کند. مزیت‌های اصلی شامل مقاومت در برابر brute force، rainbow table، و timing attack است. چالش‌ها شامل محدودیت طول رمز عبور، مدیریت migration الگوریتم‌ها، و سازگاری با افزونه‌های احراز هویت است. در این نوشتار، از مکانیزم فنی هش کردن در وردپرس تا پیاده‌سازی حرفه‌ای و نکات امنیتی را بررسی می‌کنیم.

نخستین‌باری که با فرآیند هش کردن رمز عبور در وردپرس به‌طور عمیق آشنا شدم، بعد از یک پروژه امنیتی بود که در آن یک افزونه سفارشی، رمز عبور را با MD5 ذخیره می‌کرد. آن تجربه، تفاوت بین ذخیره‌سازی امن و ناامن را به‌وضوح نشان داد. از آن زمان، به موضوع هش کردن رمز عبور به‌عنوان یکی از پایه‌های امنیت وردپرس نگاه می‌کنم. در این نوشتار، تجربه‌های عملی را با شما به اشتراک می‌گذارم.

Password Hashing چیست و چه مسئله‌ای را حل می‌کند؟

Password Hashing (هش کردن رمز عبور) فرآیند تبدیل رمز عبور به یک رشته با طول ثابت با استفاده از یک تابع یک‌طرفه است. این فرآیند به‌گونه‌ای طراحی شده که بازگشت از هش به رمز اصلی عملاً غیرممکن باشد. برخلاف رمزنگاری (Encryption) که برگشت‌پذیر است، هش کردن یک‌طرفه است.

مسئله اصلی که هش کردن حل می‌کند، حفاظت از رمز عبور در صورت افشای دیتابیس است. اگر رمز عبور به‌صورت متن ساده ذخیره شود و دیتابیس هک شود، همه رمزها افشا می‌شوند. با هش کردن، مهاجم فقط یک رشته بی‌معنا می‌بیند و نمی‌تواند رمز اصلی را بازیابی کند. برای درک عمیق‌تر امنیت، اصول امنیت وب را ببینید.

سه ویژگی کلیدی یک تابع هش امن:

  • یک‌طرفه بودن: بازگشت از هش به رمز اصلی ممکن نیست.
  • مقاومت در برابر تصادم: دو ورودی متفاوت، هش یکسان تولید نمی‌کنند.
  • کندی محاسباتی: محاسبه هش زمان‌بر است تا brute force دشوار شود.
  • Salt منحصر: هر رمز عبور، salt منحصربه‌فرد دارد.

برای درک عمیق‌تر احراز هویت، Password Hashing در وردپرس را ببینید.

هش کردن رمز عبور یک «صندوق پول فلزی» است: حتی اگر کلید را پیدا کنید، نمی‌توانید محتوای آن را ببینید. اما این صندوق باید به‌قدری سنگین باشد که شکستن آن زمان‌بر شود.

چرا هش کردن رمز عبور حیاتی است؟

هش کردن رمز عبور در چند لایه حیاتی است:

  • حفاظت از کاربران در افشای دیتابیس: در صورت هک، رمزها قابل بازیابی نیستند.
  • جلوگیری از سوءاستفاده چندسایتی: کاربران معمولاً یک رمز در چند سایت دارند.
  • مطابقت با استانداردها: GDPR، PCI DSS و OWASP هش کردن را الزامی می‌کنند.
  • کاهش liability قانونی: در صورت افشا، سازمان مسئولیت کمتری دارد.
  • حفاظت از اعتبار برند: افشای رمز عبور، اعتماد کاربران را از بین می‌برد.
  • مقاومت در برابر حملات داخلی: حتی ادمین دیتابیس هم نمی‌تواند رمز را ببیند.

در پروژه‌های واقعی که بازبینی کرده‌ام، سایت‌هایی که از هش کردن امن استفاده می‌کنند، در صورت هک، خسارت کمتری را تجربه کرده‌اند. برای درک عمیق‌تر، امنیت وردپرس را ببینید.

مکانیزم هش کردن در وردپرس

وردپرس از کتابخانه phpass برای هش کردن رمز عبور استفاده می‌کند. این کتابخانه توسط Openwall توسعه یافته و در مخزن GitHub منتشر شده است. مکانیزم آن به این شکل است:

  1. رمز عبور با یک salt تصادفی ترکیب می‌شود.
  2. الگوریتم هش (bcrypt یا Blowfish) با تعداد iteration مشخص اجرا می‌شود.
  3. خروجی به‌صورت یک رشته شامل الگوریتم، iteration، salt، و هش ذخیره می‌شود.

نکته مهم: خروجی phpass شامل همه اطلاعات لازم برای بررسی است، بنابراین نیازی به ذخیره جداگانه salt نیست. برای درک عمیق‌تر دیتابیس، مدیریت دیتابیس وردپرس را ببینید.

phpass و کلاس PasswordHash

کتابخانه phpass یک کلاس به نام PasswordHash ارائه می‌دهد که در وردپرس در فایل wp-includes/class-phpass.php قرار دارد. یک نمونه استفاده:

require_once ABSPATH . WPINC . '/class-phpass.php';
$hasher = new PasswordHash( 8, true );

$hash = $hasher->HashPassword( 'my-password' );
$check = $hasher->CheckPassword( 'my-password', $hash );
// $check برابر true است اگر رمز صحیح باشد

پارامتر اول (8) تعداد iteration است که هرچه بالاتر باشد، هش قوی‌تر و کندتر است. پارامتر دوم (true) استفاده از bcrypt را فعال می‌کند. برای درک عمیق‌تر ساختار وردپرس، ساختار هسته وردپرس را ببینید.

bcrypt و الگوریتم‌های مدرن

bcrypt یکی از الگوریتم‌های هش مدرن است که در وردپرس ۵.۵ به بعد به‌طور پیش‌فرض استفاده می‌شود. ویژگی‌های bcrypt:

ویژگیتوضیح
Salt خودکارهر هش، salt منحصربه‌فرد دارد
تنظیم کندیپارامتر cost (۴ تا ۳۱)
مقاومت در برابر GPUطراحی برای کندی در سخت‌افزار
طول خروجی۶۰ کاراکتر

الگوریتم‌های دیگر که ممکن است در وردپرس استفاده شوند:

  • Argon2: برنده مسابقه Password Hashing در ۲۰۱۵، مقاوم در برابر GPU و side-channel.
  • scrypt: مقاوم در برابر ASIC، مناسب برای سرورهای بزرگ.
  • PBKDF2: استاندارد NIST، اما ضعیف‌تر از bcrypt و Argon2.

برای درک عمیق‌تر، نوشتن کد PHP امن برای وردپرس را ببینید.

نقش Salt و Iteration

Salt و iteration دو عنصر کلیدی در امنیت هش هستند:

Salt

Salt یک رشته تصادفی است که به رمز عبور اضافه می‌شود تا هش هر کاربر منحصربه‌فرد باشد. مزیت Salt:

  • جلوگیری از rainbow table (جدول از پیش محاسبه‌شده).
  • جلوگیری از تشخیص رمزهای مشابه.
  • افزایش فضای جست‌وجو برای مهاجم.

Iteration

Iteration تعداد دفعات اجرای الگوریتم هش است. مزیت iteration:

  • افزایش زمان لازم برای هر تلاش brute force.
  • کاهش سرعت حمله با سخت‌افزار قدرتمند.
  • قابلیت تنظیم بر اساس سخت‌افزار سرور.

در وردپرس ۵.۵ به بعد، پارامتر wp_hash_password_algorithm امکان انتخاب الگوریتم را فراهم می‌کند. برای درک عمیق‌تر، نوشتن کد PHP امن را ببینید.

توابع هش کردن در وردپرس

وردپرس چند تابع اصلی برای هش کردن رمز عبور ارائه می‌دهد:

تابعکاربرد
wp_hash_password()هش کردن رمز عبور
wp_check_password()بررسی رمز عبور با هش
wp_set_password()تنظیم رمز عبور جدید و هش کردن آن
wp_generate_password()تولید رمز عبور تصادفی

یک نمونه استفاده:

$hash = wp_hash_password( 'my-password' );
if ( wp_check_password( 'my-password', $hash ) ) {
    // رمز صحیح است
}

// تنظیم رمز جدید
wp_set_password( 'new-password', $user_id );

نکته مهم: توابع wp_hash_password و wp_check_password به‌طور خودکار از الگوریتم صحیح استفاده می‌کنند و نیازی به پیاده‌سازی دستی نیست. برای درک عمیق‌تر، تقویت احراز هویت وردپرس را ببینید.

مهاجرت از الگوریتم‌های قدیمی

اگر سایت شما از نسخه‌های قدیمی وردپرس استفاده می‌کند، ممکن است رمزهای عبور با الگوریتم‌های ضعیف (مانند MD5) ذخیره شده باشند. وردپرس به‌طور خودکار هنگام ورود کاربر، الگوریتم قدیمی را به الگوریتم مدرن ارتقا می‌دهد. این فرآیند به نام «rehash» شناخته می‌شود:

// وردپرس به‌طور خودکار در wp_check_password انجام می‌دهد
function wp_check_password( $password, $hash, $user_id = '' ) {
    global $wp_hasher;
    
    if ( empty( $wp_hasher ) ) {
        require_once ABSPATH . WPINC . '/class-phpass.php';
        $wp_hasher = new PasswordHash( 8, true );
    }
    
    $check = $wp_hasher->CheckPassword( $password, $hash );
    
    if ( $check && $user_id && $wp_hasher->PasswordNeedsRehash( $hash ) ) {
        wp_set_password( $password, $user_id );
    }
    
    return $check;
}

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

مزیت‌های امنیتی هش کردن

هش کردن رمز عبور چند مزیت امنیتی اساسی فراهم می‌کند:

  • مقاومت در برابر brute force: هر تلاش، زمان‌بر است.
  • مقاومت در برابر rainbow table: Salt هر هش را منحصربه‌فرد می‌کند.
  • مقاومت در برابر timing attack: توابع امن مانند hash_equals استفاده می‌شوند.
  • عدم افشای رمز اصلی: حتی در افشای دیتابیس، رمز قابل بازیابی نیست.
  • مقاومت در برابر GPU و ASIC: الگوریتم‌های مدرن برای سخت‌افزار طراحی شده‌اند.
  • سازگاری با استانداردها: GDPR و OWASP توصیه می‌کنند.

در پروژه‌های واقعی که بررسی کرده‌ام، سایت‌هایی که از هش کردن امن استفاده می‌کنند، در صورت افشای دیتابیس، خسارت کمتری را تجربه کرده‌اند. برای درک عمیق‌تر، پاک‌سازی سایت هک‌شده را ببینید.

حملات رایج علیه رمز عبور

چند حمله رایج علیه رمز عبور وجود دارد که هش کردن در برابر آن‌ها محافظت می‌کند:

حملهروشنقش هش کردن
Brute Forceتلاش همه ترکیب‌هاکندی محاسبه، زمان را زیاد می‌کند
Rainbow Tableجدول از پیش محاسبهSalt، جدول را بی‌فایده می‌کند
Dictionaryاستفاده از رمزهای رایجکندی، حمله را دشوار می‌کند
Timing Attackتحلیل زمان پاسختوابع امن زمان پاسخ ثابت دارند
Credential Stuffingاستفاده از رمزهای افشاشدهبه هش کردن مرتبط نیست

برای درک عمیق‌تر، جلوگیری از حملات brute force را ببینید.

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

  • استفاده از MD5 یا SHA1: الگوریتم‌های قدیمی و ناامن.
  • عدم استفاده از Salt: rainbow table کار می‌کند.
  • Salt ثابت برای همه: مزیت salt را از بین می‌برد.
  • Iteration پایین: حمله را آسان می‌کند.
  • ذخیره رمز عبور در لاگ: نقض مستقیم امنیت.
  • استفاده از تابع اشتباه برای timing: باید از hash_equals استفاده شود.
  • پیاده‌سازی دستی هش کردن: به‌جای توابع وردپرس.
  • عدم به‌روزرسانی الگوریتم: با گذشت زمان، الگوریتم‌ها ضعیف می‌شوند.
  • نادیده گرفتن rehash: کاربران قدیمی با الگوریتم قدیمی باقی می‌مانند.
  • ذخیره‌سازی رمز در کوکی: هرگز نباید رمز عبور در کوکی ذخیره شود.

برای مرور خطاهای مشابه، اشتباهات رایج در احراز هویت را ببینید.

پرسش‌های پرتکرار درباره Password Hashing

Password Hashing چیست و چه کاربردی دارد؟ فرآیند یک‌طرفه تبدیل رمز عبور به رشته غیرقابل برگشت که در افشای دیتابیس، رمز اصلی قابل بازیابی نباشد.

وردپرس از چه الگوریتمی برای هش کردن استفاده می‌کند؟ از نسخه ۵.۵ به بعد، الگوریتم پیش‌فرض bcrypt است. کتابخانه phpass این پیاده‌سازی را فراهم می‌کند.

تفاوت MD5 و bcrypt چیست؟ MD5 سریع و ناامن است؛ bcrypt کند، با salt خودکار، و مقاوم در برابر GPU.

آیا هش کردن به‌تنهایی برای امنیت کافی است؟ نه، باید با 2FA، HTTPS، و سایر لایه‌های امنیتی ترکیب شود. برای مرور، تقویت احراز هویت وردپرس را ببینید.

چطور بفهمم رمزهای سایت من با چه الگوریتمی هش شده‌اند؟ طول هش را بررسی کنید. bcrypt خروجی ۶۰ کاراکتری دارد؛ MD5 خروجی ۳۲ کاراکتری.

آیا هش کردن روی عملکرد سایت تأثیر دارد؟ فقط در زمان ورود یا ثبت‌نام. تأثیر آن در ترافیک عادی ناچیز است.

چطور رمز عبور را در وردپرس تغییر دهم؟ با wp_set_password() یا از پیشخوان. برای درک عمیق‌تر، امن‌سازی ورود ادمین را ببینید.

برای مطالعه بیشتر درباره هش کردن رمز عبور، صفحه Cryptographic hash function در ویکی‌پدیا مفید است.

خط پایان

Password Hashing در وردپرس یکی از آن لایه‌های امنیتی است که در سایه XSS و SQL Injection کمتر دیده می‌شود، اما در واقع «قفل اصلی» حفاظت از رمز عبور است. در صورت افشای دیتابیس، هش کردن تفاوت بین فاجعه و یک حادثه کنترل‌شده را می‌سازد. وردپرس از کتابخانه phpass و الگوریتم bcrypt استفاده می‌کند که استانداردهای امنیتی را رعایت می‌کند. اما توسعه‌دهندگان افزونه‌ها باید از پیاده‌سازی دستی خودداری کنند و از توابع وردپرس استفاده نمایند. اگر سایت شما از نسخه‌های قدیمی وردپرس استفاده می‌کند یا افزونه‌ای دارید که رمز عبور را به‌طور غیراستاندارد ذخیره می‌کند، همین امروز بازبینی کنید.

اگر در پروژه‌ای با موضوع هش کردن رمز عبور روبه‌رو شده‌اید یا راهکار متفاوتی پیاده کرده‌اید، تجربه خود را در دیدگاه‌ها بنویسید؛ به‌خصوص اگر مهاجرت از الگوریتم قدیمی انجام داده‌اید، این اطلاعات برای خواننده بعدی بسیار ارزشمند است.