ویژگی تصویر

تابع md5() در PHP

  /  PHP   /  تابع md5() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع md5() در PHP یکی از شناخته‌شده‌ترین توابع هش (hash) است که مقدار هش 128 بیتی را به صورت رشته‌ای 32 حرفی هگزادسیمال بازمی‌گرداند. این تابع برای تولید شناسه‌های کنترل‌نشده (checksums)، تشخیص تغییر در داده‌ها و برخی کاربردهای غیرامنیتی مفید است. با این حال باید به محدودیت‌ها و ریسک‌های امنیتی آن نیز آگاه بود.

امضای تابع و پارامترها

امضای تابع به شکل زیر است:

string md5 ( string $str [, bool $raw_output = false ] )

اگر پارامتر دوم true باشد، خروجی به صورت باینری 16 بایتی بازمی‌گردد و معمولاً برای ذخیره یا پردازش کم‌حجم استفاده می‌شود. در حالت پیش‌فرض خروجی به صورت رشته هگزادسیمال 32 کاراکتری است.

نمونه ساده: هش متن

$text = "hello world";
$hash = md5($text);
echo $hash; // 5eb63bbbe01eeed093cb22bb8f5acdc3

در این مثال تابع md5 مقدار هش متن “hello world” را محاسبه و چاپ می‌کند. این مقدار هر بار که همان ورودی داده شود، یکسان خواهد بود.

خروجی باینری و تبدیل به هگز

$binary = md5("data", true); // خروجی باینری 16 بایتی
$hex = bin2hex($binary); // تبدیل به هگز اگر نیاز باشد
echo strlen($binary); // 16
echo strlen($hex); // 32

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

محاسبه هش فایل

$fileHash = md5_file("/path/to/file.zip");
if ($fileHash === false) {
    echo "خطا در خواندن فایل";
} else {
    echo $fileHash;
}

تابع md5_file برای محاسبه هش از یک فایل کاربردی و سریع است. برای بررسی سالم بودن دانلودها یا تشخیص تغییرات در فایل‌ها می‌توان از آن استفاده کرد.

موارد کاربرد مناسب

  • چک‌سام ساده برای بررسی تغییرات غیرحساس در فایل‌ها یا دیتابیس.
  • ایندکس‌گذاری یا دسته‌بندی سریع داده‌ها در شرایطی که امنیت مهم نیست.
  • تولید شناسه‌های کوتاه غیرقطعی برای URLهای کوتاه یا کش (با آگاهی از احتمال برخورد).

محدودیت‌ها و هشدارهای امنیتی

md5 دیگر برای استفاده در مسائل امنیتی مانند ذخیره پسورد یا امضای دیجیتال مناسب نیست. ایرادات اصلی:

  • قابلیت ایجاد “تصادم” (collision) — دو ورودی مختلف می‌توانند هش یکسان داشته باشند.
  • سرعت بالا و امکان حملات brute-force یا جداول Rainbow برای بازیابی ورودی از هش.

بنابراین برای ذخیره پسورد باید از password_hash() و password_verify() در PHP استفاده کنید، و برای تضمین یکپارچگی همراه با کلید مخفی از hash_hmac یا الگوریتم‌های قوی‌تر مانند SHA-256 استفاده کنید.

مثال نادرست: استفاده از md5 برای پسورد

// نازیبا و ناامن — نباید استفاده شود
$pass = $_POST['password'];
$hash = md5($pass);
mysqli_query($conn, "INSERT INTO users (username, password) VALUES ('$u', '$hash')");

این روش آسیب‌پذیر است و در برابر حملات ساده و جداول از پیش محاسبه‌شده مقاومتی ندارد.

راه‌حل امن برای رمز عبور

// روش پیشنهادی
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
if (password_verify($_POST['password'], $hash)) {
    // ورود موفق
}

password_hash از الگوریتم‌های مقاوم در برابر brute-force با salt داخلی استفاده می‌کند و بهترین روش برای ذخیره رمز عبور در PHP است.

استفاده‌های امن از md5 و جایگزین‌ها

  • اگر فقط نیاز به چک‌سام سریع دارید و امنیت موضوع اولویت نیست، md5 قابل‌قبول است.
  • برای یکپارچگی با کلید مخفی از hash_hmac(‘md5’, $data, $key) استفاده کنید؛ اما برای امنیت بهتر hash_hmac با sha256 یا sha512 توصیه می‌شود.
  • برای تشخیص تغییرات در فایل‌های بزرگ یا تولید شناسه یکتا در سیستم‌های توزیع‌شده از الگوریتم‌های قوی‌تر و UUID استفاده کنید.

مثال: استفاده از hash_hmac به‌جای md5 ساده

$data = "important data";
$key = "secret-key";
$mac = hash_hmac('sha256', $data, $key);
echo $mac;

در این مثال از hash_hmac با sha256 استفاده شده که در مقایسه با md5 امنیت بالاتری دارد و در مقابل تغییرات و جعل محافظت بیشتری ارائه می‌دهد.

مقایسه سریع: md5 در برابر الگوریتم‌های دیگر

الگوریتمطول خروجیامنیت پیشنهادیکاربرد مناسب
MD5128 بیت (32 کاراکتر هگز)ضعیف — غیرمناسب برای امنیتچک‌سام ساده، تشخیص تغییرات غیرحساس
SHA-1160 بیتضعیف تا متوسط — بهتر از MD5 اما هنوز مشکل داردتاریخچه و سازگاری، ولی بهتر جایگزین شود
SHA-256256 بیتقوی — مناسب برای اکثر کاربردهای امنیتیامضای داده، HMAC، یکپارچگی امن

نکات عملی و بهترین شیوه‌ها

  • برای مقایسه هش‌ها از === یا بهتر از آن از hash_equals استفاده کنید تا در برابر حملات زمان‌بندی (timing attacks) ایمن‌تر باشید.
  • هیچ‌گاه md5 را برای پسورد یا توکن‌های حساس استفاده نکنید.
  • اگر به سرعت و مصرف کم حافظه نیاز دارید و امنیت اولویت نیست، md5 گزینه‌ای سبک است.
  • برای سازگاری با سیستم‌های بیرونی و ابزارهای استاندارد از تابع hash() با الگوریتم‌های به‌روز استفاده کنید.

مثال مقایسه امن با hash_equals

$a = md5("value1");
$b = md5("value2");
if (hash_equals($a, $b)) {
    echo "equal";
} else {
    echo "not equal";
}

hash_equals مقایسه‌ای مقاوم در برابر حملات زمان‌بندی انجام می‌دهد و برای مقایسه رشته‌های هش‌شده مناسب است.

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

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: